Null references redux + Cyclone

Christopher Wright dhasenan at gmail.com
Tue Sep 29 18:53:40 PDT 2009


Andrei Alexandrescu wrote:
> I seem to recall that 
> interface dispach in D does a linear search in the interfaces list, so 
> you may want to repeat your tests with a variable number of interfaces, 
> and a variable position of the interface being used.

Such numbers are not interesting to me. On average, each class I write 
implements one interface. I rarely use inheritance and interfaces in the 
same class.

But your information is incorrect. Here's what happens:

object of class A
| vtable
|   | classinfo pointer
|   | methods...
| fields...
| interface vtable
|   | struct Interface*
|   | methods

struct Interface
{
    ptrdiff_t this_offset;
    ClassInfo interfaceInfo;
}

There are two ways to implement interface calls with this paradigm. The 
compiler way:

interface I
{
    void doStuff(int arg);
}
class A
{
    void doStuff(int arg) { writefln("do stuff! %s", arg); }

    // this method actually goes into the interface vtable
    ReturnType!doStuff __I_doStuff(ParameterTypeTuple!doStuff args)
    {
       auto iface = cast(Interface*)this.vtable[0];
       this = this + iface.this_offset;
       return doStuff(args);
    }
}


You can also do it with the runtime, but that's a lot harder. It would 
be effectively the same code.



More information about the Digitalmars-d mailing list