digitalmars.D - Proof of concept/proposal: reference counted closures/delegates
- Jakob Ovrum (28/28) Nov 10 2015 I wrote a proof of concept that explores how we could support
- Dominikus Dittes Scherkl (2/3) Nov 11 2015 Cool!
I wrote a proof of concept that explores how we could support
fully featured reference counted closures:
https://gist.github.com/JakobOvrum/69e64d82bcfed4c114a5
The proof_of_concept code path is just to show that the `scope`
trick works.
The with_new_trait code path proposes a new trait
__traits(upvalues, func) which takes an alias to a function and
returns an alias sequence describing the function's upvalues:
(T1, ptrdiff_t offset1, T2, ptrdiff_t offset2, ...)
Where each pair is the type of the upvalue and the upvalue's
offset in bytes from the context pointer, which can be negative.
This trait allows the library code to properly postblit and
destroy upvalues, as well as being a reliable way to get the
required size of the closure.
The benefit of this approach is that it should work as a drop-in
replacement for delegates, whether they're nested/anonymous
functions or member functions. One difference from delegates is
that conversion between functions of different attributes has to
be explicit (with the constructor and opAssign).
It shares the downside with delegates that upvalues aren't packed
together, so while the proposed trait *can* be used to make
C++-style value-type closures, they would carry junk in between
the upvalues.
As for the example implementation, I have more ideas to improve
it, particularly regarding attribute propagation and code bloat
elimination, but I'd rather do that if the new trait is
implemented.
Any thoughts?
Nov 10 2015
On Wednesday, 11 November 2015 at 01:27:46 UTC, Jakob Ovrum wrote:Any thoughts?Cool!
Nov 11 2015








Dominikus Dittes Scherkl <Dominikus.Scherkl continental-corporation.com>