On Fri, 24 Jul 2009 09:56:41 -0400, grauzone <n...@example.net> wrote:

         LOOKUP_TABLE[0] = Method("method1", &Component.method1);
         LOOKUP_TABLE[1] = Method("method2", &Component.method2);

These two lines are weird.  ``pragma(msg)`` shows that type of
``&method1`` is ``void function()`` while it must be ``void delegate()``
for a non-static member because of difference in calling convention.
Actually I think that taking an address of a non-static member in a
static context must be a compile time error.
It's because I'm taking the address of the function on the type, not on an instance. It's not a delegate because there's no "this" pointer yet. It makes sense to me anyways. A delegate is a normal function pointer coupled with a hidden context parameter.

But you can't call that function pointer. Actually, you can probably subvert type safety, because functions have a different calling conventions from delegates. This also means that SafeD should disallow taking the address of methods from a type (without instance).

That's really silly. A nicer way would be to make &Type.method return a delegate with ptr set to null. Then calling this delegate would result in a (harmless) null pointer exception.

But even then, there's no safe way to construct a real delegate out of the method pointer. You can't simply assign an object instance to ptr, because you can't statically know if the funcptr of the delegate really is a method of that object instance.

You mean no *compiler verifyable* safe way. Of course there are provably safe ways to do it (my code is one of them).

Looks like SafeD proves to be unfeasible again.

That's why there are system modules ;) Note that a delegate's ptr method is a pointer, so you can't assign it/use it from SafeD anyways.

I'd propose a system module that defines an "unbound delegate" type. This would be a function pointer coupled parameterized with a type, which has an opCall(T, ...) that would call the function properly. I think it can be done, but I'm not enough of a template guru to do it myself.

That could be used in SafeD.

-Steve

Reply via email to