# HG changeset patch # User Frits van Bommel # Date 1243772821 -7200 # Node ID d7ec997de4277fa98eacef5fc21c3cb0b90cacd7 # Parent 679ac907c82f088c7c1c5325faf42cbb4036d84b Adjust runtime for recent ABI change on x86-64, since member functions are no longer equivalent to regular functions with `this` as their first argument. (They weren't anyway, but it happened to work as long as there was no `sret` parameter) diff -r 679ac907c82f -r d7ec997de427 runtime/internal/genobj.d --- a/runtime/internal/genobj.d Sun May 31 10:41:20 2009 +0200 +++ b/runtime/internal/genobj.d Sun May 31 14:27:01 2009 +0200 @@ -153,7 +153,7 @@ Interface[] interfaces; /// interfaces this class implements ClassInfo base; /// base class void* destructor; - void function(Object) classInvariant; + void* classInvariant; uint flags; // 1: // IUnknown // 2: // has no possible pointers into GC memory @@ -198,8 +198,10 @@ if (flags & 8 && defaultConstructor) { - auto ctor = cast(Object function(Object))defaultConstructor; - return ctor(o); + Object delegate() ctor; + ctor.ptr = cast(void*)o; + ctor.funcptr = cast(Object function())defaultConstructor; + return ctor(); } return o; } diff -r 679ac907c82f -r d7ec997de427 runtime/internal/invariant.d --- a/runtime/internal/invariant.d Sun May 31 10:41:20 2009 +0200 +++ b/runtime/internal/invariant.d Sun May 31 14:27:01 2009 +0200 @@ -18,7 +18,10 @@ { if (c.classInvariant) { - (*c.classInvariant)(o); + void delegate() inv; + inv.ptr = cast(void*) o; + inv.funcptr = c.classInvariant; + inv(); } c = c.base; } while (c); diff -r 679ac907c82f -r d7ec997de427 runtime/internal/lifetime.d --- a/runtime/internal/lifetime.d Sun May 31 10:41:20 2009 +0200 +++ b/runtime/internal/lifetime.d Sun May 31 14:27:01 2009 +0200 @@ -560,8 +560,10 @@ if (c.destructor) { debug(PRINTF) printf("calling dtor of %.*s\n", c.name.length, c.name.ptr); - fp_t fp = cast(fp_t)c.destructor; - (*fp)(cast(Object)p); // call destructor + void delegate() dg; + dg.ptr = p; + dg.funcptr = cast(void function()) c.destructor; + dg(); // call destructor } c = c.base; } while (c);