diff dstep/objc/bridge/Bridge.d @ 2:9fd439a28ce3

Adapted the scripts for the new bridge + a lot more
author Jacob Carlborg <doob@me.com>
date Sun, 05 Jul 2009 17:16:19 +0200
parents 033d260cfc9b
children 07194b026fa4
line wrap: on
line diff
--- a/dstep/objc/bridge/Bridge.d	Thu Jun 18 22:00:13 2009 +0200
+++ b/dstep/objc/bridge/Bridge.d	Sun Jul 05 17:16:19 2009 +0200
@@ -64,11 +64,25 @@
 
 template ObjcWrap (string name)
 {
-	import dstep.objc.bridge.ClassInitializer : ObjcSubclassInitializer, subclassInit;
-	import dstep.objc.objc : Class, id, IMP, SEL;
-
-	static private Class objcClass_;
-	static private Class objcSuperClass_;
+	private
+	{
+		import dstep.objc.bridge.ClassInitializer : ObjcSubclassInitializer, subclassInit;
+		import dstep.objc.objc : Class, id, IMP, SEL;
+	
+		static Class objcClass_;
+		static Class objcSuperClass_;
+	}
+	
+	this ()
+	{
+		objcObject = invokeObjcSelfClass!(id, "alloc");
+		id ret = invokeObjcSelf!(id, "init");
+		
+		if (ret)
+			objcObject = ret;
+		
+		dObject = this;
+	}
 
 	this (id object)
 	{
@@ -124,21 +138,22 @@
 
 template ObjcBindMethod (alias method, R, string selector, ARGS...)
 {	
-	import dstep.objc.bridge.Capsule : decapsule, encapsule, isCapsule, needsEncapsulation;
-	import dstep.internal.Tuple;
-   
-	private ObjcMethodDeclaration!(method, R, selector, ARGS) objcMethodDeclaration;	
-	
-	private R delegate (ARGS) resolveVirtualCall ()
+	private
 	{
-		return null;
-	}
+		import dstep.objc.bridge.Capsule : decapsule, encapsule, isCapsule;
+		import dstep.objc.bridge.Type : needsEncapsulation, ObjcType;
+		import dstep.internal.Tuple;
+	
+		ObjcMethodDeclaration!(method, R, selector, ARGS) objcMethodDeclaration;
 		
-	static if (needsEncapsulation!(R))
-	{
-        private alias ReplaceAllClasses!(id, ARGS) ObjcArgs;
-        
-		private static id forwardVirtualCall (id self, SEL cmd, ObjcArgs objcArgs)
+		R delegate (ARGS) resolveVirtualCall ()
+		{
+			return null;
+		}
+		
+		alias ReplaceAllClasses!(id, ARGS) ObjcArgs;
+		
+		static ObjcType!(R) forwardVirtualCall (id self, SEL cmd, ObjcArgs objcArgs)
 		in
 		{
 			assert(isCapsule(self));
@@ -158,37 +173,11 @@
 				args[i] = decapsule!(ArgType)(a);
 			}
 			
-			auto result = dg(args);
+			static if (is(R == void))
+				dg(args);
 			
-			return encapsule!(R)(result);
-		}
-	}
-	
-	else
-	{
-        private alias ReplaceAllClasses!(id, ARGS) ObjcArgs;        
-        
-		private static R forwardVirtualCall (id self, SEL cmd, ObjcArgs objcArgs)
-		in
-		{
-			assert(isCapsule(self));
-		}
-		body
-		{
-			R delegate (ARGS) dg;            
-			dg.funcptr = &method;
-			dg.ptr = Bridge.getDObject(self);
-			
-			ARGS args;
-			
-			foreach (i, a ; objcArgs)
-			{
-				alias typeof(args[i]) ArgType;
-
-                args[i] = decapsule!(ArgType)(a);
-			}
-			
-			return dg(args);
+			else
+				return encapsule!(R)(dg(args));
 		}
 	}
 }
@@ -200,13 +189,16 @@
 
 template ObjcBindClassMethod (alias method, R, string selector, ARGS...)
 {	
-	private ObjcMethodDeclaration!(method, R, selector, ARGS) objcClassMethodDeclaration;
-		
-	static if (needsEncapsulation!(R))
+	private
 	{
-        private alias ReplaceAllClasses!(id, ARGS) ObjcArgs;
-        
-		private static id forwardStaticCall (id self, SEL cmd, ObjcArgs objcArgs)
+		import dstep.objc.bridge.Capsule : decapsule, encapsule, isCapsule, needsEncapsulation, ObjcType;
+		import dstep.internal.Tuple;
+		
+		ObjcMethodDeclaration!(method, R, selector, ARGS) objcClassMethodDeclaration;
+		
+		alias ReplaceAllClasses!(id, ARGS) ObjcArgs;
+		
+		static ObjcType!(R) forwardStaticCall (id self, SEL cmd, ObjcArgs objcArgs)
 		in
 		{
 			assert(isCapsule(self));
@@ -224,35 +216,47 @@
 				args[i] = decapsule!(ArgType)(a);
 			}
 			
-			auto result = dg(args);
+			static if (needsEncapsulation!(R))
+				return encapsule!(R)(dg(args));
 			
-			return encapsule!(R)(result);
+			else
+				return dg(args);
 		}
 	}
-	
-	else
+}
+
+template ObjcBindFunction (alias func)
+{
+	mixin ObjcBindFunction!(func, ReturnTypeOf!(func), ParameterTupleOf!(func));
+}
+
+template ObjcBindFunction (alias func, R, ARGS...)
+{
+	private
 	{
-        private alias ReplaceAllClasses!(id, ARGS) ObjcArgs;        
-        
-		private static R forwardStaticCall (id self, SEL cmd, ObjcArgs objcArgs)
-		in
-		{
-			assert(isCapsule(self));
-		}
-		body
-		{
-			R function (ARGS) dg = &method;
-			
+		import dstep.objc.bridge.Capsule : decapsule, encapsule, needsEncapsulation, ObjcType;
+		import dstep.internal.Tuple;
+		
+		ObjcMethodDeclaration!(method, R, selector, ARGS) objcClassMethodDeclaration;
+		
+		alias ReplaceAllClasses!(id, ARGS) ObjcArgs;
+		
+		extern (C) ObjcType!(R) forwardFunctionCall (ObjcArgs objcArgs)
+		{			
 			ARGS args;
 			
 			foreach (i, a ; objcArgs)
 			{
 				alias typeof(args[i]) ArgType;
-
-                args[i] = decapsule!(ArgType)(a);
+				
+				args[i] = decapsule!(ArgType)(a);
 			}
 			
-			return dg(args);
+			static if (needsEncapsulation!(R))
+				return encapsule!(R)(dg(args));
+			
+			else
+				return dg(args);
 		}
 	}
 }
@@ -428,4 +432,53 @@
 		else
 			return self.msgSend!(R)(sel, objcArgs);
 	}
+	
+	R invokeObjcFunction (R, alias func, ARGS...) (ARGS args)
+	{
+		static if (!is(R : void))
+			R result;
+		
+		auto funcPtr = &func; // use a function pointer instead of the alias because the function can be private.
+		
+		alias ReplaceAllClasses!(id, ARGS) ObjcArgs;
+		ObjcArgs objcArgs;
+		
+		foreach (i, a ; args)
+		{
+			alias typeof(a) ArgType;
+			
+			objcArgs[i] = encapsule!(ArgType)(a);
+		}
+		
+		static if (is(R : ObjcWrapper))
+		{
+			id r = funcPtr(objcArgs);
+			
+			if (!r)
+				return null;
+			
+			if (isCapsule(r))
+			{
+				result = decapsule!(R)(r);
+				
+				if (result)
+					return result;
+			}				
+			
+			return new R(r);
+		}
+		
+		else static if (is(R : Object))
+		{
+			id r = funcPtr(objcArgs);
+			
+			if (!r)
+				return null;
+			
+			return decapsule!(R)(r);
+		}
+		
+		else
+			return funcPtr(objcArgs);
+	}
 }
\ No newline at end of file