On Sunday, 12 July 2015 at 09:03:25 UTC, Tofu Ninja wrote:
On Sunday, 12 July 2015 at 08:47:37 UTC, ketmar wrote:
On Sun, 12 Jul 2015 08:38:00 +0000, Tofu Ninja wrote:

Is it even possible?

what do you mean?

Sorry, thought the title was enough.

The context for a delegate(assuming not a method delegate) is allocated by the GC. Is there any way to allocate the context manually.

Yes:

========================
class Foo
{
    void bar(){writeln(__PRETTY_FUNCTION__);}
}

auto uncollectedDelegate(T, string name)(ref T t)
{
    import std.experimental.allocator.mallocator;
    struct Dg{void* ptr, funcptr;}

    void* funcptr = &__traits(getMember, T, name);
    void* ptr = cast(void*)t;

    Dg* dg = cast(Dg*) Mallocator.instance.allocate(Dg.sizeof);
    dg.ptr = ptr;
    dg.funcptr = funcptr;
    return dg;
}

void main(string[] args)
{
    Foo foo = new Foo;
    auto dg = uncollectedDelegate!(Foo, "bar")(foo);
    auto tdg = cast(void delegate()*) dg;
    (*tdg)();
}
========================

with just a type __traits(getMember,...) on a delegate will only return the function address in the process image. so without the context ptr, just like a static or a global function. Later you set the context by hand, using a pointer to an instance.


Reply via email to