[core.reflect] preview release

Gavin Ray user at example.com
Thu Oct 14 19:10:24 UTC 2021


On Monday, 11 October 2021 at 11:43:14 UTC, Stefan Koch wrote:
> Good day to you.
>
> I have decided to release a preview binary for core.reflect.
> And I am including the low-level-runtime.
>
> Cheers,
>
> And let me know how you like it.

Wow, this is great! Just ran the demo on WSL2.

There are many uses for it. Off the top of my head, recently 
Rikki wrote for me a mixin which generated a C ABI for any D 
class. This could be used in a similar way to generate wrappers 
very easily I imagine.

It could probably be useful for IDE tooling as well.

```d
mixin template CWrapper(Type) {
     import std.traits;

     export extern(C):

     pragma(mangle, "create_" ~ __traits(identifier, Type))
     void* creator(Parameters!(Type.__ctor) args) {
         return cast(void*)new Type(args);
     }

     mixin(() {
         string ret;

         foreach(m; __traits(allMembers, Type)) {
             static if (m != "__ctor" && m != "__dtor" && 
isFunction!(__traits(getMember, Type, m))) {
                 ret ~= `ReturnType!(__traits(getMember, Type, "` 
~ m ~ `")) ` ~ __traits(identifier, Type) ~ `_` ~ m ~ `(void* 
obj, Parameters!(__traits(getMember, Type, "` ~ m ~ `")) args) { 
return (cast(Type)obj).` ~ m ~ `(args); }`;
             }
         }

         return ret;
     }());
}

class Foo {
     int x;
     this(int x) { this.x = x; }
     int getX() { return x; }
}
mixin CWrapper!(Foo);

// GENERATED CODE:
extern(C) {
     void* create_Foo(int); // returns void* to Foo instance
     int Foo_getX(void*); // takes void* to Foo instance
}
```




More information about the Digitalmars-d mailing list