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:
}}}
This commit is contained in:
Frits van Bommel
2009-05-31 15:27:01 +02:00
parent 78aa98fdfb
commit 46cd6504fa
3 changed files with 33 additions and 21 deletions
+24 -18
View File
@@ -152,8 +152,8 @@ class ClassInfo : Object
void*[] vtbl; /// virtual function pointer table void*[] vtbl; /// virtual function pointer table
Interface[] interfaces; /// interfaces this class implements Interface[] interfaces; /// interfaces this class implements
ClassInfo base; /// base class ClassInfo base; /// base class
void* destructor; void* destructor; // Only use as delegate.funcptr!
void* classInvariant; void* classInvariant; // Only use as delegate.funcptr!
uint flags; uint flags;
// 1: // IUnknown // 1: // IUnknown
// 2: // has no possible pointers into GC memory // 2: // has no possible pointers into GC memory
@@ -162,7 +162,7 @@ class ClassInfo : Object
// 32: // has typeinfo // 32: // has typeinfo
void* deallocator; void* deallocator;
OffsetTypeInfo[] offTi; OffsetTypeInfo[] offTi;
void* defaultConstructor; // default Constructor void* defaultConstructor; // default Constructor. Only use as delegate.funcptr!
TypeInfo typeinfo; TypeInfo typeinfo;
/** /**
@@ -764,7 +764,10 @@ class TypeInfo_Struct : TypeInfo
assert(p); assert(p);
if (xtoHash) if (xtoHash)
{ debug(PRINTF) printf("getHash() using xtoHash\n"); { debug(PRINTF) printf("getHash() using xtoHash\n");
h = (*xtoHash)(p); hash_t delegate() toHash;
toHash.ptr = p;
toHash.funcptr = xtoHash;
h = toHash();
} }
else else
{ {
@@ -787,9 +790,12 @@ class TypeInfo_Struct : TypeInfo
c = 1; c = 1;
else if (!p1 || !p2) else if (!p1 || !p2)
c = 0; c = 0;
else if (xopEquals) else if (xopEquals) {
c = (*xopEquals)(p1, p2); int delegate(void*) opEquals;
else opEquals.ptr = p1;
opEquals.funcptr = xopEquals;
c = opEquals(p2);
} else
// BUG: relies on the GC not moving objects // BUG: relies on the GC not moving objects
c = (memcmp(p1, p2, m_init.length) == 0); c = (memcmp(p1, p2, m_init.length) == 0);
return c; return c;
@@ -805,13 +811,12 @@ class TypeInfo_Struct : TypeInfo
if (p1) if (p1)
{ if (!p2) { if (!p2)
c = 1; c = 1;
else if (xopCmp) else if (xopCmp) {
// the x86 D calling conv requires the this arg to be last here int delegate(void*) opCmp;
version(X86) opCmp.ptr = p1;
c = (*xopCmp)(p2, p1); opCmp.funcptr = xopCmp;
else c = opCmp(p2);
c = (*xopCmp)(p1, p2); } else
else
// BUG: relies on the GC not moving objects // BUG: relies on the GC not moving objects
c = memcmp(p1, p2, m_init.length); c = memcmp(p1, p2, m_init.length);
} }
@@ -833,10 +838,11 @@ class TypeInfo_Struct : TypeInfo
char[] name; char[] name;
void[] m_init; // initializer; never null void[] m_init; // initializer; never null
hash_t function(void*) xtoHash; // These are ONLY for use as a delegate.funcptr!
int function(void*,void*) xopEquals; hash_t function() xtoHash;
int function(void*,void*) xopCmp; int function(void*) xopEquals;
char[] function(void*) xtoString; int function(void*) xopCmp;
char[] function() xtoString;
uint m_flags; uint m_flags;
} }
+4 -1
View File
@@ -58,7 +58,10 @@ void main()
assert(ti.compare(&v,&u) > 0); assert(ti.compare(&v,&u) > 0);
{ {
auto tis = cast(TypeInfo_Struct)ti; 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());
} }
} }
} }
+5 -2
View File
@@ -1,5 +1,5 @@
// tries to implement a fairly complete variadic print function // tries to implement a fairly complete variadic print function
module tangotests.vararg3; module tangotests.vararg6;
extern(C) int printf(char*, ...); extern(C) int printf(char*, ...);
@@ -179,7 +179,10 @@ void print(TypeInfo ti, void* arg)
{ {
if (sti.xtoString !is null) 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); printf("%.*s", str.length, str.ptr);
} }
else else