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