From 24e7b1a688a2ff1cac094026d20cc6001f062581 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Wed, 11 Nov 2015 01:10:44 -0800 Subject: [PATCH] Merge adapter into callback, removing indirection. --- Execute.cpp | 18 +++++++----------- Internal.hpp | 8 +++++--- ObjectiveC/Library.mm | 12 ++---------- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/Execute.cpp b/Execute.cpp index 57a9ae9..04a86a3 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -752,7 +752,7 @@ JSValueRef CYFromFFI(JSContextRef context, sig::Type *type, ffi_type *ffi, void } } -void CYExecuteClosure(ffi_cif *cif, void *result, void **arguments, void *arg, JSValueRef (*adapter)(JSContextRef, size_t, JSValueRef[], JSObjectRef)) { +void CYExecuteClosure(ffi_cif *cif, void *result, void **arguments, void *arg) { Closure_privateData *internal(reinterpret_cast(arg)); JSContextRef context(internal->context_); @@ -763,7 +763,7 @@ void CYExecuteClosure(ffi_cif *cif, void *result, void **arguments, void *arg, J for (size_t index(0); index != count; ++index) values[index] = CYFromFFI(context, internal->signature_.elements[1 + index].type, internal->cif_.arg_types[index], arguments[index]); - JSValueRef value(adapter(context, count, values, internal->function_)); + JSValueRef value(internal->adapter_(context, count, values, internal->function_)); CYPoolFFI(NULL, context, internal->signature_.elements[0].type, internal->cif_.rtype, result, value); } @@ -771,20 +771,16 @@ static JSValueRef FunctionAdapter_(JSContextRef context, size_t count, JSValueRe return CYCallAsFunction(context, function, NULL, count, values); } -static void FunctionClosure_(ffi_cif *cif, void *result, void **arguments, void *arg) { - CYExecuteClosure(cif, result, arguments, arg, &FunctionAdapter_); -} - -Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, const sig::Signature &signature, void (*callback)(ffi_cif *, void *, void **, void *)) { +Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, const sig::Signature &signature, JSValueRef (*adapter)(JSContextRef, size_t, JSValueRef[], JSObjectRef)) { // XXX: in case of exceptions this will leak // XXX: in point of fact, this may /need/ to leak :( - Closure_privateData *internal(new Closure_privateData(context, function, signature)); + Closure_privateData *internal(new Closure_privateData(context, function, adapter, signature)); #if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__)) void *executable; ffi_closure *writable(reinterpret_cast(ffi_closure_alloc(sizeof(ffi_closure), &executable))); - ffi_status status(ffi_prep_closure_loc(writable, &internal->cif_, callback, internal, executable)); + ffi_status status(ffi_prep_closure_loc(writable, &internal->cif_, &CYExecuteClosure, internal, executable)); _assert(status == FFI_OK); internal->value_ = executable; @@ -795,7 +791,7 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, -1, 0 ))); - ffi_status status(ffi_prep_closure(closure, &internal->cif_, callback, internal)); + ffi_status status(ffi_prep_closure(closure, &internal->cif_, &CYExecuteClosure, internal)); _assert(status == FFI_OK); _syscall(mprotect(closure, sizeof(*closure), PROT_READ | PROT_EXEC)); @@ -807,7 +803,7 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, } static JSObjectRef CYMakeFunctor(JSContextRef context, JSObjectRef function, const sig::Signature &signature) { - Closure_privateData *internal(CYMakeFunctor_(context, function, signature, &FunctionClosure_)); + Closure_privateData *internal(CYMakeFunctor_(context, function, signature, &FunctionAdapter_)); JSObjectRef object(JSObjectMake(context, Functor_, internal)); // XXX: see above notes about needing to leak JSValueProtect(CYGetJSContext(context), object); diff --git a/Internal.hpp b/Internal.hpp index 4330590..87ff055 100644 --- a/Internal.hpp +++ b/Internal.hpp @@ -197,11 +197,13 @@ struct Closure_privateData : { JSGlobalContextRef context_; JSObjectRef function_; + JSValueRef (*adapter_)(JSContextRef, size_t, JSValueRef[], JSObjectRef); - Closure_privateData(JSContextRef context, JSObjectRef function, const sig::Signature &signature) : + Closure_privateData(JSContextRef context, JSObjectRef function, JSValueRef (*adapter)(JSContextRef, size_t, JSValueRef[], JSObjectRef), const sig::Signature &signature) : cy::Functor(signature, NULL), context_(CYGetJSContext(context)), - function_(function) + function_(function), + adapter_(adapter) { //XXX:JSGlobalContextRetain(context_); JSValueProtect(context_, function_); @@ -213,7 +215,7 @@ struct Closure_privateData : } }; -Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, const sig::Signature &signature, void (*callback)(ffi_cif *, void *, void **, void *)); +Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, const sig::Signature &signature, JSValueRef (*adapter)(JSContextRef, size_t, JSValueRef[], JSObjectRef)); void CYExecuteClosure(ffi_cif *cif, void *result, void **arguments, void *arg, JSValueRef (*adapter)(JSContextRef, size_t, JSValueRef[], JSObjectRef)); #endif/*CYCRIPT_INTERNAL_HPP*/ diff --git a/ObjectiveC/Library.mm b/ObjectiveC/Library.mm index 68cf70d..ca85258 100644 --- a/ObjectiveC/Library.mm +++ b/ObjectiveC/Library.mm @@ -644,10 +644,6 @@ static JSValueRef BlockAdapter_(JSContextRef context, size_t count, JSValueRef v return CYCallAsFunction(context, function, _this, count - 1, values + 1); } -static void BlockClosure_(ffi_cif *cif, void *result, void **arguments, void *arg) { - CYExecuteClosure(cif, result, arguments, arg, &BlockAdapter_); -} - NSBlock *CYMakeBlock(JSContextRef context, JSObjectRef function, sig::Signature &signature) { _assert(__NSMallocBlock__ != Nil); BlockLiteral *literal(reinterpret_cast(malloc(sizeof(BlockLiteral)))); @@ -655,7 +651,7 @@ NSBlock *CYMakeBlock(JSContextRef context, JSObjectRef function, sig::Signature CYBlockDescriptor *descriptor(new CYBlockDescriptor); memset(&descriptor->d_, 0, sizeof(descriptor->d_)); - descriptor->internal_ = CYMakeFunctor_(context, function, signature, &BlockClosure_); + descriptor->internal_ = CYMakeFunctor_(context, function, signature, &BlockAdapter_); literal->invoke = reinterpret_cast(descriptor->internal_->GetValue()); literal->isa = __NSMallocBlock__; @@ -1581,10 +1577,6 @@ static JSValueRef MessageAdapter_(JSContextRef context, size_t count, JSValueRef return CYCallAsFunction(context, function, _this, count - 2, values + 2); } -static void MessageClosure_(ffi_cif *cif, void *result, void **arguments, void *arg) { - CYExecuteClosure(cif, result, arguments, arg, &MessageAdapter_); -} - static JSObjectRef CYMakeMessage(JSContextRef context, SEL sel, IMP imp, const char *type) { Message_privateData *internal(new Message_privateData(sel, type, imp)); return JSObjectMake(context, Message_, internal); @@ -1595,7 +1587,7 @@ static IMP CYMakeMessage(JSContextRef context, JSValueRef value, const char *enc CYPool pool; sig::Signature signature; sig::Parse(pool, &signature, encoding, &Structor_); - Closure_privateData *internal(CYMakeFunctor_(context, function, signature, &MessageClosure_)); + Closure_privateData *internal(CYMakeFunctor_(context, function, signature, &MessageAdapter_)); // XXX: see notes in Library.cpp about needing to leak return reinterpret_cast(internal->GetValue()); } -- 2.47.2