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

View File

@@ -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;
}

View File

@@ -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());
}
}
}

View File

@@ -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