X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/21d5f610b933e87b7110d629daddeb8f333dcec9..440424e2bd3babd0bb2c266ba931b3c41ccc0f65:/Execute.cpp diff --git a/Execute.cpp b/Execute.cpp index 70cceae..74f29f2 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -131,7 +131,7 @@ size_t CYGetIndex(apr_pool_t *pool, JSContextRef context, JSStringRef value) { static JSClassRef All_; static JSClassRef Context_; -static JSClassRef Functor_; +JSClassRef Functor_; static JSClassRef Global_; static JSClassRef Pointer_; static JSClassRef Struct_; @@ -685,7 +685,7 @@ JSValueRef CYFromFFI(JSContextRef context, sig::Type *type, ffi_type *ffi, void } } -static void FunctionClosure_(ffi_cif *cif, void *result, void **arguments, void *arg) { +void CYExecuteClosure(ffi_cif *cif, void *result, void **arguments, void *arg, JSValueRef (*adapter)(JSContextRef, size_t, JSValueRef[], JSObjectRef)) { Closure_privateData *internal(reinterpret_cast(arg)); JSContextRef context(internal->context_); @@ -696,10 +696,18 @@ static void FunctionClosure_(ffi_cif *cif, void *result, void **arguments, void 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(CYCallAsFunction(context, internal->function_, NULL, count, values)); + JSValueRef value(adapter(context, count, values, internal->function_)); CYPoolFFI(NULL, context, internal->signature_.elements[0].type, internal->cif_.rtype, result, value); } +static JSValueRef FunctionAdapter_(JSContextRef context, size_t count, JSValueRef values[], JSObjectRef function) { + 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 char *type, void (*callback)(ffi_cif *, void *, void **, void *)) { // XXX: in case of exceptions this will leak // XXX: in point of fact, this may /need/ to leak :( @@ -1206,13 +1214,9 @@ static JSValueRef Type_callAsFunction_toCYON(JSContextRef context, JSObjectRef o Type_privateData *internal(reinterpret_cast(JSObjectGetPrivate(_this))); CYPool pool; const char *type(sig::Unparse(pool, internal->type_)); - size_t size(strlen(type)); - char *cyon(new(pool) char[12 + size + 1]); - memcpy(cyon, "new Type(\"", 10); - cyon[12 + size] = '\0'; - cyon[12 + size - 2] = '"'; - cyon[12 + size - 1] = ')'; - memcpy(cyon + 10, type, size); + std::ostringstream str; + CYStringify(str, type, strlen(type)); + char *cyon(apr_pstrcat(pool, "new Type(", str.str().c_str(), ")", NULL)); return CYCastJSValue(context, CYJSString(cyon)); } CYCatch }