diff dstep/objc/objc.d @ 6:c0cfd40362ee

Fixed the bridge to work with ldc and dmd. Added a couple of hooks to manipulate the source code
author Jacob Carlborg <doob@me.com>
date Wed, 08 Jul 2009 14:29:59 +0200
parents 033d260cfc9b
children 19885b43130e
line wrap: on
line diff
--- a/dstep/objc/objc.d	Sun Jul 05 22:14:45 2009 +0200
+++ b/dstep/objc/objc.d	Wed Jul 08 14:29:59 2009 +0200
@@ -134,16 +134,23 @@
 
 	R msgSend (R = id, ARGS...) (SEL op, ARGS args)
 	{
-		return (cast(R function (id, SEL, ARGS))&bindings.objc_msgSend)(this, op, args);
+		alias extern (C) R function (id, SEL, ARGS) fp;
+		return (cast(fp)&bindings.objc_msgSend)(this, op, args);
 	}
 
 	void msgSend_stret (T, ARGS...) (out T stretAddr, SEL op, ARGS args)
 	{
 		if (T.sizeof > STRUCT_SIZE_LIMIT)
-			(cast(void function (T*, id, SEL, ARGS...))&bindings.objc_msgSend_stret)(&stretAddr, this, op, args);			
+		{
+			alias extern (C) void function (T*, id, SEL, ARGS...) fp;
+			(cast(fp)&bindings.objc_msgSend_stret)(&stretAddr, this, op, args);
+		}			
 		    
 		else
-			stretAddr = (*cast(T function (id, SEL, ARGS...))&bindings.objc_msgSend)(this, op, args);  
+		{
+			alias extern (C) T function (id, SEL, ARGS) fp;
+			stretAddr = (*cast(fp)&bindings.objc_msgSend)(this, op, args);
+		}  
 	}
 
 	static if (dstep.internal.Version.X86 || X86_64)
@@ -156,32 +163,42 @@
 			else
 				static assert(!is(R == double) && !is(R == float), "dstep.objc.objc.objc_object.msgSend_fpret: Only double and float are legal return values for objc_msgSend_fpret");
 				
-			return (cast(R function (id, SEL, ARGS...))&bindings.objc_msgSend_fpret)(this, op, args);
+			alias extern (C) R function (id, SEL, ARGS) fp;
+			return (cast(fp)&bindings.objc_msgSend_fpret)(this, op, args);
 		}
 	}
 
 	R invoke (R = id, ARGS...) (Method m, ARGS args)
 	{
-		return (cast(R function (id, SEL, ARGS...))&bindings.method_invoke)(this, m, args);
+		alias extern (C) R function (id, SEL, ARGS) fp;
+		return (cast(fp)&bindings.method_invoke)(this, m, args);
 	}
 
 	void invoke_stret (ARGS...) (Method m, ARGS args)
 	{
-		return (cast(R function (id, SEL, ARGS...))&bindings.method_invoke_stret)(this, m, args);
+		alias extern (C) R function (id, SEL, ARGS) fp;
+		return (cast(fp)&bindings.method_invoke_stret)(this, m, args);
 	}
 
 	R msgSendv (R = id, T) (SEL op, size_t arg_size, T arg_frame)
 	{
-		(cast(R function (id, SEL, size_t, T))&bindings.objc_msgSendv)(this, op, arg_size, arg_frame);
+		alias extern (C) R function (id, SEL, size_t, T) fp;
+		(cast(fp)&bindings.objc_msgSendv)(this, op, arg_size, arg_frame);
 	}
 
 	void msgSendv_stret (R = id, T) (out T stretAddr, SEL op, size_t arg_size, T arg_frame)
 	{
 	    if (R.sizeof > STRUCT_SIZE_LIMIT)
-			(cast(void function (R*, id, SEL, size_t, T))&bindings.objc_msgSendv_stret)(&stretAddr, this, op, arg_size, arg_frame);
+	    {
+	    	alias extern (C) void function (R*, id, SEL, size_t, T) fp;
+	    	(cast(fp)&bindings.objc_msgSendv_stret)(&stretAddr, this, op, arg_size, arg_frame);
+	    }
 	    
 	    else
-	        stretAddr = (*cast(R function (id, SEL, size_t, T))&bindings.objc_msgSendv)(this, op, arg_size, arg_frame);
+	    {
+	    	alias extern (C) R function (id, SEL, size_t, T) fp;
+	    	stretAddr = (*cast(fp)&bindings.objc_msgSendv)(this, op, arg_size, arg_frame);
+	    }
 	}
 
 	version (X86)
@@ -189,7 +206,8 @@
 		R msgSendv_fpret (R = id, T) (SEL op, uint arg_size, T arg_frame)
 		{
 			static assert(!is(R == double) && !is(R == float), "dstep.objc.objc.objc_object.msgSend_fpret: Only double and float are legal return values for objc_msgSendv_fpret");
-			return (cast(R function (id, SEL, uint, T))&bindings.objc_msgSendv_fpret)(this, op, arg_size, arg_frame);
+			alias extern (C) R function (id, SEL, uint, T) fp;
+			return (cast(fp)&bindings.objc_msgSendv_fpret)(this, op, arg_size, arg_frame);
 		}
 	}
 }