Mercurial > projects > dstep
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); } } }