Libraries that are both nogc and gc?

Ola Fosheim Grøstad ola.fosheim.grostad at gmail.com
Sat Nov 21 12:14:58 UTC 2020


Let's assume that all the useful D constructs like class objects, 
dynamic arrays, associative arrays, delegates, exceptions are 
allocated with a reference count at a negative offset (which can 
be optimized away during static analysis).

Then it should be possible to write library code that supports 
both gc and nogc. It seems to me that this would be possible if:

- all functions are templated behind the scenes with a hidden 
template parameter "allocator_strategy". This parameter is 
inherited from the calling context unless it is explicitly set.

- library aggregates (classes structs) have to use a specific 
notation for owning pointers and nonowning pointers. This will 
also speed up GC collection if the collector is precise (it does 
not have to follow nonowning pointers).

If the context is "allocator_gc" then it will just use raw 
pointers, and mark the ones that are owning for tracing and also 
be careful about using gc_root IR intrinsics when calling 
C-functions to makes sure that the pointer is live during the 
function call.

If the context is "allocator_arc" then it will use an ARC pointer 
and emit acquire/release (retain/release) intrinsics at the IR 
level (or AST).

If the context is "allocator_bump" then it will just emit C-like 
code.

Please note that this is static, not dynamic, so it should yield 
efficient code.



More information about the Digitalmars-d mailing list