digitalmars.D - interfaces ABI
- =?ISO-8859-1?Q?Lu=EDs_Marques?= (13/13) Mar 19 2007 Hello,
- BCS (17/34) Mar 19 2007 IIRC interface are implemented by adding a pointer to the interfaces
Hello, The interfaces ABI is marked "TBD". Could this be filled, please? I found the following surprising, regarding the ABI: An object only has a pointer to the vtable and a monitor, the rest being the actual data ("non-static members"). At the vtable's offset 0 we find a pointer to the classinfo. And the classinfo has an array of interfaces. So when I add an interface, I would assume the objects to remain equal in size. The classinfo would get a bigger array of interfaces, and perhaps the vtable would also get bigger. But since no non-static member were added to the class, I expected the object size to be equal. Yet, it gets bigger. -- Luís
Mar 19 2007
Luís Marques wrote:Hello, The interfaces ABI is marked "TBD". Could this be filled, please? I found the following surprising, regarding the ABI: An object only has a pointer to the vtable and a monitor, the rest being the actual data ("non-static members"). At the vtable's offset 0 we find a pointer to the classinfo. And the classinfo has an array of interfaces. So when I add an interface, I would assume the objects to remain equal in size. The classinfo would get a bigger array of interfaces, and perhaps the vtable would also get bigger. But since no non-static member were added to the class, I expected the object size to be equal. Yet, it gets bigger. -- LuísIIRC interface are implemented by adding a pointer to the interfaces v-tbl to the object, then when a object is cast to an interface the interface ends up as a pointer to /it's/ v-tbl in the object. The reason for this is that the interface's v-tbl includes an offset to the start of the object. When an interface is used to make a call it ends up looking something like this. I i; ((*i)[member_offset]) (i+(*i)[v_tbl_offset], /** args **/ ) Why the v-tbls are in the classinfo? I don't know. What I would like to see is interfaces become a context/v-tbl pair (sort of like arrays being a pointer/length pair). Then, when an interface is used to make a call it would end up looking something like this. I i; (i.vtbl[member_offset]) (i.context, /** args **/ ) this would free classes from having to carry around a v-tbl pointer and also let other things like struct and functions implement interfaces.
Mar 19 2007