Mercurial > projects > dstep
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