# HG changeset patch # User Frits van Bommel # Date 1243776421 -7200 # Node ID 0a5f7890f32741a8db5da2746cb6c9b998d2a518 # Parent a3af393d1936ddfc75b6d7757280a700d177cde8 Adjust some more code that was depending on the function and delegate calling conventions being equal. There's also an instance in `tango.text.convert.Layout` that should be adjusted: {{{ Index: tango/text/convert/Layout.d =================================================================== --- tango/text/convert/Layout.d (revision 4578) +++ tango/text/convert/Layout.d (working copy) -660,8 +660,12 @@ case TypeCode.STRUCT: auto s = cast(TypeInfo_Struct) type; - if (s.xtoString) - return Utf.fromString8 (s.xtoString(p), result); + if (s.xtoString) { + char[] delegate() toString; + toString.ptr = p; + toString.funcptr = cast(char[] function()) s.xtoString; + return Utf.fromString8 (toString(), result); + } goto default; case TypeCode.INTERFACE: }}} diff -r a3af393d1936 -r 0a5f7890f327 runtime/internal/genobj.d --- a/runtime/internal/genobj.d Sun May 31 15:07:04 2009 +0200 +++ b/runtime/internal/genobj.d Sun May 31 15:27:01 2009 +0200 @@ -152,8 +152,8 @@ 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 @@ // 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 @@ 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 @@ 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 @@ 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 @@ 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 -r a3af393d1936 -r 0a5f7890f327 tests/mini/typeinfo10.d --- a/tests/mini/typeinfo10.d Sun May 31 15:07:04 2009 +0200 +++ b/tests/mini/typeinfo10.d Sun May 31 15:27:01 2009 +0200 @@ -58,7 +58,10 @@ 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 -r a3af393d1936 -r 0a5f7890f327 tests/mini/vararg6.d --- a/tests/mini/vararg6.d Sun May 31 15:07:04 2009 +0200 +++ b/tests/mini/vararg6.d Sun May 31 15:27:01 2009 +0200 @@ -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 @@ { 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