mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-09-17 19:07:05 +02: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:
+24
-18
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user