Objective-C API: JSObjCClassInfo creates reference cycle with JSContext
[WebKit-https.git] / Source / JavaScriptCore / API / JSContext.mm
index c0f01fe..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 HashMap<JSValueRef, size_t> ProtectMap;
-
 @implementation JSContext {
     JSVirtualMachine *m_virtualMachine;
     JSGlobalContextRef m_context;
     JSWrapperMap *m_wrapperMap;
-    ProtectMap m_protectCounts;
 }
 
 @synthesize exception;
@@ -65,7 +63,7 @@ typedef HashMap<JSValueRef, size_t> ProtectMap;
     m_wrapperMap = [[JSWrapperMap alloc] initWithContext:self];
 
     self.exception = nil;
-    self.exceptionHandler = ^(JSContextcontext, JSValue *exceptionValue) {
+    self.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
         context.exception = exceptionValue;
     };
 
@@ -86,6 +84,11 @@ typedef 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];
@@ -126,7 +129,7 @@ typedef HashMap<JSValueRef, size_t> ProtectMap;
     return entry->currentArguments;
 }
 
-- (JSVirtualMachine*)virtualMachine
+- (JSVirtualMachine *)virtualMachine
 {
     return m_virtualMachine;
 }
@@ -149,7 +152,7 @@ typedef HashMap<JSValueRef, size_t> ProtectMap;
 
 @implementation JSContext(Internal)
 
-JSGlobalContextRef contextInternalContext(JSContextcontext)
+JSGlobalContextRef contextInternalContext(JSContext *context)
 {
     return context->m_context;
 }
@@ -157,12 +160,6 @@ JSGlobalContextRef contextInternalContext(JSContext* context)
 - (void)dealloc
 {
     toJS(m_context)->lexicalGlobalObject()->m_apiData = 0;
-
-    ProtectMap::iterator iterator = m_protectCounts.begin();
-    ProtectMap::iterator end = m_protectCounts.end();
-    for (; iterator != end; ++iterator)
-        JSValueUnprotect(m_context, iterator->key);
-
     [m_wrapperMap release];
     JSGlobalContextRelease(m_context);
     [m_virtualMachine release];
@@ -207,31 +204,6 @@ JSGlobalContextRef contextInternalContext(JSContext* context)
     [self release];
 }
 
-- (void)protect:(JSValueRef)value
-{
-    // Lock access to m_protectCounts
-    JSC::JSLockHolder lock(toJS(m_context));
-
-    ProtectMap::AddResult result = m_protectCounts.add(value, 1);
-    if (result.isNewEntry)
-        JSValueProtect(m_context, value);
-    else
-        ++result.iterator->value;
-}
-
-- (void)unprotect:(JSValueRef)value
-{
-    // Lock access to m_protectCounts
-    JSC::JSLockHolder lock(toJS(m_context));
-
-    ProtectMap::iterator iterator = m_protectCounts.find(value);
-    if (iterator->value == 1) {
-        m_protectCounts.remove(value);
-        JSValueUnprotect(m_context, value);
-    } else
-        --iterator->value;
-}
-
 - (JSValue *)wrapperForObject:(id)object
 {
     // Lock access to m_wrapperMap