[JSC] Remove one indirection in JSObject::toStringName
authoryusukesuzuki@slowstart.org <yusukesuzuki@slowstart.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 29 Dec 2018 04:24:29 +0000 (04:24 +0000)
committeryusukesuzuki@slowstart.org <yusukesuzuki@slowstart.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 29 Dec 2018 04:24:29 +0000 (04:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=193037

Reviewed by Keith Miller.

Source/JavaScriptCore:

We should not have additional one-level indirection in JSObject::toStringName.
JSObject::toStringName is dispatched through methodTable. Even after that, we
need to call JSObject::className function through methodTable again. But className
function is rarely defined. So instead of introducing this indirection here,
classes having className functions should have toStringName function too. This can
remove one-level indirection in toStringName in major cases.

* API/JSCallbackObject.h:
* API/JSCallbackObjectFunctions.h:
(JSC::JSCallbackObject<Parent>::toStringName):
* debugger/DebuggerScope.cpp:
(JSC::DebuggerScope::toStringName):
* debugger/DebuggerScope.h:
* runtime/JSObject.cpp:
(JSC::JSObject::toStringName):

Source/WebCore:

Use old JSObject::toStringName function here.

* bindings/js/JSDOMConstructorBase.cpp:
(WebCore::JSDOMConstructorBase::className):
(WebCore::JSDOMConstructorBase::toStringName):
* bindings/js/JSDOMConstructorBase.h:
(WebCore::JSDOMConstructorBase::className): Deleted.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@239557 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/API/JSCallbackObject.h
Source/JavaScriptCore/API/JSCallbackObjectFunctions.h
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/debugger/DebuggerScope.cpp
Source/JavaScriptCore/debugger/DebuggerScope.h
Source/JavaScriptCore/runtime/JSObject.cpp
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMConstructorBase.cpp
Source/WebCore/bindings/js/JSDOMConstructorBase.h

index 53a0f74..27b283f 100644 (file)
@@ -187,6 +187,7 @@ public:
 
 private:
     static String className(const JSObject*, VM&);
+    static String toStringName(const JSObject*, ExecState*);
 
     static JSValue defaultValue(const JSObject*, ExecState*, PreferredPrimitiveType);
 
index 4f4b7d7..ae3a6fe 100644 (file)
@@ -140,6 +140,15 @@ String JSCallbackObject<Parent>::className(const JSObject* object, VM& vm)
 }
 
 template <class Parent>
+String JSCallbackObject<Parent>::toStringName(const JSObject* object, ExecState* exec)
+{
+    VM& vm = exec->vm();
+    const ClassInfo* info = object->classInfo(vm);
+    ASSERT(info);
+    return info->methodTable.className(object, vm);
+}
+
+template <class Parent>
 bool JSCallbackObject<Parent>::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot)
 {
     VM& vm = exec->vm();
index 17e0108..8e5c858 100644 (file)
@@ -1,3 +1,26 @@
+2018-12-28  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
+
+        [JSC] Remove one indirection in JSObject::toStringName
+        https://bugs.webkit.org/show_bug.cgi?id=193037
+
+        Reviewed by Keith Miller.
+
+        We should not have additional one-level indirection in JSObject::toStringName.
+        JSObject::toStringName is dispatched through methodTable. Even after that, we
+        need to call JSObject::className function through methodTable again. But className
+        function is rarely defined. So instead of introducing this indirection here,
+        classes having className functions should have toStringName function too. This can
+        remove one-level indirection in toStringName in major cases.
+
+        * API/JSCallbackObject.h:
+        * API/JSCallbackObjectFunctions.h:
+        (JSC::JSCallbackObject<Parent>::toStringName):
+        * debugger/DebuggerScope.cpp:
+        (JSC::DebuggerScope::toStringName):
+        * debugger/DebuggerScope.h:
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::toStringName):
+
 2018-12-27  Alex Christensen  <achristensen@webkit.org>
 
         Resurrect Mac CMake build
