One minute to twelve: last chance to fix D2 ABI?

Max Samukha spambox at d-coding.com
Wed Mar 3 07:25:13 PST 2010


On 03.03.2010 5:51, dsimcha wrote:
> I consider the function-delegate thing a reasonably solved problem, starting in
> the next release of Phobos.  See:
>
> http://dsource.org/projects/phobos/changeset/1428

Your code works only if return/parameter types are accessible from 
std.functional. An implementation that handles any types is way more 
complex.

You'll have to extract storage classes from the function pointer type 
and then reconstruct the delegate type using those extracted storage 
classes combined with the parameter types as elements of the parameter 
type tuple. An example demonstrating what is meant:

auto toDelegate(F)(F fp) {
     ...
     alias ParameterTypeTuple!(F) Params;

     // CTFE generating the delegate type string
     static string genDgStr() {
         auto paramSCs = extractParamSCs!(F);
         auto dgStr = extractReturnSCs!(F) ~ " ReturnType!(F) delegate(";
         foreach (i, paramSC; paramSCs) {
             if (i) dgStr ~= ", ";
             dgStr ~= paramSCs[i] ~ " Params[" ~ to!string(i) ~ "]";
         }
         return dgStr ~ ")";
     }

     mixin ("alias " ~ genDgStr() ~ " Dg;");
     ...
}



So, for the function type 'ref SomeAlienStruct function(ref 
SomeAlienStruct s)', the mixed-in delegate type alias will be:

alias ref ReturnType!(F) delegate(ref Params[0]) Dg;

Note that there are no stringof's involved in the alias declaration.

Terrible.








More information about the Digitalmars-d mailing list