Objective-C API: JSObjCClassInfo creates reference cycle with JSContext
[WebKit-https.git] / Source / JavaScriptCore / API / JSContext.mm
index 29391cc..99b66e1 100644 (file)
 #import "JSWrapperMap.h"
 #import "JavaScriptCore.h"
 #import "ObjcRuntimeExtras.h"
+#import "Operations.h"
 #import <wtf/HashSet.h>
 
 #if JS_OBJC_API_ENABLED
 
-typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
-
 @implementation JSContext {
     JSVirtualMachine *m_virtualMachine;
     JSGlobalContextRef m_context;
     JSWrapperMap *m_wrapperMap;
-    ProtectMap m_protected;
 }
 
 @synthesize exception;
@@ -56,14 +54,16 @@ typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
 
 - (id)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine
 {
-    [super init];
+    self = [super init];
+    if (!self)
+        return nil;
 
     m_virtualMachine = [virtualMachine retain];
     m_context = JSGlobalContextCreateInGroup(getGroupFromVirtualMachine(virtualMachine), 0);
     m_wrapperMap = [[JSWrapperMap alloc] initWithContext:self];
 
     self.exception = nil;
-    self.exceptionHandler = ^(JSContextcontext, JSValue *exceptionValue) {
+    self.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
         context.exception = exceptionValue;
     };
 
@@ -84,6 +84,11 @@ typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
     return [JSValue valueWithValue:result inContext:self];
 }
 
+- (JSWrapperMap *)wrapperMap
+{
+    return m_wrapperMap;
+}
+
 - (JSValue *)globalObject
 {
     return [JSValue valueWithValue:JSContextGetGlobalObject(m_context) inContext:self];
@@ -115,16 +120,16 @@ typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
     if (!entry->currentArguments) {
         JSContext *context = [JSContext currentContext];
         size_t count = entry->argumentCount;
-        JSValue * args[count];
+        JSValue * argumentArray[count];
         for (size_t i =0; i < count; ++i)
-            args[i] = [JSValue valueWithValue:entry->arguments[i] inContext:context];
-        entry->currentArguments = [[NSArray alloc] initWithObjects:args count:count];
+            argumentArray[i] = [JSValue valueWithValue:entry->arguments[i] inContext:context];
+        entry->currentArguments = [[NSArray alloc] initWithObjects:argumentArray count:count];
     }
 
     return entry->currentArguments;
 }
 
-- (JSVirtualMachine*)virtualMachine
+- (JSVirtualMachine *)virtualMachine
 {
     return m_virtualMachine;
 }
@@ -138,7 +143,7 @@ typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
     return [self globalObject][key];
 }
 
-- (void)setObject:(id)object forKeyedSubscript:(id <NSCopying>)key
+- (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying> *)key
 {
     [self globalObject][key] = object;
 }
@@ -147,7 +152,7 @@ typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
 
 @implementation JSContext(Internal)
 
-JSGlobalContextRef contextInternalContext(JSContextcontext)
+JSGlobalContextRef contextInternalContext(JSContext *context)
 {
     return context->m_context;
 }
@@ -155,12 +160,6 @@ JSGlobalContextRef contextInternalContext(JSContext* context)
 - (void)dealloc
 {
     toJS(m_context)->lexicalGlobalObject()->m_apiData = 0;
-
-    ProtectMap::iterator iterator = m_protected.begin();
-    ProtectMap::iterator end = m_protected.end();
-    for (; iterator != end; ++iterator)
-        JSValueUnprotect(m_context, iterator->key);
-
     [m_wrapperMap release];
     JSGlobalContextRelease(m_context);
     [m_virtualMachine release];
@@ -205,31 +204,6 @@ JSGlobalContextRef contextInternalContext(JSContext* context)
     [self release];
 }
 
-- (void)protect:(JSValueRef)value
-{
-    // Lock access to m_protected
-    JSC::JSLockHolder lock(toJS(m_context));
-
-    ProtectMap::AddResult result = m_protected.add(value, 1);
-    if (result.isNewEntry)
-        JSValueProtect(m_context, value);
-    else
-        ++result.iterator->value;
-}
-
-- (void)unprotect:(JSValueRef)value
-{
-    // Lock access to m_protected
-    JSC::JSLockHolder lock(toJS(m_context));
-
-    ProtectMap::iterator iterator = m_protected.find(value);
-    if (iterator->value == 1) {
-        m_protected.remove(value);
-        JSValueUnprotect(m_context, value);
-    } else
-        --iterator->value;
-}
-
 - (JSValue *)wrapperForObject:(id)object
 {
     // Lock access to m_wrapperMap