Functors

Craig Black craigblack2 at cox.net
Thu Jun 28 16:09:50 PDT 2007


I'll keep that in mind evil genius.

"BCS" <ao at pathlink.com> wrote in message 
news:ce0a3343b7398c987a7d80a1836 at news.digitalmars.com...
> Reply to Craig,
>
>> Very useful hack.  Thanks!
>>
>> "BCS" <ao at pathlink.com> wrote in message
>> news:ce0a3343b7368c987a5d27c1f2e at news.digitalmars.com...
>>
>>> Reply to Craig,
>>>
>>>>> if all you want to do is convert fn ptrs to delegates this works:
>>>>>
>>>>> |T delegate(A) Fn2Dg(T, A...)(T function(A) f)
>>>>> |{
>>>>> | struct tmp
>>>>> | {
>>>>> | T ret(A args){ return (cast(T function(A))this)(args); }
>>>>> | };
>>>>> | return &(cast(tmp*)f).ret;
>>>>> |}
>>>> I didn't know this was possible.  Are you sure this works? I thought
>>>> there were some issues with calling conventions.
>>>>
>>>> -Craig
>>>>
>>> What goes on there is that the context pointer (which is supposed to
>>> be a object, struct or stack frame) is in fact a function pointer.
>>> The calling convention for delegates never actually de references the
>>> context pointer so what is is doesn't matter. In this case I convert
>>> it back to a function pointer, and then call it with the arguments I
>>> was given. All of the values in the arguments get copied and arranged
>>> correctly for the function call and everything is fine and dandy.
>>>
>
> It gets better <g type=evil> that 32 bits of the pointer can be used for 
> anything as long as it isn't set to null
>
> struct S
> {
>  union U
>  {
>    S* ptr;
>    struct
>    {
>      short s;
>      byte b;
>      char c;
>    }
>  }
>
>  void delegate() build(short s, byte b, char c)
>  {
>    U u;
>    u.s=s; u.b=b; u.c=c;
>    return &s.ptr.go;
>  }
>
>  void go()
>  {
>    U u;
>    U.ptr = this;
>    writef("%s, %s, %s\n", u.s, u.b, u.c);
>  }
> }
>
> 




More information about the Digitalmars-d mailing list