The "no gc" crowd

Adam D. Ruppe destructionator at gmail.com
Tue Oct 8 10:02:49 PDT 2013


On Tuesday, 8 October 2013 at 16:24:05 UTC, Dicebot wrote:
> Runtime check is almost useless for this.

They're how I do most the allocation checks now and could also be 
put in unit tests.

But I agree the ideal would be a compile time check. The way I 
want it to work is to define a new thing in the language, maybe 
via __traits, that can recursively check the call graph of a 
function for the presence of any UDA.

Then we attach @gc to the druntime functions that use them, 
starting at gc_malloc and right up into aaDup, d_newclass, 
whatever concat is called.

Ensure that the compiler considers these implicit function calls 
the same as any others and propagates the druntime UDA through 
the recursive trait.

Then we define @nogc to just be static assert(!hasAttribute!(gc, 
__traits(getAttributesRecursively, FUNCTION)). Maybe do a 
compiler or druntime change to @something can be expanded to a 
template instantation too so this doesn't even have to be a 
specific builtin. (Though I've actually been able to do this by 
hacking druntime before.) But whatever that specific impl doesn't 
matter.



Bottom line: @nogc works after just marking the core functions in 
druntime that may allocate, and the very same functionality can 
be used for other things too, like @noheap. Mark malloc with a 
uda, then define noheap as static assert(!gc && !malloc)

Then we have compile time checking, at least on the function 
level.


More information about the Digitalmars-d mailing list