]> git.saurik.com Git - cycript.git/commitdiff
The release pooling mechanism is now becoming scary.
authorJay Freeman (saurik) <saurik@saurik.com>
Wed, 4 Nov 2009 22:25:54 +0000 (22:25 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Wed, 4 Nov 2009 22:25:54 +0000 (22:25 +0000)
Library.cpp
ObjectiveC.mk
ObjectiveC/Library.mm
todo.txt

index bc16967e4fc3e9f2617e51b33979eac6fba6d78b..7a873687ba400708f3bf901d1b885a6dcf7601e3 100644 (file)
@@ -588,6 +588,7 @@ const char *CYPoolCCYON(apr_pool_t *pool, JSContextRef context, JSObjectRef obje
     JSValueRef toCYON(CYGetProperty(context, object, toCYON_s));
     if (CYIsCallable(context, toCYON)) {
         JSValueRef value(CYCallAsFunction(context, (JSObjectRef) toCYON, object, 0, NULL));
+        _assert(value != NULL);
         return CYPoolCString(pool, context, value);
     }
 
@@ -881,7 +882,10 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function,
 
 static JSObjectRef CYMakeFunctor(JSContextRef context, JSObjectRef function, const char *type) {
     Closure_privateData *internal(CYMakeFunctor_(context, function, type, &FunctionClosure_));
-    return JSObjectMake(context, Functor_, internal);
+    JSObjectRef object(JSObjectMake(context, Functor_, internal));
+    // XXX: see above notes about needing to leak
+    JSValueProtect(CYGetJSContext(context), object);
+    return object;
 }
 
 JSObjectRef CYGetCachedObject(JSContextRef context, JSStringRef name) {
index c2837c5d37e1c162db48ea6c151e14f32e6a76a4..6f3e14edf0a45e7401b502eb0294744af765c97c 100644 (file)
@@ -1,5 +1,5 @@
 filters += ObjectiveC
-header += Struct.hpp ObjectiveC/Internal.hpp ObjectiveC/Syntax.hpp
+header += Struct.hpp #ObjectiveC/Internal.hpp ObjectiveC/Syntax.hpp
 code += ObjectiveC/Output.o ObjectiveC/Replace.o ObjectiveC/Library.o
 
 Struct.hpp:
index de56719ebb52bbd373fe9a2ecdca4c34e82a4872..a4b01f1397b727bfe62ab16510275197992ed25e 100644 (file)
@@ -4,14 +4,14 @@
 #include <objc/objc-api.h>
 #endif
 
-#include "ObjectiveC/Internal.hpp"
-
 #ifdef __APPLE__
 #include "Struct.hpp"
 #endif
 
 #include <Foundation/Foundation.h>
 
+#include "ObjectiveC/Internal.hpp"
+
 #include <objc/Protocol.h>
 
 #include "cycript.hpp"
@@ -1297,7 +1297,7 @@ static void CYObjectiveC_CallFunction(JSContextRef context, ffi_cif *cif, void (
     throw CYJSError(context, CYCastJSValue(context, error));
 } }
 
-static bool CYObjectiveC_PoolFFI(apr_pool_t *pool, JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, JSValueRef value) { CYPoolTry  {
+static bool CYObjectiveC_PoolFFI(apr_pool_t *pool, JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, JSValueRef value) { @try  {
     switch (type->primitive) {
         case sig::object_P:
         case sig::typename_P:
@@ -1313,7 +1313,9 @@ static bool CYObjectiveC_PoolFFI(apr_pool_t *pool, JSContextRef context, sig::Ty
     }
 
     return true;
-} CYPoolCatch(false) return /*XXX*/ NULL; }
+} @catch (NSException *error ) {
+    throw CYJSError(context, CYCastJSValue(context, error));
+} }
 
 static JSValueRef CYObjectiveC_FromFFI(JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) { CYPoolTry {
     switch (type->primitive) {
@@ -1421,6 +1423,7 @@ static JSObjectRef CYMakeMessage(JSContextRef context, SEL sel, IMP imp, const c
 static IMP CYMakeMessage(JSContextRef context, JSValueRef value, const char *type) {
     JSObjectRef function(CYCastJSObject(context, value));
     Closure_privateData *internal(CYMakeFunctor_(context, function, type, &MessageClosure_));
+    // XXX: see notes in Library.cpp about needing to leak
     return reinterpret_cast<IMP>(internal->GetValue());
 }
 
index 589584537c3f946a385c71619831c40aae5ccb2e..046c0d03760cf03c5d6bd57321465102923a58fb 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -20,3 +20,4 @@ errors in another process aren't displayed; to fix this, parse errors should get
 CYPoolTry/Catch now carefully save the exception after it /no longer needs the exception/... uhh... wtf?
 throw CYJSError should probably be replaced with CYThrow() across the board
 figure out what to do about global context refs: I really really want to retain the bastards
+the concept of NULL pooling is entirely incorrect and sad... bad... evil... need to work on this... really