diff dstep/objc/message.d @ 1:033d260cfc9b

First upload of the bridge
author Jacob Carlborg <doob@me.com>
date Thu, 18 Jun 2009 22:00:13 +0200
parents
children c0cfd40362ee
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dstep/objc/message.d	Thu Jun 18 22:00:13 2009 +0200
@@ -0,0 +1,117 @@
+/**
+ * Copyright: Copyright (c) 2009 Jacob Carlborg.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Feb 1, 2009
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module dstep.objc.message;
+
+import dstep.internal.Version;
+import bindings = dstep.objc.bindings;
+import dstep.objc.objc;
+import dstep.objc.runtime;
+
+alias void* marg_list;
+
+version (X86)
+	const int STRUCT_SIZE_LIMIT = 8;
+
+else version (PPC)
+	const int STRUCT_SIZE_LIMIT = 4;
+
+else version (X86_64)
+	const int STRUCT_SIZE_LIMIT = 16;
+
+else version (PPC64) // Not sure about this
+	const int STRUCT_SIZE_LIMIT = 16;
+
+struct objc_super
+{
+    id receiver;
+    Class super_class;
+    
+    // for dwt compatibility
+    alias super_class cls;
+    
+	R msgSendSuper (R = id, ARGS...) (SEL op, ARGS args)
+	{
+		return (cast(R function (id, SEL, ARGS...))&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);
+	    
+	    else
+	        stretAddr = (*cast(T function (id, SEL, ARGS...))&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);
+}
+
+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);
+}
+
+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);
+    
+    else
+        stretAddr = (*cast(T function (id, SEL, ARGS...))&bindings.objc_msgSend)(self, op, args);
+}
+
+static if (X86 || X86_64)
+{
+	R objc_msgSend_fpret (R = id, ARGS...) (id self, SEL op, ARGS args)
+	{
+		version (X86_64)
+			static assert(!is(R : real), "Only real are legal return value for objc_msgSend_fpret");
+		
+		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);
+	}
+}
+
+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);
+}
+
+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);
+}
+
+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);
+}
+
+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);
+    
+    else
+        stretAddr = (*cast(R function (id, SEL, size_t, T))&bindings.objc_msgSendv)(self, op, arg_size, arg_frame);
+}
+
+version (X86)
+{
+	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);
+	}
+}
\ No newline at end of file