diff dstep/objc/message.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/message.d	Sun Jul 05 22:14:45 2009 +0200
+++ b/dstep/objc/message.d	Wed Jul 08 14:29:59 2009 +0200
@@ -35,36 +35,51 @@
     
 	R msgSendSuper (R = id, ARGS...) (SEL op, ARGS args)
 	{
-		return (cast(R function (id, SEL, ARGS...))&bindings.objc_msgSendSuper)(this, op, args);
+		alias extern (C) R function (id, SEL, ARGS) fp;
+		return (cast(fp)&bindings.objc_msgSendSuper)(this, op, args);
 	}
 	
 	void msgSendSuper_stret (T, ARGS...) (out T stretAddr, id self, SEL op, ARGS args)
 	{		
 	    if (T.sizeof > STRUCT_SIZE_LIMIT)
-			(cast(void function (T*, id, SEL, ARGS...))&bindings.objc_msgSendSuper_stret)(&stretAddr, self, op, args);
+	    {
+	    	alias extern (C) void function (T*, id, SEL, ARGS) fp;
+	    	(cast(fp)&bindings.objc_msgSendSuper_stret)(&stretAddr, self, op, args);
+	    }
 	    
 	    else
-	        stretAddr = (*cast(T function (id, SEL, ARGS...))&bindings.objc_msgSendSuper)(self, op, args);
+	    {
+	    	alias extern (C) T function (id, SEL, ARGS) fp;
+	    	stretAddr = (*cast(fp)&bindings.objc_msgSendSuper)(self, op, args);
+	    }
 	}
 }
 
 R objc_msgSend (R = id, ARGS...) (id self, SEL op, ARGS args)
 {
-	return (cast(R function (id, SEL, ARGS...))&bindings.objc_msgSend)(self, op, args);
+	alias extern(C) R function (id, SEL, ARGS) fp;
+	return (cast(fp)&bindings.objc_msgSend)(self, op, args);
 }
 
 R objc_msgSendSuper (R = id, ARGS...) (objc_super* super_, SEL op, ARGS args)
 {
-	return (cast(R function (id, SEL, ARGS...))&bindings.objc_msgSendSuper)(super_, op, args);
+	alias extern(C) R function (objc_super*, SEL, ARGS) fp;
+	return (cast(fp)&bindings.objc_msgSendSuper)(super_, op, args);
 }
 
 void objc_msgSend_stret (T, ARGS...) (out T stretAddr, id self, SEL op, ARGS args)
 {		
     if (T.sizeof > STRUCT_SIZE_LIMIT)
-		(cast(void function (T*, id, SEL, ARGS...))&bindings.objc_msgSend_stret)(&stretAddr, self, op, args);
+    {
+    	alias extern(C) void function (T*, id, SEL, ARGS) fp;
+    	(cast(void function (fp))&bindings.objc_msgSend_stret)(&stretAddr, self, op, args);
+    }
     
     else
-        stretAddr = (*cast(T function (id, SEL, ARGS...))&bindings.objc_msgSend)(self, op, args);
+    {
+    	alias extern (C) T function (id, SEL, ARGS) fp;
+        stretAddr = (*cast(fp)&bindings.objc_msgSend)(self, op, args);
+    }
 }
 
 static if (X86 || X86_64)
@@ -77,34 +92,44 @@
 		else
 			static assert(!is(R : double) && !is(R : float), "Only double and float are legal return values for objc_msgSend_fpret");
 			
-		return (cast(R function (id, SEL, ARGS...))&bindings.objc_msgSend_fpret)(self, op, args);
+		alias extern (C) R function (id, SEL, ARGS) fp;
+		return (cast(fp)&bindings.objc_msgSend_fpret)(self, op, args);
 	}
 }
 
 R method_invoke (R = id, ARGS...) (id receiver, Method m, ARGS args)
 {
 	static assert(receiver !is null);
-	return (cast(R function (id, SEL, ARGS...))&bindings.method_invoke)(receiver, m, args);
+	alias extern (C) R function (id, SEL, ARGS) fp;
+	return (cast(fp)&bindings.method_invoke)(receiver, m, args);
 }
 
 void method_invoke_stret (ARGS...) (id receiver, Method m, ARGS args)
 {
 	static assert(receiver !is null);
-	return (cast(R function (id, SEL, ARGS...))&bindings.method_invoke_stret)(receiver, m, args);
+	alias extern (C) R function (id, SEL, ARGS) fp;
+	return (cast(fp)&bindings.method_invoke_stret)(receiver, m, args);
 }
 
 R objc_msgSendv (R = id, T) (id self, SEL op, size_t arg_size, T arg_frame)
 {
-	(cast(R function (id, SEL, size_t, T))&bindings.objc_msgSendv)(self, op, arg_size, arg_frame);
+	alias extern (C) R function (id, SEL, size_t, T) fp;
+	(cast(fp)&bindings.objc_msgSendv)(self, op, arg_size, arg_frame);
 }
 
 void objc_msgSendv_stret (R = id, T) (out T stretAddr, id self, 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, self, op, arg_size, arg_frame);
+    {
+    	alias extern (C) void function (R*, id, SEL, size_t, T) fp;
+    	(cast(fp)&bindings.objc_msgSendv_stret)(&stretAddr, self, op, arg_size, arg_frame);
+    }
     
     else
-        stretAddr = (*cast(R function (id, SEL, size_t, T))&bindings.objc_msgSendv)(self, op, arg_size, arg_frame);
+    {
+    	alias extern (C) R function (id, SEL, size_t, T) fp;
+    	stretAddr = (*cast(fp)&bindings.objc_msgSendv)(self, op, arg_size, arg_frame);
+    }
 }
 
 version (X86)
@@ -112,6 +137,7 @@
 	R objc_msgSendv_fpret (R = id, T) (id self, SEL op, uint arg_size, T arg_frame)
 	{
 		static assert(!is(R : double) && !is(R : float), "Only double and float are legal return values for objc_msgSendv_fpret");
-		return (cast(R function (id, SEL, uint, T))&bindings.objc_msgSendv_fpret)(self, op, arg_size, arg_frame);
+		alias extern (C) R function (id, SEL, uint, T) fp;
+		return (cast(fp)&bindings.objc_msgSendv_fpret)(self, op, arg_size, arg_frame);
 	}
 }
\ No newline at end of file