On Fri, 17 Apr 2015 05:30:04 -0400, Jacob Carlborg <[email protected]> wrote:
On 2015-04-17 01:25, bitwise wrote:
Ok, that sounds right. D has no multiple or virtual inheritance, so I
guess things should be fine. C# is the same way(single inheritance,
interfaces) which is likely designed to avoid these kinds of issues.
I would be modifying the offTi() property though, not getMembers().
getMembers() actually works right now, although it's kinda useless.
Basically, if you put any function named "getMembers" at module scope,
the address of that function can be retrieved using
ModuleInfo.xgetMembers().
We need a "getMembers" on ClassInfo. Because "typeid" will resolve the
dynamic type. The problem is this code:
class Bar {}
class Foo : Bar {}
void main ()
{
Bar a = new Foo;
writeln(typeid(a));
}
Compile time reflection cannot be used to get the members in this case.
Sorry, that's what I meant(using this on classes, not modules).
xgetMembers/getMembers seems to be designed so that the caller can write
their own getMembers() function, whereas offTi() is designed to return an
array that was automatically generated.
offTi() is actually defined in TypeInfo:
https://github.com/D-Programming-Language/druntime/blob/cfcf7480b2faea0af9ab6ddba8e3b0d9f05c4415/src/object_.d#L301
and overridden for TypeInfo_Class:
https://github.com/D-Programming-Language/druntime/blob/cfcf7480b2faea0af9ab6ddba8e3b0d9f05c4415/src/object_.d#L831
but TypeInfo_Class.m_offTi is never populated:
https://github.com/D-Programming-Language/dmd/blob/master/src/toobj.c#L436
So while this code technically works, there will be no output:
class Test {
int a = 4;
int b = 5;
int c = 6;
}
void main()
{
foreach(const(OffsetTypeInfo) off; typeid(Test).offTi())
writeln(off.offset);
}