Changeset 146494 in webkit


Ignore:
Timestamp:
Mar 21, 2013 12:06:05 PM (11 years ago)
Author:
mhahnenberg@apple.com
Message:

Objective-C API: wrapperClass holds a static JSClassRef, which causes JSGlobalObjects to leak
https://bugs.webkit.org/show_bug.cgi?id=112856

Reviewed by Geoffrey Garen.

Through a very convoluted path that involves the caching of prototypes on the JSClassRef, we can leak
JSGlobalObjects when inserting an Objective-C object into multiple independent JSContexts.

  • API/JSAPIWrapperObject.cpp: Removed.
  • API/JSAPIWrapperObject.h:

(JSAPIWrapperObject):

  • API/JSAPIWrapperObject.mm: Copied from Source/JavaScriptCore/API/JSAPIWrapperObject.cpp. Made this an

Objective-C++ file so that we can call release on the wrappedObject. Also added a WeakHandleOwner for
JSAPIWrapperObjects. This will also be used in a future patch for https://bugs.webkit.org/show_bug.cgi?id=112608.
(JSAPIWrapperObjectHandleOwner):
(jsAPIWrapperObjectHandleOwner):
(JSAPIWrapperObjectHandleOwner::finalize): This finalize replaces the old finalize that was done through
the C API.
(JSC::JSAPIWrapperObject::finishCreation): Allocate the WeakImpl. Balanced in finalize.
(JSC::JSAPIWrapperObject::setWrappedObject): We now do the retain of the wrappedObject here rather than in random
places scattered around JSWrapperMap.mm

  • API/JSObjectRef.cpp: Added some ifdefs for platforms that don't support the Obj-C API.

(JSObjectGetPrivate): Ditto.
(JSObjectSetPrivate): Ditto.
(JSObjectGetPrivateProperty): Ditto.
(JSObjectSetPrivateProperty): Ditto.
(JSObjectDeletePrivateProperty): Ditto.

  • API/JSValueRef.cpp: Ditto.

(JSValueIsObjectOfClass): Ditto.

  • API/JSWrapperMap.mm: Remove wrapperClass().

(objectWithCustomBrand): Change to no longer use a parent class, which was only used to give the ability to
finalize wrapper objects.
(-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]): Change to no longer use wrapperClass().
(-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): Ditto.
(tryUnwrapObjcObject): We now check if the object inherits from JSAPIWrapperObject.

  • API/tests/testapi.mm: Added a test that exports an Objective-C object to two different JSContexts and makes

sure that the first one is collected properly by using a weak JSManagedValue for the wrapper in the first JSContext.

  • CMakeLists.txt: Build file modifications.
  • GNUmakefile.list.am: Ditto.
  • JavaScriptCore.gypi: Ditto.
  • JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto.
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Ditto.
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
  • JavaScriptCore.xcodeproj/project.pbxproj: Ditto.
  • runtime/JSGlobalObject.cpp: More ifdefs for unsupported platforms.

(JSC::JSGlobalObject::reset): Ditto.
(JSC::JSGlobalObject::visitChildren): Ditto.

  • runtime/JSGlobalObject.h: Ditto.

(JSGlobalObject): Ditto.
(JSC::JSGlobalObject::objcCallbackFunctionStructure): Ditto.

