JSGenerateToNativeObject should use fast JSNode/JSElement casts.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Apr 2014 23:30:50 +0000 (23:30 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Apr 2014 23:30:50 +0000 (23:30 +0000)
<https://webkit.org/b/131245>

Make JSGenerateToNativeObject spit out code using the fast new wrapper
casts for JSNode and JSElement.

This avoids walking the ClassInfo chain in many core functions, e.g:

    - Node.insertBefore()
    - Node.replaceChild()
    - Node.removeChild()
    - Node.appendChild()
    - window.getComputedStyle()

Reviewed by Geoff Garen.

* bindings/scripts/CodeGeneratorJS.pm:
(GenerateImplementation):

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

17 files changed:
Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestCustomNamedGetter.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp
Source/WebCore/bindings/scripts/test/JS/JSattribute.cpp
Source/WebCore/bindings/scripts/test/JS/JSreadonly.cpp

index 11cf513..37e0244 100644 (file)
@@ -1,3 +1,24 @@
+2014-04-04  Andreas Kling  <akling@apple.com>
+
+        JSGenerateToNativeObject should use fast JSNode/JSElement casts.
+        <https://webkit.org/b/131245>
+
+        Make JSGenerateToNativeObject spit out code using the fast new wrapper
+        casts for JSNode and JSElement.
+
+        This avoids walking the ClassInfo chain in many core functions, e.g:
+
+            - Node.insertBefore()
+            - Node.replaceChild()
+            - Node.removeChild()
+            - Node.appendChild()
+            - window.getComputedStyle()
+
+        Reviewed by Geoff Garen.
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateImplementation):
+
 2014-04-04  Zoltan Horvath  <zoltan@webkit.org>
 
         [CSS Shapes] polygon y-value calc() args serialize incorrectly
index c893065..0c36bda 100644 (file)
@@ -3087,8 +3087,10 @@ END
     if ((!$hasParent or $interface->extendedAttributes->{"JSGenerateToNativeObject"}) and !$interface->extendedAttributes->{"JSCustomToNativeObject"}) {
         push(@implContent, "$implType* to${interfaceName}(JSC::JSValue value)\n");
         push(@implContent, "{\n");
-        push(@implContent, "    return value.inherits(${className}::info()) ? &jsCast<$className*>(value)->impl() : 0");
-        push(@implContent, ";\n}\n");
+        push(@implContent, "    if (auto* wrapper = " . GetCastingHelperForThisObject($interface) . "(value))\n");
+        push(@implContent, "        return &wrapper->impl();\n");
+        push(@implContent, "    return nullptr;\n");
+        push(@implContent, "}\n");
     }
 
     push(@implContent, "\n}\n");
index f203360..ecdb445 100644 (file)
@@ -271,7 +271,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestActiveDO
 
 TestActiveDOMObject* toTestActiveDOMObject(JSC::JSValue value)
 {
-    return value.inherits(JSTestActiveDOMObject::info()) ? &jsCast<JSTestActiveDOMObject*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestActiveDOMObject*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index a020485..d2b4603 100644 (file)
@@ -238,7 +238,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestCustomNa
 
 TestCustomNamedGetter* toTestCustomNamedGetter(JSC::JSValue value)
 {
-    return value.inherits(JSTestCustomNamedGetter::info()) ? &jsCast<JSTestCustomNamedGetter*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestCustomNamedGetter*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index a163a9c..2d96f6c 100644 (file)
@@ -283,7 +283,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestEventCon
 
 TestEventConstructor* toTestEventConstructor(JSC::JSValue value)
 {
-    return value.inherits(JSTestEventConstructor::info()) ? &jsCast<JSTestEventConstructor*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestEventConstructor*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index 969ebca..98643f6 100644 (file)
@@ -352,7 +352,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestEventTar
 
 TestEventTarget* toTestEventTarget(JSC::JSValue value)
 {
-    return value.inherits(JSTestEventTarget::info()) ? &jsCast<JSTestEventTarget*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestEventTarget*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index fb1b07b..1bfce5c 100644 (file)
@@ -223,7 +223,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestExceptio
 
 TestException* toTestException(JSC::JSValue value)
 {
-    return value.inherits(JSTestException::info()) ? &jsCast<JSTestException*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestException*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index b6087a3..134845e 100644 (file)
@@ -196,7 +196,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestGenerate
 
 TestGenerateIsReachable* toTestGenerateIsReachable(JSC::JSValue value)
 {
-    return value.inherits(JSTestGenerateIsReachable::info()) ? &jsCast<JSTestGenerateIsReachable*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestGenerateIsReachable*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index 4756931..ded1bdf 100644 (file)
@@ -989,7 +989,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestInterfac
 
 TestInterface* toTestInterface(JSC::JSValue value)
 {
-    return value.inherits(JSTestInterface::info()) ? &jsCast<JSTestInterface*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestInterface*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index a53cb5d..4fe0dda 100644 (file)
@@ -211,7 +211,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestMediaQue
 
 TestMediaQueryListListener* toTestMediaQueryListListener(JSC::JSValue value)
 {
-    return value.inherits(JSTestMediaQueryListListener::info()) ? &jsCast<JSTestMediaQueryListListener*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestMediaQueryListListener*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index 0f894ce..d13a659 100644 (file)
@@ -241,7 +241,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestNamedCon
 
 TestNamedConstructor* toTestNamedConstructor(JSC::JSValue value)
 {
-    return value.inherits(JSTestNamedConstructor::info()) ? &jsCast<JSTestNamedConstructor*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestNamedConstructor*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index 2b6b9c9..1fbea85 100644 (file)
@@ -4817,7 +4817,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestObj* imp
 
 TestObj* toTestObj(JSC::JSValue value)
 {
-    return value.inherits(JSTestObj::info()) ? &jsCast<JSTestObj*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestObj*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index e214044..c380907 100644 (file)
@@ -262,7 +262,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestOverload
 
 TestOverloadedConstructors* toTestOverloadedConstructors(JSC::JSValue value)
 {
-    return value.inherits(JSTestOverloadedConstructors::info()) ? &jsCast<JSTestOverloadedConstructors*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestOverloadedConstructors*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index 82cc4ab..7fd334f 100644 (file)
@@ -361,7 +361,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestSerializ
 
 TestSerializedScriptValueInterface* toTestSerializedScriptValueInterface(JSC::JSValue value)
 {
-    return value.inherits(JSTestSerializedScriptValueInterface::info()) ? &jsCast<JSTestSerializedScriptValueInterface*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestSerializedScriptValueInterface*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index baaa536..f7fb463 100644 (file)
@@ -773,7 +773,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TestTypedefs
 
 TestTypedefs* toTestTypedefs(JSC::JSValue value)
 {
-    return value.inherits(JSTestTypedefs::info()) ? &jsCast<JSTestTypedefs*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSTestTypedefs*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index 04b904f..2cd9ac1 100644 (file)
@@ -212,7 +212,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, attribute* i
 
 attribute* toattribute(JSC::JSValue value)
 {
-    return value.inherits(JSattribute::info()) ? &jsCast<JSattribute*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSattribute*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }
index bb43a13..cd1f67c 100644 (file)
@@ -167,7 +167,9 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, readonly* im
 
 readonly* toreadonly(JSC::JSValue value)
 {
-    return value.inherits(JSreadonly::info()) ? &jsCast<JSreadonly*>(value)->impl() : 0;
+    if (auto* wrapper = jsDynamicCast<JSreadonly*>(value))
+        return &wrapper->impl();
+    return nullptr;
 }
 
 }