From: Jay Freeman (saurik) Date: Mon, 19 Mar 2012 00:54:03 +0000 (-0700) Subject: Use ffi_closure_alloc and ffi_prep_closure_loc on ARM. X-Git-Tag: v0.9.455~36 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/c5bce670df0c89daf56f0bf07b8e34b9944bc12a?ds=inline Use ffi_closure_alloc and ffi_prep_closure_loc on ARM. --- diff --git a/Execute.cpp b/Execute.cpp index c6a5a99..13da508 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -695,6 +695,15 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, // XXX: in point of fact, this may /need/ to leak :( Closure_privateData *internal(new Closure_privateData(context, function, type)); +#if defined(__APPLE__) && defined(__arm__) + 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)); + _assert(status == FFI_OK); + + internal->value_ = executable; +#else ffi_closure *closure((ffi_closure *) _syscall(mmap( NULL, sizeof(ffi_closure), PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, @@ -707,6 +716,7 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, _syscall(mprotect(closure, sizeof(*closure), PROT_READ | PROT_EXEC)); internal->value_ = closure; +#endif return internal; }