index e5adad9..b1e7aec 100644 (file)
@@ -77,6 +77,17 @@ String DebuggerScope::className(const JSObject* object, VM& vm)
     return thisObject->methodTable(vm)->className(thisObject, vm);
 }
 
+String DebuggerScope::toStringName(const JSObject* object, ExecState* exec)
+{
+    const DebuggerScope* scope = jsCast<const DebuggerScope*>(object);
+    // We cannot assert that scope->isValid() because the TypeProfiler may encounter an invalidated
+    // DebuggerScope in its log entries. We just need to handle it appropriately as below.
+    if (!scope->isValid())
+        return String();
+    JSObject* thisObject = JSScope::objectAtScope(scope->jsScope());
+    return thisObject->methodTable(exec->vm())->toStringName(thisObject, exec);
+}
+
 bool DebuggerScope::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot)
 {
     DebuggerScope* scope = jsCast<DebuggerScope*>(object);
index cb21ba4..c92d3d0 100644 (file)
@@ -42,6 +42,7 @@ public:
 
     static void visitChildren(JSCell*, SlotVisitor&);
     static String className(const JSObject*, VM&);
+    static String toStringName(const JSObject*, ExecState*);
     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
     static bool put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
     static bool deleteProperty(JSCell*, ExecState*, PropertyName);
index e803afc..ca453d8 100644 (file)
@@ -519,7 +519,7 @@ String JSObject::toStringName(const JSObject* object, ExecState* exec)
     VM& vm = exec->vm();
     const ClassInfo* info = object->classInfo(vm);
     ASSERT(info);
-    return info->methodTable.className(object, vm);
+    return info->className;
 }
 
 String JSObject::calculatedClassName(JSObject* object)
index e79aa6e..07c0987 100644 (file)
@@ -1,3 +1,18 @@
+2018-12-28  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
+
+        [JSC] Remove one indirection in JSObject::toStringName
+        https://bugs.webkit.org/show_bug.cgi?id=193037
+
+        Reviewed by Keith Miller.
+
+        Use old JSObject::toStringName function here.
+
+        * bindings/js/JSDOMConstructorBase.cpp:
+        (WebCore::JSDOMConstructorBase::className):
+        (WebCore::JSDOMConstructorBase::toStringName):
+        * bindings/js/JSDOMConstructorBase.h:
+        (WebCore::JSDOMConstructorBase::className): Deleted.
+
 2018-12-27  Alex Christensen  <achristensen@webkit.org>
 
         Resurrect Mac CMake build
index 3cc2f4b..96bad24 100644 (file)
@@ -43,4 +43,17 @@ CallType JSDOMConstructorBase::getCallData(JSCell*, CallData& callData)
     return CallType::Host;
 }
 
+String JSDOMConstructorBase::className(const JSObject*, JSC::VM&)
+{
+    return "Function"_s;
+}
+
+String JSDOMConstructorBase::toStringName(const JSObject* object, JSC::ExecState* exec)
+{
+    VM& vm = exec->vm();
+    const ClassInfo* info = object->classInfo(vm);
+    ASSERT(info);
+    return info->methodTable.className(object, vm);
+}
+
 } // namespace WebCore
index cd24c08..01ecdd4 100644 (file)
@@ -38,6 +38,7 @@ protected:
     }
 
     static String className(const JSObject*, JSC::VM&);
+    static String toStringName(const JSObject*, JSC::ExecState*);
     static JSC::CallType getCallData(JSCell*, JSC::CallData&);
 };
 
@@ -46,9 +47,4 @@ inline JSC::Structure* JSDOMConstructorBase::createStructure(JSC::VM& vm, JSC::J
     return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
 }
 
-inline String JSDOMConstructorBase::className(const JSObject*, JSC::VM&)
-{
-    return "Function"_s;
-}
-
 } // namespace WebCore