Mercurial > projects > ldc
changeset 1442:0a5f7890f327
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:
}}}
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sun, 31 May 2009 15:27:01 +0200 |
parents | a3af393d1936 |
children | b6aa03164436 2a8d4f98b543 |
files | runtime/internal/genobj.d tests/mini/typeinfo10.d tests/mini/vararg6.d |
diffstat | 3 files changed, 33 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- 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; }
--- 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()); } } }
--- 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