DMD 0.174 release

Jarrett Billingsley kb3ctd2 at yahoo.com
Wed Nov 15 06:44:46 PST 2006


"Kirk McDonald" <kirklin.mcdonald at gmail.com> wrote in message 
news:ejeepp$15n1$1 at digitaldaemon.com...
> Jarrett Billingsley wrote:
>> A few questions:
>>
>> 1) For the delegate .funcptr property, would it be possible for it to 
>> include the context pointer as the first parameter?  Currently the 
>> .funcptr allows us to get the type / call signature of the delegate but 
>> it's not possible to actually use the resulting function as there is no 
>> way to pass it the context short of dipping into ASM..
>>
>
> Not so: Walter added a .ptr property to delegates in 0.168. Between that 
> and .funcptr, you've got all you need to mess with delegates right there.

Well even with the context pointer, how do you propose passing it to the 
resulting func pointer?  The context is passed implicitly as the first 
parameter to any delegate, and without that first parameter in the parameter 
list, you can't pass the context.  So

class A { void fork(int x) { } }

A a = new A();
auto dg = &a.fork;
auto fp = dg.funcptr;

fp(3); // access violation

What's worse is that because the parameter list doesn't include the context, 
trying to call fp will result in all the arguments being shifted down a 
position from where they should be, i.e. 3 will now be in the 'this' slot, 
and nothing useful will be in the 'x' slot.  :S  So you _have_ to use ASM to 
call that func pointer, or maybe use some template trickery to create a 
pointer to the function with an extra first param. 





More information about the Digitalmars-d-announce mailing list