Introspection/Reflection/etc on Linux

Jacob Carlborg doob at me.com
Wed Oct 19 01:21:19 PDT 2011


On 2011-10-18 18:48, J Arrizza wrote:
> I'm trying to write some sample code to:
>    1 create an object via it's name
>    2 search an object for it's functions
>    3 call a static function in a class
>    4 call a non-static function in an object
>
> #1, #2 and #3 were straightforward. But  #4 looks like it's not possible
> in DMD 2.0.
>
> I found this:
>
> http://www.digitalmars.com/d/archives/digitalmars/D/announce/Runtime_reflection_9949.html
>
> which implies #4 is doable in Windows but not Linux. I'm using Linux
> 64-bit Ubuntu.
>
> Any other avenues I can chase?
>
> TIA,
> John

How about doing something like this:

class Foo
{
     void bar ()
     {
         writeln("bar");
     }
}

void main ()
{
     auto foo = new Foo;

     auto members = __traits(derivedMembers, Foo);
     void delegate () dg;

     foreach (i, m ; members)
         if (m == "bar")
             dg.funcptr = cast(void function()) foo.classinfo.vtbl[i + 6];

     dg.ptr = cast(void*) foo;
     dg();
}



-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list