Location:
trunk/Source/JavaScriptCore
Files:
16 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/API/JSAPIWrapperObject.h

    r145119 r146494  
    3131#include "WeakReferenceHarvester.h"
    3232
     33#if JSC_OBJC_API_ENABLED
     34
    3335namespace JSC {
    3436   
     
    3739    typedef JSDestructibleObject Base;
    3840   
     41    void finishCreation(JSGlobalData&);
    3942    static void visitChildren(JSCell*, JSC::SlotVisitor&);
    4043   
    4144    void* wrappedObject() { return m_wrappedObject; }
    42     void setWrappedObject(void* wrappedObject) { m_wrappedObject = wrappedObject; }
     45    void setWrappedObject(void*);
    4346
    4447protected:
     
    5356} // namespace JSC
    5457
     58#endif
     59
    5560#endif // JSAPIWrapperObject_h
  • trunk/Source/JavaScriptCore/API/JSAPIWrapperObject.mm

    r146408 r146494  
    3434#include "StructureInlines.h"
    3535
     36#if JSC_OBJC_API_ENABLED
     37
     38class JSAPIWrapperObjectHandleOwner : public JSC::WeakHandleOwner {
     39public:
     40    virtual void finalize(JSC::Handle<JSC::Unknown>, void*);
     41};
     42
     43static JSAPIWrapperObjectHandleOwner* jsAPIWrapperObjectHandleOwner()
     44{
     45    DEFINE_STATIC_LOCAL(JSAPIWrapperObjectHandleOwner, jsWrapperObjectHandleOwner, ());
     46    return &jsWrapperObjectHandleOwner;
     47}
     48
     49void JSAPIWrapperObjectHandleOwner::finalize(JSC::Handle<JSC::Unknown> handle, void*)
     50{
     51    JSC::WeakSet::deallocate(JSC::WeakImpl::asWeakImpl(handle.slot()));
     52    JSC::JSAPIWrapperObject* wrapperObject = JSC::jsCast<JSC::JSAPIWrapperObject*>(handle.get().asCell());
     53    if (!wrapperObject->wrappedObject())
     54        return;
     55    [static_cast<id>(wrapperObject->wrappedObject()) release];
     56}
     57
    3658namespace JSC {
    3759   
    38 template <> const ClassInfo JSCallbackObject<JSAPIWrapperObject>::s_info = { "EnumerableCallbackObject", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSCallbackObject) };
     60template <> const ClassInfo JSCallbackObject<JSAPIWrapperObject>::s_info = { "JSAPIWrapperObject", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSCallbackObject) };
    3961
    4062template<> const bool JSCallbackObject<JSAPIWrapperObject>::needsDestruction = true;
     
    5274}
    5375
     76void JSAPIWrapperObject::finishCreation(JSGlobalData& globalData)
     77{
     78    Base::finishCreation(globalData);
     79    WeakSet::allocate(this, jsAPIWrapperObjectHandleOwner(), 0); // Balanced in JSAPIWrapperObjectHandleOwner::finalize.
     80}
     81   
     82void JSAPIWrapperObject::setWrappedObject(void* wrappedObject)
     83{
     84    ASSERT(!m_wrappedObject);
     85    m_wrappedObject = [static_cast<id>(wrappedObject) retain];
     86}
     87
    5488void JSAPIWrapperObject::visitChildren(JSCell* cell, JSC::SlotVisitor& visitor)
    5589{
     
    6397
    6498} // namespace JSC
     99
     100#endif // JSC_OBJC_API_ENABLED
  • trunk/Source/JavaScriptCore/API/JSObjectRef.cpp

    r145119 r146494  
    347347    if (jsObject->inherits(&JSCallbackObject<JSDestructibleObject>::s_info))
    348348        return jsCast<JSCallbackObject<JSDestructibleObject>*>(jsObject)->getPrivate();
     349#if JSC_OBJC_API_ENABLED
    349350    if (jsObject->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info))
    350351        return jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->getPrivate();
     352#endif
    351353   
    352354    return 0;
     
    365367        return true;
    366368    }
     369#if JSC_OBJC_API_ENABLED
    367370    if (jsObject->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info)) {
    368371        jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->setPrivate(data);
    369372        return true;
    370373    }
     374#endif
    371375       
    372376    return false;
     
    384388    else if (jsObject->inherits(&JSCallbackObject<JSDestructibleObject>::s_info))
    385389        result = jsCast<JSCallbackObject<JSDestructibleObject>*>(jsObject)->getPrivateProperty(name);
     390#if JSC_OBJC_API_ENABLED
    386391    else if (jsObject->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info))
    387392        result = jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->getPrivateProperty(name);
     393#endif
    388394    return toRef(exec, result);
    389395}
     
    404410        return true;
    405411    }
     412#if JSC_OBJC_API_ENABLED
    406413    if (jsObject->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info)) {
    407414        jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->setPrivateProperty(exec->globalData(), name, jsValue);
    408415        return true;
    409416    }
     417#endif
    410418    return false;
    411419}
     
    425433        return true;
    426434    }
     435#if JSC_OBJC_API_ENABLED
    427436    if (jsObject->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info)) {
    428437        jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->deletePrivateProperty(name);
    429438        return true;
    430439    }
     440#endif
    431441    return false;
    432442}
  • trunk/Source/JavaScriptCore/API/JSValueRef.cpp

    r145119 r146494  
    150150        if (o->inherits(&JSCallbackObject<JSDestructibleObject>::s_info))
    151151            return jsCast<JSCallbackObject<JSDestructibleObject>*>(o)->inherits(jsClass);
     152#if JSC_OBJC_API_ENABLED
    152153        if (o->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info))
    153154            return jsCast<JSCallbackObject<JSAPIWrapperObject>*>(o)->inherits(jsClass);
     155#endif
    154156    }
    155157    return false;
  • trunk/Source/JavaScriptCore/API/JSWrapperMap.mm

    r146392 r146494  
    5050@end
    5151
    52 static void wrapperFinalize(JSObjectRef object)
    53 {
    54     JSC::JSAPIWrapperObject* wrapperObject = JSC::jsCast<JSC::JSAPIWrapperObject*>(toJS(object));
    55     [(id)wrapperObject->wrappedObject() release];
    56 }
    57 
    58 // All wrapper objects and constructor objects derive from this type, so we can detect & unwrap Objective-C instances/Classes.
    59 static JSClassRef wrapperClass()
    60 {
    61     static SpinLock initLock = SPINLOCK_INITIALIZER;
    62     SpinLockHolder lockHolder(&initLock);
    63 
    64     static JSClassRef classRef = 0;
    65 
    66     if (!classRef) {
    67         JSClassDefinition definition;
    68         definition = kJSClassDefinitionEmpty;
    69         definition.className = "objc_class";
    70         definition.finalize = wrapperFinalize;
    71         classRef = JSClassCreate(&definition);
    72     }
    73 
    74     return classRef;
    75 }
    76 
    7752// Default conversion of selectors to property names.
    7853// All semicolons are removed, lowercase letters following a semicolon are capitalized.
     
    136111// other than that it has a native brand set that will be displayed by the default
    137112// Object.prototype.toString conversion.
    138 static JSValue *objectWithCustomBrand(JSContext *context, NSString *brand, JSClassRef parentClass = 0, Class cls = 0)
     113static JSValue *objectWithCustomBrand(JSContext *context, NSString *brand, Class cls = 0)
    139114{
    140115    JSClassDefinition definition;
    141116    definition = kJSClassDefinitionEmpty;
    142117    definition.className = [brand UTF8String];
    143     definition.parentClass = parentClass;
    144118    JSClassRef classRef = JSClassCreate(&definition);
    145119    JSObjectRef result = makeWrapper([context globalContextRef], classRef, cls);
     
    343317    definition = kJSClassDefinitionEmpty;
    344318    definition.className = className;
    345     definition.parentClass = wrapperClass();
    346319    m_classRef = JSClassCreate(&definition);
    347320
     
    385358            constructor = [JSValue valueWithValue:toRef(m_constructor.get()) inContext:m_context];
    386359        else
    387             constructor = objectWithCustomBrand(m_context, [NSString stringWithFormat:@"%sConstructor", className], wrapperClass(), [m_class retain]);
     360            constructor = objectWithCustomBrand(m_context, [NSString stringWithFormat:@"%sConstructor", className], m_class);
    388361
    389362        JSContextRef cContext = [m_context globalContextRef];
     
    423396    ASSERT(!!m_prototype);
    424397
    425     JSObjectRef wrapper = makeWrapper([m_context globalContextRef], m_classRef, [object retain]);
     398    JSObjectRef wrapper = makeWrapper([m_context globalContextRef], m_classRef, object);
    426399    JSObjectSetPrototype([m_context globalContextRef], wrapper, toRef(m_prototype.get()));
    427400    return [JSValue valueWithValue:wrapper inContext:m_context];
     
    526499    JSObjectRef object = JSValueToObject(context, value, &exception);
    527500    ASSERT(!exception);
    528     if (JSValueIsObjectOfClass(context, object, wrapperClass()))
     501    if (toJS(object)->inherits(&JSC::JSCallbackObject<JSC::JSAPIWrapperObject>::s_info))
    529502        return (id)JSC::jsCast<JSC::JSAPIWrapperObject*>(toJS(object))->wrappedObject();
    530503    if (id target = tryUnwrapBlock(object))
  • trunk/Source/JavaScriptCore/API/tests/testapi.mm

    r146392 r146494  
    524524        context[@"testObject"] = testObject;
    525525        JSValue *result = [context evaluateScript:@"Function.prototype.toString.call(testObject.callback)"];
    526         NSLog(@"toString = %@", [result toString]);
    527526        checkResult(@"Function.prototype.toString", !context.exception && ![result isUndefined]);
    528527    }
     
    630629        }
    631630    }
     631
     632    @autoreleasepool {
     633        JSVirtualMachine *vm = [[JSVirtualMachine alloc] init];
     634        TestObject *testObject = [TestObject testObject];
     635        JSManagedValue *weakValue;
     636        @autoreleasepool {
     637            JSContext *context = [[JSContext alloc] initWithVirtualMachine:vm];
     638            context[@"testObject"] = testObject;
     639            weakValue = [[JSManagedValue alloc] initWithValue:context[@"testObject"]];
     640        }
     641
     642        @autoreleasepool {
     643            JSContext *context = [[JSContext alloc] initWithVirtualMachine:vm];
     644            context[@"testObject"] = testObject;
     645            JSSynchronousGarbageCollectForDebugging([context globalContextRef]);
     646            checkResult(@"weak value == nil", ![weakValue value]);
     647            checkResult(@"root is still alive", ![context[@"testObject"] isUndefined]);
     648        }
     649    }
     650
    632651}
    633652
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r146089 r146494  
    2525
    2626set(JavaScriptCore_SOURCES
    27     API/JSAPIWrapperObject.cpp
    2827    API/JSBase.cpp
    2928    API/JSCallbackConstructor.cpp
  • trunk/Source/JavaScriptCore/ChangeLog

    r146489 r146494  
     12013-03-21  Mark Hahnenberg  <mhahnenberg@apple.com>
     2
     3        Objective-C API: wrapperClass holds a static JSClassRef, which causes JSGlobalObjects to leak
     4        https://bugs.webkit.org/show_bug.cgi?id=112856
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Through a very convoluted path that involves the caching of prototypes on the JSClassRef, we can leak
     9        JSGlobalObjects when inserting an Objective-C object into multiple independent JSContexts.
     10
     11        * API/JSAPIWrapperObject.cpp: Removed.
     12        * API/JSAPIWrapperObject.h:
     13        (JSAPIWrapperObject):
     14        * API/JSAPIWrapperObject.mm: Copied from Source/JavaScriptCore/API/JSAPIWrapperObject.cpp. Made this an
     15        Objective-C++ file so that we can call release on the wrappedObject. Also added a WeakHandleOwner for
     16        JSAPIWrapperObjects. This will also be used in a future patch for https://bugs.webkit.org/show_bug.cgi?id=112608.
     17        (JSAPIWrapperObjectHandleOwner):
     18        (jsAPIWrapperObjectHandleOwner):
     19        (JSAPIWrapperObjectHandleOwner::finalize): This finalize replaces the old finalize that was done through
     20        the C API.
     21        (JSC::JSAPIWrapperObject::finishCreation): Allocate the WeakImpl. Balanced in finalize.
     22        (JSC::JSAPIWrapperObject::setWrappedObject): We now do the retain of the wrappedObject here rather than in random
     23        places scattered around JSWrapperMap.mm
     24        * API/JSObjectRef.cpp: Added some ifdefs for platforms that don't support the Obj-C API.
     25        (JSObjectGetPrivate): Ditto.
     26        (JSObjectSetPrivate): Ditto.
     27        (JSObjectGetPrivateProperty): Ditto.
     28        (JSObjectSetPrivateProperty): Ditto.
     29        (JSObjectDeletePrivateProperty): Ditto.
     30        * API/JSValueRef.cpp: Ditto.
     31        (JSValueIsObjectOfClass): Ditto.
     32        * API/JSWrapperMap.mm: Remove wrapperClass().
     33        (objectWithCustomBrand): Change to no longer use a parent class, which was only used to give the ability to
     34        finalize wrapper objects.
     35        (-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]): Change to no longer use wrapperClass().
     36        (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): Ditto.
     37        (tryUnwrapObjcObject): We now check if the object inherits from JSAPIWrapperObject.
     38        * API/tests/testapi.mm: Added a test that exports an Objective-C object to two different JSContexts and makes
     39        sure that the first one is collected properly by using a weak JSManagedValue for the wrapper in the first JSContext.
     40        * CMakeLists.txt: Build file modifications.
     41        * GNUmakefile.list.am: Ditto.
     42        * JavaScriptCore.gypi: Ditto.
     43        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto.
     44        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Ditto.
     45        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
     46        * JavaScriptCore.xcodeproj/project.pbxproj: Ditto.
     47        * runtime/JSGlobalObject.cpp: More ifdefs for unsupported platforms.
     48        (JSC::JSGlobalObject::reset): Ditto.
     49        (JSC::JSGlobalObject::visitChildren): Ditto.
     50        * runtime/JSGlobalObject.h: Ditto.
     51        (JSGlobalObject): Ditto.
     52        (JSC::JSGlobalObject::objcCallbackFunctionStructure): Ditto.
     53
    1542013-03-21  Anton Muhin  <antonm@chromium.org>
    255
  • trunk/Source/JavaScriptCore/GNUmakefile.list.am

    r146089 r146494  
    3535        Source/JavaScriptCore/API/APICast.h \
    3636        Source/JavaScriptCore/API/APIShims.h \
    37     Source/JavaScriptCore/API/JSAPIWrapperObject.cpp \
    3837    Source/JavaScriptCore/API/JSAPIWrapperObject.h \
    3938        Source/JavaScriptCore/API/JSBase.cpp \
  • trunk/Source/JavaScriptCore/JavaScriptCore.gypi

    r145504 r146494  
    3737            'API/JavaScriptCore.h',
    3838            'API/JavaScript.h',
    39             'API/JSAPIWrapperObject.cpp',
    4039            'API/JSAPIWrapperObject.h',
    4140            'API/JSBase.cpp',
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj

    r145848 r146494  
    14191419                        </File>
    14201420                        <File
    1421                                 RelativePath="..\..\API\JSAPIWrapperObject.cpp"
    1422                                 >
    1423                         </File>
    1424                         <File
    14251421                                RelativePath="..\..\API\JSAPIWrapperObject.h"
    14261422                                >
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj

    r146131 r146494  
    145145  </ItemDefinitionGroup>
    146146  <ItemGroup>
    147     <ClCompile Include="..\API\JSAPIWrapperObject.cpp" />
    148147    <ClCompile Include="..\API\JSBase.cpp" />
    149148    <ClCompile Include="..\API\JSCallbackConstructor.cpp" />
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters

    r145129 r146494  
    751751      <Filter>runtime</Filter>
    752752    </ClCompile>
    753     <ClCompile Include="..\API\JSAPIWrapperObject.cpp">
    754       <Filter>API</Filter>
    755     </ClCompile>
    756753  </ItemGroup>
    757754  <ItemGroup>
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r145489 r146494  
    844844                C2C8D03014A3CEFC00578E65 /* CopiedBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = C2C8D02E14A3CEFC00578E65 /* CopiedBlock.h */; settings = {ATTRIBUTES = (Private, ); }; };
    845845                C2C8D03114A3CEFC00578E65 /* HeapBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = C2C8D02F14A3CEFC00578E65 /* HeapBlock.h */; settings = {ATTRIBUTES = (Private, ); }; };
    846                 C2CF39C116E15A8100DD69BE /* JSAPIWrapperObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2CF39BF16E15A8100DD69BE /* JSAPIWrapperObject.cpp */; };
     846                C2CF39C116E15A8100DD69BE /* JSAPIWrapperObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = C2CF39BF16E15A8100DD69BE /* JSAPIWrapperObject.mm */; };
    847847                C2CF39C216E15A8100DD69BE /* JSAPIWrapperObject.h in Headers */ = {isa = PBXBuildFile; fileRef = C2CF39C016E15A8100DD69BE /* JSAPIWrapperObject.h */; };
    848848                C2D58C3415912FEE0021A844 /* GCActivityCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2D58C3315912FEE0021A844 /* GCActivityCallback.cpp */; };
     
    17461746                C2C8D02E14A3CEFC00578E65 /* CopiedBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CopiedBlock.h; sourceTree = "<group>"; };
    17471747                C2C8D02F14A3CEFC00578E65 /* HeapBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeapBlock.h; sourceTree = "<group>"; };
    1748                 C2CF39BF16E15A8100DD69BE /* JSAPIWrapperObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAPIWrapperObject.cpp; sourceTree = "<group>"; };
     1748                C2CF39BF16E15A8100DD69BE /* JSAPIWrapperObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = JSAPIWrapperObject.mm; sourceTree = "<group>"; };
    17491749                C2CF39C016E15A8100DD69BE /* JSAPIWrapperObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAPIWrapperObject.h; sourceTree = "<group>"; };
    17501750                C2D58C3315912FEE0021A844 /* GCActivityCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GCActivityCallback.cpp; sourceTree = "<group>"; };
     
    22232223                                C25D709916DE99F400FCA6BC /* JSManagedValue.mm */,
    22242224                                C25D709A16DE99F400FCA6BC /* JSManagedValue.h */,
    2225                                 C2CF39BF16E15A8100DD69BE /* JSAPIWrapperObject.cpp */,
     2225                                C2CF39BF16E15A8100DD69BE /* JSAPIWrapperObject.mm */,
    22262226                                C2CF39C016E15A8100DD69BE /* JSAPIWrapperObject.h */,
    22272227                        );
     
    38133813                                0FF0F19E16B72A0B005DF95B /* DFGEdge.cpp in Sources */,
    38143814                                0FBC0AE71496C7C400D4FBDD /* DFGExitProfile.cpp in Sources */,
    3815                                 C2CF39C116E15A8100DD69BE /* JSAPIWrapperObject.cpp in Sources */,
     3815                                C2CF39C116E15A8100DD69BE /* JSAPIWrapperObject.mm in Sources */,
    38163816                                0F2BDC15151C5D4D00CD8910 /* DFGFixupPhase.cpp in Sources */,
    38173817                                86EC9DC71328DF82002B2AD7 /* DFGGraph.cpp in Sources */,
  • trunk/Source/JavaScriptCore/Target.pri

    r145700 r146494  
    3434
    3535SOURCES += \
    36     API/JSAPIWrapperObject.cpp \
    3736    API/JSBase.cpp \
    3837    API/JSCallbackConstructor.cpp \
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp

    r145848 r146494  
    234234#if JSC_OBJC_API_ENABLED
    235235    m_objcCallbackFunctionStructure.set(exec->globalData(), this, ObjCCallbackFunction::createStructure(exec->globalData(), this, m_functionPrototype.get()));
     236    m_objcWrapperObjectStructure.set(exec->globalData(), this, JSCallbackObject<JSAPIWrapperObject>::createStructure(exec->globalData(), this, m_objectPrototype.get()));
    236237#endif
    237     m_objcWrapperObjectStructure.set(exec->globalData(), this, JSCallbackObject<JSAPIWrapperObject>::createStructure(exec->globalData(), this, m_objectPrototype.get()));
    238238
    239239    m_arrayPrototype.set(exec->globalData(), this, ArrayPrototype::create(exec, this, ArrayPrototype::createStructure(exec->globalData(), this, m_objectPrototype.get())));
     
    520520#if JSC_OBJC_API_ENABLED
    521521    visitor.append(&thisObject->m_objcCallbackFunctionStructure);
     522    visitor.append(&thisObject->m_objcWrapperObjectStructure);
    522523#endif
    523     visitor.append(&thisObject->m_objcWrapperObjectStructure);
    524524    visitor.append(&thisObject->m_dateStructure);
    525525    visitor.append(&thisObject->m_nullPrototypeObjectStructure);
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h

    r145848 r146494  
    145145#if JSC_OBJC_API_ENABLED
    146146    WriteBarrier<Structure> m_objcCallbackFunctionStructure;
     147    WriteBarrier<Structure> m_objcWrapperObjectStructure;
    147148#endif
    148     WriteBarrier<Structure> m_objcWrapperObjectStructure;
    149149    WriteBarrier<Structure> m_dateStructure;
    150150    WriteBarrier<Structure> m_nullPrototypeObjectStructure;
     
    308308#if JSC_OBJC_API_ENABLED
    309309    Structure* objcCallbackFunctionStructure() const { return m_objcCallbackFunctionStructure.get(); }
     310    Structure* objcWrapperObjectStructure() const { return m_objcWrapperObjectStructure.get(); }
    310311#endif
    311     Structure* objcWrapperObjectStructure() const { return m_objcWrapperObjectStructure.get(); }
    312312    Structure* dateStructure() const { return m_dateStructure.get(); }
    313313    Structure* nullPrototypeObjectStructure() const { return m_nullPrototypeObjectStructure.get(); }
Note: See TracChangeset for help on using the changeset viewer.