[Webkit-unassigned] [Bug 201907] New: JSClassRef leaks which referenced by JSGlobalObject::m_rareData::opaqueJSClassData

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Tue Sep 17 23:41:09 PDT 2019


https://bugs.webkit.org/show_bug.cgi?id=201907

            Bug ID: 201907
           Summary: JSClassRef leaks which referenced by
                    JSGlobalObject::m_rareData::opaqueJSClassData
           Product: WebKit
           Version: WebKit Local Build
          Hardware: All
                OS: All
            Status: NEW
          Severity: Normal
          Priority: P2
         Component: JavaScriptCore
          Assignee: webkit-unassigned at lists.webkit.org
          Reporter: yusj_sw at 126.com

// 1. C++ Code
class MyClass {
 public:
  MyClass() {}
  ~MyClass() {}
};

JSValueRef GetX(JSContextRef context, JSObjectRef object,
    JSStringRef propertyName, JSValueRef* exception) {
  // do nothing.
  return nullptr;
}

bool SetX(JSContextRef context, JSObjectRef object, JSStringRef propertyName,
    JSValueRef value, JSValueRef* exception) {
  return true;
}

JSStaticValue fields[] = {
  { "X", GetX, SetX, kJSPropertyAttributeNone },
  { 0, 0, 0, 0 }
};

void JSObjectFinalizeCallback(JSObjectRef object) {
  delete static_cast<MyClass*>(JSObjectGetPrivate(object));
}

JSValueRef CreateObjectCallback(JSContextRef context, JSObjectRef function,
    JSObjectRef thiz, size_t argc, const JSValueRef arguments[],
    JSValueRef* exception) {
  JSClassDefinition definition = kJSClassDefinitionEmpty;
  definition.attributes   = kJSClassAttributeNoAutomaticPrototype;
  definition.staticValues = fields;
  definition.finalize     = &JSObjectFinalizeCallback;
  JSClassRef clazz = JSClassCreate(&definition);
  JSObjectRef obj = JSObjectMake(context, clazz, new MyClass());
  JSClassRelease(clazz);
  return obj;
}

void Init(JSContxtRef context) {
  // register JS global function 'createMyObject()'
  JSStringRef name = JSStringCreateWithUTF8CString("createMyObject");
  JSObjectRef function = JSObjectMakeFunctionWithCallback(
      context, name, &CreateObjectCallback);
  JSObjectRef global = JSContextGetGlobalObject(context);
  JSObjectSetProperty(context, global, name, function,
                      kJSPropertyAttributeNone, nullptr);
  JSStringRelease(name);
}


// 2. JS Code
for (var i = 0; i < 100000; ++i) {
  createMyObject().X;
}
// %DoJavaScriptGC()%


// 3. Result
We have 100000 JSClassRef objects, they are all referenced by JSGlobalObject::m_rareData::opaqueJSClassData,
even though all the binding JS Objects have been GC-ed.
The bugly reference call stack is:

#0  WTF::ThreadSafeRefCountedBase::ref (this=0xe50a4120) at WTF/wtf/ThreadSafeRefCounted.h:44
#1  0xd334d3f2 in WTF::refIfNotNull<OpaqueJSClass> (ptr=0xe50a4120) at WTF/wtf/RefPtr.h:38
#2  0xd3347732 in WTF::RefPtr<OpaqueJSClass, WTF::DumbPtrTraits<OpaqueJSClass> >::RefPtr (this=0xe508bb60, ptr=0xe50a4120) at WTF/wtf/RefPtr.h:57
#3  0xd3346e9a in OpaqueJSClassContextData::OpaqueJSClassContextData (this=0xe508bb60, jsClass=0xe50a4120) at JavaScriptCore/API/JSClassRef.cpp:128
#4  0xd3347938 in make_unique<OpaqueJSClassContextData, JSC::VM&, OpaqueJSClass*> (...) at memory:3118
#5  OpaqueJSClass::contextData (this=0xe50a4120, exec=0xd64b0968) at JavaScriptCore/API/JSClassRef.cpp:154
#6  0xd3347b98 in OpaqueJSClass::staticValues (this=0xe50a4120, exec=0xd64b0968) at JavaScriptCore/API/JSClassRef.cpp:166
#7  0xd36e9704 in JSC::JSCallbackObject<JSC::JSDestructibleObject>::getOwnPropertySlot (object=0xcfc540a0, exec=0xd64b0968, propertyName=..., slot=...)
    at JavaScriptCore/API/JSCallbackObjectFunctions.h:193
#8  0xd335d184 in JSC::JSObject::getNonIndexPropertySlot (this=0xcfc540a0, exec=0xd64b0968, propertyName=..., slot=...)
    at JavaScriptCore/runtime/JSObjectInlines.h:155
#9  0xd335cc6e in JSC::JSObject::getPropertySlot<false> (this=0xcfc540a0, exec=0xd64b0968, propertyName=..., slot=...)
    at JavaScriptCore/runtime/JSObject.h:1425
#10 0xd3486442 in JSC::JSValue::getPropertySlot (this=0xd64b0870, exec=0xd64b0968, propertyName=..., slot=...)
    at JavaScriptCore/runtime/JSCJSValueInlines.h:912
#11 0xd347bab6 in JSC::JSValue::get (this=0xd64b0870, exec=0xd64b0968, propertyName=..., slot=...)
    at JavaScriptCore/runtime/JSCJSValueInlines.h:869
#12 0xd3949d12 in llint_slow_path_get_by_id (exec=0xd64b0968, pc=0xe50bbfe7) at JavaScriptCore/llint/LLIntSlowPaths.cpp:762


// 4. Possible Solution:
Change the type of JSGlobalObject::m_rareData::opaqueJSClassData from HashMap to WeakHashMap.

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-unassigned/attachments/20190918/1595b4d8/attachment.html>


More information about the webkit-unassigned mailing list