The cost of doing compile time introspection

Moritz Maxeiner via Digitalmars-d digitalmars-d at puremagic.com
Thu May 11 13:01:03 PDT 2017


On Wednesday, 10 May 2017 at 14:03:58 UTC, Biotronic wrote:
>
> As for making the code faster right now, could this be done 
> with mixin templates instead?
>
> Something like:
>
> import functions = llvm.functions.link;
> import std.meta, std.traits;
>
> template isCFunction(alias member)
> {
>     static if (isFunction!(member) &&
>                (functionLinkage!(member) == "C" ||
>                 functionLinkage!(member) == "Windows")) {
>         enum isCFunction = true;
>     } else {
>         enum isCFunction = false;
>     }
> }
>
> template CFunctions(alias scope_)
> {
>     alias GetSymbol(string member) = 
> AliasSeq!(__traits(getMember, scope_, member));
>     alias CFunctions = Filter!(isCFunction, 
> staticMap!(GetSymbol, __traits(allMembers, scope_)));
> }
>
> mixin template declareStubsImpl(T...)
> {
>     static if (T.length == 0) {
>     } else {
>         mixin("extern (C) typeof(T[0])* "~__traits(identifier, 
> T[0])~";");
>         mixin declareStubsImpl!(T[1..$]);
>     }
> }
>
> mixin template declareStubs(alias scope_)
> {
>     mixin declareStubsImpl!(CFunctions!scope_);
> }
>
> mixin declareStubs!functions;

After testing this approach out, I couldn't even time it. Why? 
Because the compiler pretty much immediately hits the (I think 
fixed) recursive template expansion limit. The LLVM C API has too 
many functions for this :/


More information about the Digitalmars-d mailing list