diff --git a/runtime/internal/genobj.d b/runtime/internal/genobj.d index 4adfd7b9..5b179c74 100644 --- a/runtime/internal/genobj.d +++ b/runtime/internal/genobj.d @@ -152,8 +152,8 @@ class ClassInfo : Object void*[] vtbl; /// virtual function pointer table Interface[] interfaces; /// interfaces this class implements ClassInfo base; /// base class - void* destructor; - void* classInvariant; + void* destructor; // Only use as delegate.funcptr! + void* classInvariant; // Only use as delegate.funcptr! uint flags; // 1: // IUnknown // 2: // has no possible pointers into GC memory @@ -162,7 +162,7 @@ class ClassInfo : Object // 32: // has typeinfo void* deallocator; OffsetTypeInfo[] offTi; - void* defaultConstructor; // default Constructor + void* defaultConstructor; // default Constructor. Only use as delegate.funcptr! TypeInfo typeinfo; /** @@ -764,7 +764,10 @@ class TypeInfo_Struct : TypeInfo assert(p); if (xtoHash) { debug(PRINTF) printf("getHash() using xtoHash\n"); - h = (*xtoHash)(p); + hash_t delegate() toHash; + toHash.ptr = p; + toHash.funcptr = xtoHash; + h = toHash(); } else { @@ -787,9 +790,12 @@ class TypeInfo_Struct : TypeInfo c = 1; else if (!p1 || !p2) c = 0; - else if (xopEquals) - c = (*xopEquals)(p1, p2); - else + else if (xopEquals) { + int delegate(void*) opEquals; + opEquals.ptr = p1; + opEquals.funcptr = xopEquals; + c = opEquals(p2); + } else // BUG: relies on the GC not moving objects c = (memcmp(p1, p2, m_init.length) == 0); return c; @@ -805,13 +811,12 @@ class TypeInfo_Struct : TypeInfo if (p1) { if (!p2) c = 1; - else if (xopCmp) - // the x86 D calling conv requires the this arg to be last here - version(X86) - c = (*xopCmp)(p2, p1); - else - c = (*xopCmp)(p1, p2); - else + else if (xopCmp) { + int delegate(void*) opCmp; + opCmp.ptr = p1; + opCmp.funcptr = xopCmp; + c = opCmp(p2); + } else // BUG: relies on the GC not moving objects c = memcmp(p1, p2, m_init.length); } @@ -833,10 +838,11 @@ class TypeInfo_Struct : TypeInfo char[] name; void[] m_init; // initializer; never null - hash_t function(void*) xtoHash; - int function(void*,void*) xopEquals; - int function(void*,void*) xopCmp; - char[] function(void*) xtoString; + // These are ONLY for use as a delegate.funcptr! + hash_t function() xtoHash; + int function(void*) xopEquals; + int function(void*) xopCmp; + char[] function() xtoString; uint m_flags; } diff --git a/tests/mini/typeinfo10.d b/tests/mini/typeinfo10.d index 949d84fc..1d375c2b 100644 --- a/tests/mini/typeinfo10.d +++ b/tests/mini/typeinfo10.d @@ -58,7 +58,10 @@ void main() assert(ti.compare(&v,&u) > 0); { auto tis = cast(TypeInfo_Struct)ti; - assert(tis.xtoString(&s) == s.toString()); + char[] delegate() structToString; + structToString.ptr = &s; + structToString.funcptr = tis.xtoString; + assert(structToString() == s.toString()); } } } diff --git a/tests/mini/vararg6.d b/tests/mini/vararg6.d index a7dd62ed..24b5db12 100644 --- a/tests/mini/vararg6.d +++ b/tests/mini/vararg6.d @@ -1,5 +1,5 @@ // tries to implement a fairly complete variadic print function -module tangotests.vararg3; +module tangotests.vararg6; extern(C) int printf(char*, ...); @@ -179,7 +179,10 @@ void print(TypeInfo ti, void* arg) { if (sti.xtoString !is null) { - char[] str = sti.xtoString(arg); + char[] delegate() toString; + toString.ptr = arg; + toString.funcptr = sti.xtoString; + char[] str = toString(); printf("%.*s", str.length, str.ptr); } else