]> git.saurik.com Git - cycript.git/commitdiff
Attach FFI closure deallocation to Functor's pool.
authorJay Freeman (saurik) <saurik@saurik.com>
Tue, 29 Dec 2015 22:46:45 +0000 (14:46 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Tue, 29 Dec 2015 22:46:45 +0000 (14:46 -0800)
Execute.cpp

index ced61fcf732fc0e22f94fa67d27003584886813d..7875d8800075ccc5ead7ef41f349b333d9f4e7bf 100644 (file)
@@ -901,9 +901,18 @@ static JSValueRef FunctionAdapter_(JSContextRef context, size_t count, JSValueRe
     return CYCallAsFunction(context, function, NULL, count, values);
 }
 
     return CYCallAsFunction(context, function, NULL, count, values);
 }
 
+#if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
+static void CYFreeFunctor(void *data) {
+    ffi_closure_free(data);
+}
+#else
+static void CYFreeFunctor(void *data) {
+    _syscall(munmap(data, sizeof(ffi_closure)));
+}
+#endif
+
 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
 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, adapter, signature));
 
 #if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
     Closure_privateData *internal(new Closure_privateData(context, function, adapter, signature));
 
 #if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
@@ -913,6 +922,7 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function,
     ffi_status status(ffi_prep_closure_loc(writable, &internal->cif_, &CYExecuteClosure, internal, executable));
     _assert(status == FFI_OK);
 
     ffi_status status(ffi_prep_closure_loc(writable, &internal->cif_, &CYExecuteClosure, internal, executable));
     _assert(status == FFI_OK);
 
+    internal->pool_->atexit(&CYFreeFunctor, writable);
     internal->value_ = executable;
 #else
     ffi_closure *closure((ffi_closure *) _syscall(mmap(
     internal->value_ = executable;
 #else
     ffi_closure *closure((ffi_closure *) _syscall(mmap(
@@ -926,6 +936,7 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function,
 
     _syscall(mprotect(closure, sizeof(*closure), PROT_READ | PROT_EXEC));
 
 
     _syscall(mprotect(closure, sizeof(*closure), PROT_READ | PROT_EXEC));
 
+    internal->pool_->atexit(&CYFreeFunctor, closure);
     internal->value_ = closure;
 #endif
 
     internal->value_ = closure;
 #endif