mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-11 18:33:14 +01:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user