]> git.saurik.com Git - cycript.git/commitdiff
Fixed the GC crash of doom that kennytm reported: apparently local contexts come...
authorJay Freeman (saurik) <saurik@saurik.com>
Wed, 4 Nov 2009 09:28:34 +0000 (09:28 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Wed, 4 Nov 2009 09:28:34 +0000 (09:28 +0000)
Internal.hpp
Library.cpp
ObjectiveC/Library.mm
todo.txt

index 13987d4b25789eb2098eecff8990a279ff3ca446..ed0f874e69ffc9728b7f2fdcc6516c27f719f7ff 100644 (file)
 #include "Pooling.hpp"
 
 #include <JavaScriptCore/JSBase.h>
+#include <JavaScriptCore/JSContextRef.h>
 #include <JavaScriptCore/JSObjectRef.h>
 #include <JavaScriptCore/JSValueRef.h>
 
 #include <sig/parse.hpp>
 #include <sig/ffi_type.hpp>
 
+JSGlobalContextRef CYGetJSContext(JSContextRef context);
 void Structor_(apr_pool_t *pool, sig::Type *&type);
 
 struct Type_privateData :
@@ -144,15 +146,16 @@ struct CYOwned :
     CYValue
 {
   private:
-    JSContextRef context_;
+    JSGlobalContextRef context_;
     JSObjectRef owner_;
 
   public:
     CYOwned(void *value, JSContextRef context, JSObjectRef owner) :
         CYValue(value),
-        context_(context),
+        context_(CYGetJSContext(context)),
         owner_(owner)
     {
+        //XXX:JSGlobalContextRetain(context_);
         if (owner_ != NULL)
             JSValueProtect(context_, owner_);
     }
@@ -160,6 +163,7 @@ struct CYOwned :
     virtual ~CYOwned() {
         if (owner_ != NULL)
             JSValueUnprotect(context_, owner_);
+        //XXX:JSGlobalContextRelease(context_);
     }
 
     JSObjectRef GetOwner() const {
@@ -191,19 +195,21 @@ struct Functor :
 struct Closure_privateData :
     cy::Functor
 {
-    JSContextRef context_;
+    JSGlobalContextRef context_;
     JSObjectRef function_;
 
     Closure_privateData(JSContextRef context, JSObjectRef function, const char *type) :
         cy::Functor(type, NULL),
-        context_(context),
+        context_(CYGetJSContext(context)),
         function_(function)
     {
+        //XXX:JSGlobalContextRetain(context_);
         JSValueProtect(context_, function_);
     }
 
     virtual ~Closure_privateData() {
         JSValueUnprotect(context_, function_);
+        //XXX:JSGlobalContextRelease(context_);
     }
 };
 
index 029797db952d6bec28781805bb9ac96136371a92..d9a762641aaf85ab588558b0f4a46f0b034665ef 100644 (file)
@@ -1494,6 +1494,11 @@ CYJSError::CYJSError(JSContextRef context, const char *format, ...) {
     value_ = CYCastJSError(context, message);
 }
 
+JSGlobalContextRef CYGetJSContext(JSContextRef context) {
+    // XXX: do something better
+    return Context_;
+}
+
 JSGlobalContextRef CYGetJSContext() {
     CYInitialize();
 
index c3f073a80206005a134740ae0cd48976d1a46181..a3c1d66b9b784af87a6995630a59e016a231669c 100644 (file)
@@ -1053,13 +1053,15 @@ JSValueRef CYCastJSValue(JSContextRef context, NSObject *value) { CYPoolTry {
 - (id) initWithJSObject:(JSObjectRef)object inContext:(JSContextRef)context { CYObjectiveTry {
     if ((self = [super init]) != nil) {
         object_ = object;
-        context_ = context;
+        context_ = CYGetJSContext(context);
+        //XXX:JSGlobalContextRetain(context_);
         JSValueProtect(context_, object_);
     } return self;
 } CYObjectiveCatch }
 
 - (void) dealloc { CYObjectiveTry {
     JSValueUnprotect(context_, object_);
+    //XXX:JSGlobalContextRelease(context_);
     [super dealloc];
 } CYObjectiveCatch }
 
@@ -1127,13 +1129,15 @@ JSValueRef CYCastJSValue(JSContextRef context, NSObject *value) { CYPoolTry {
 - (id) initWithJSObject:(JSObjectRef)object inContext:(JSContextRef)context { CYObjectiveTry {
     if ((self = [super init]) != nil) {
         object_ = object;
-        context_ = context;
+        context_ = CYGetJSContext(context);
+        //XXX:JSGlobalContextRetain(context_);
         JSValueProtect(context_, object_);
     } return self;
 } CYObjectiveCatch }
 
 - (void) dealloc { CYObjectiveTry {
     JSValueUnprotect(context_, object_);
+    //XXX:JSGlobalContextRelease(context_);
     [super dealloc];
 } CYObjectiveCatch }
 
index 1c9c3d8bf356f8f174b03dc68a75f116024266ef..60e8c151afa566ea2d3b047e538d75fdc76321ea 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -21,3 +21,4 @@ b = []; for (x in a) b.push(x); <- crashes
 errors in another process aren't displayed; to fix this, parse errors should get converted to exceptions and thrown
 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