Title: [99238] trunk/Source/_javascript_Core
Revision
99238
Author
[email protected]
Date
2011-11-03 15:40:39 -0700 (Thu, 03 Nov 2011)

Log Message

De-virtualize JSObject::hasInstance
https://bugs.webkit.org/show_bug.cgi?id=71430

Reviewed by Darin Adler.

Added hasInstance to the MethodTable, changed all the virtual
implementations of hasInstance to static ones, and replaced
all call sites with corresponding lookups in the MethodTable.

* API/JSCallbackObject.h:
* API/JSCallbackObjectFunctions.h:
(JSC::::hasInstance):
* API/JSValueRef.cpp:
(JSValueIsInstanceOfConstructor):
* _javascript_Core.exp:
* _javascript_Core.vcproj/_javascript_Core/_javascript_Core.def:
* interpreter/Interpreter.cpp:
(JSC::Interpreter::privateExecute):
* jit/JITStubs.cpp:
(JSC::DEFINE_STUB_FUNCTION):
* runtime/ClassInfo.h:
* runtime/JSBoundFunction.cpp:
(JSC::JSBoundFunction::hasInstance):
* runtime/JSBoundFunction.h:
* runtime/JSCell.cpp:
(JSC::JSCell::hasInstance):
* runtime/JSCell.h:
* runtime/JSObject.cpp:
(JSC::JSObject::hasInstance):
* runtime/JSObject.h:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/API/JSCallbackObject.h (99237 => 99238)


--- trunk/Source/_javascript_Core/API/JSCallbackObject.h	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/API/JSCallbackObject.h	2011-11-03 22:40:39 UTC (rev 99238)
@@ -185,7 +185,7 @@
     static bool deleteProperty(JSCell*, ExecState*, const Identifier&);
     static bool deletePropertyByIndex(JSCell*, ExecState*, unsigned);
 
-    virtual bool hasInstance(ExecState* exec, JSValue value, JSValue proto);
+    static bool hasInstance(JSObject*, ExecState*, JSValue, JSValue proto);
 
     static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
 

Modified: trunk/Source/_javascript_Core/API/JSCallbackObjectFunctions.h (99237 => 99238)


--- trunk/Source/_javascript_Core/API/JSCallbackObjectFunctions.h	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/API/JSCallbackObjectFunctions.h	2011-11-03 22:40:39 UTC (rev 99238)
@@ -355,12 +355,13 @@
 }
 
 template <class Parent>
-bool JSCallbackObject<Parent>::hasInstance(ExecState* exec, JSValue value, JSValue)
+bool JSCallbackObject<Parent>::hasInstance(JSObject* object, ExecState* exec, JSValue value, JSValue)
 {
+    JSCallbackObject* thisObject = static_cast<JSCallbackObject*>(object);
     JSContextRef execRef = toRef(exec);
-    JSObjectRef thisRef = toRef(this);
+    JSObjectRef thisRef = toRef(thisObject);
     
-    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = thisObject->classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance) {
             JSValueRef valueRef = toRef(exec, value);
             JSValueRef exception = 0;

Modified: trunk/Source/_javascript_Core/API/JSValueRef.cpp (99237 => 99238)


--- trunk/Source/_javascript_Core/API/JSValueRef.cpp	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/API/JSValueRef.cpp	2011-11-03 22:40:39 UTC (rev 99238)
@@ -175,7 +175,7 @@
     JSObject* jsConstructor = toJS(constructor);
     if (!jsConstructor->structure()->typeInfo().implementsHasInstance())
         return false;
-    bool result = jsConstructor->hasInstance(exec, jsValue, jsConstructor->get(exec, exec->propertyNames().prototype)); // false if an exception is thrown
+    bool result = jsConstructor->methodTable()->hasInstance(jsConstructor, exec, jsValue, jsConstructor->get(exec, exec->propertyNames().prototype)); // false if an exception is thrown
     if (exec->hadException()) {
         if (exception)
             *exception = toRef(exec, exec->exception());

Modified: trunk/Source/_javascript_Core/ChangeLog (99237 => 99238)


--- trunk/Source/_javascript_Core/ChangeLog	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-11-03 22:40:39 UTC (rev 99238)
@@ -1,3 +1,36 @@
+2011-11-03  Mark Hahnenberg  <[email protected]>
+
+        De-virtualize JSObject::hasInstance
+        https://bugs.webkit.org/show_bug.cgi?id=71430
+
+        Reviewed by Darin Adler.
+
+        Added hasInstance to the MethodTable, changed all the virtual 
+        implementations of hasInstance to static ones, and replaced 
+        all call sites with corresponding lookups in the MethodTable.
+
+        * API/JSCallbackObject.h:
+        * API/JSCallbackObjectFunctions.h:
+        (JSC::::hasInstance):
+        * API/JSValueRef.cpp:
+        (JSValueIsInstanceOfConstructor):
+        * _javascript_Core.exp:
+        * _javascript_Core.vcproj/_javascript_Core/_javascript_Core.def:
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::privateExecute):
+        * jit/JITStubs.cpp:
+        (JSC::DEFINE_STUB_FUNCTION):
+        * runtime/ClassInfo.h:
+        * runtime/JSBoundFunction.cpp:
+        (JSC::JSBoundFunction::hasInstance):
+        * runtime/JSBoundFunction.h:
+        * runtime/JSCell.cpp:
+        (JSC::JSCell::hasInstance):
+        * runtime/JSCell.h:
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::hasInstance):
+        * runtime/JSObject.h:
+
 2011-11-03  Filip Pizlo  <[email protected]>
 
         JIT-specific code should be able to refer to register types even on JIT-disabled builds

Modified: trunk/Source/_javascript_Core/_javascript_Core.exp (99237 => 99238)


--- trunk/Source/_javascript_Core/_javascript_Core.exp	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/_javascript_Core.exp	2011-11-03 22:40:39 UTC (rev 99238)
@@ -303,7 +303,7 @@
 __ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectE
 __ZN3JSC8DebuggerD2Ev
 __ZN3JSC8JSObject10putByIndexEPNS_6JSCellEPNS_9ExecStateEjNS_7JSValueE
-__ZN3JSC8JSObject11hasInstanceEPNS_9ExecStateENS_7JSValueES3_
+__ZN3JSC8JSObject11hasInstanceEPS0_PNS_9ExecStateENS_7JSValueES4_
 __ZN3JSC8JSObject12defineGetterEPS0_PNS_9ExecStateERKNS_10IdentifierES1_j
 __ZN3JSC8JSObject12defaultValueEPKS0_PNS_9ExecStateENS_22PreferredPrimitiveTypeE
 __ZN3JSC8JSObject12defineSetterEPS0_PNS_9ExecStateERKNS_10IdentifierES1_j

Modified: trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def (99237 => 99238)


--- trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2011-11-03 22:40:39 UTC (rev 99238)
@@ -211,7 +211,7 @@
     ?globalExec@JSGlobalObject@JSC@@QAEPAVExecState@2@XZ
     ?globalObjectCount@Heap@JSC@@QAEIXZ
     ?grow@HandleHeap@JSC@@AAEXXZ
-    ?hasInstance@JSObject@JSC@@UAE_NPAVExecState@2@VJSValue@2@1@Z
+    ?hasInstance@JSObject@JSC@@SA_NPAV12@PAVExecState@2@VJSValue@2@2@Z
     ?hasProperty@JSObject@JSC@@QBE_NPAVExecState@2@ABVIdentifier@2@@Z
     ?hasProperty@JSObject@JSC@@QBE_NPAVExecState@2@I@Z
     ?heap@Heap@JSC@@SAPAV12@VJSValue@2@@Z

Modified: trunk/Source/_javascript_Core/interpreter/Interpreter.cpp (99237 => 99238)


--- trunk/Source/_javascript_Core/interpreter/Interpreter.cpp	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/interpreter/Interpreter.cpp	2011-11-03 22:40:39 UTC (rev 99238)
@@ -2354,7 +2354,7 @@
 
         ASSERT(!isInvalidParamForInstanceOf(callFrame, baseVal, exceptionValue));
 
-        bool result = asObject(baseVal)->hasInstance(callFrame, callFrame->r(value).jsValue(), callFrame->r(baseProto).jsValue());
+        bool result = asObject(baseVal)->methodTable()->hasInstance(asObject(baseVal), callFrame, callFrame->r(value).jsValue(), callFrame->r(baseProto).jsValue());
         CHECK_FOR_EXCEPTION();
         callFrame->uncheckedR(dst) = jsBoolean(result);
 

Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (99237 => 99238)


--- trunk/Source/_javascript_Core/jit/JITStubs.cpp	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp	2011-11-03 22:40:39 UTC (rev 99238)
@@ -2092,7 +2092,7 @@
     if (!typeInfo.overridesHasInstance() && !value.isObject())
         return JSValue::encode(jsBoolean(false));
 
-    JSValue result = jsBoolean(asObject(baseVal)->hasInstance(callFrame, value, proto));
+    JSValue result = jsBoolean(asObject(baseVal)->methodTable()->hasInstance(asObject(baseVal), callFrame, value, proto));
     CHECK_FOR_EXCEPTION_AT_END();
 
     return JSValue::encode(result);

Modified: trunk/Source/_javascript_Core/runtime/ClassInfo.h (99237 => 99238)


--- trunk/Source/_javascript_Core/runtime/ClassInfo.h	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/runtime/ClassInfo.h	2011-11-03 22:40:39 UTC (rev 99238)
@@ -77,6 +77,9 @@
 
         typedef UString (*ClassNameFunctionPtr)(const JSObject*);
         ClassNameFunctionPtr className;
+
+        typedef bool (*HasInstanceFunctionPtr)(JSObject*, ExecState*, JSValue, JSValue);
+        HasInstanceFunctionPtr hasInstance;
     };
 
 #define CREATE_MEMBER_CHECKER(member) \
@@ -114,6 +117,7 @@
         &ClassName::defaultValue, \
         &ClassName::getOwnPropertyNames, \
         &ClassName::className, \
+        &ClassName::hasInstance, \
     }, \
     sizeof(ClassName)
 

Modified: trunk/Source/_javascript_Core/runtime/JSBoundFunction.cpp (99237 => 99238)


--- trunk/Source/_javascript_Core/runtime/JSBoundFunction.cpp	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/runtime/JSBoundFunction.cpp	2011-11-03 22:40:39 UTC (rev 99238)
@@ -87,13 +87,14 @@
     return function;
 }
 
-bool JSBoundFunction::hasInstance(ExecState* exec, JSValue value, JSValue)
+bool JSBoundFunction::hasInstance(JSObject* object, ExecState* exec, JSValue value, JSValue)
 {
+    JSBoundFunction* thisObject = static_cast<JSBoundFunction*>(object);
     // FIXME: our instanceof implementation will have already (incorrectly) performed
     // a [[Get]] of .prototype from the bound function object, which is incorrect!
     // https://bugs.webkit.org/show_bug.cgi?id=68656
-    JSValue proto = m_targetFunction->get(exec, exec->propertyNames().prototype);
-    return m_targetFunction->hasInstance(exec, value, proto);
+    JSValue proto = thisObject->m_targetFunction->get(exec, exec->propertyNames().prototype);
+    return thisObject->m_targetFunction->methodTable()->hasInstance(thisObject, exec, value, proto);
 }
 
 JSBoundFunction::JSBoundFunction(ExecState* exec, JSGlobalObject* globalObject, Structure* structure, JSObject* targetFunction, JSValue boundThis, JSValue boundArgs)

Modified: trunk/Source/_javascript_Core/runtime/JSBoundFunction.h (99237 => 99238)


--- trunk/Source/_javascript_Core/runtime/JSBoundFunction.h	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/runtime/JSBoundFunction.h	2011-11-03 22:40:39 UTC (rev 99238)
@@ -39,7 +39,7 @@
 
     static JSBoundFunction* create(ExecState*, JSGlobalObject*, JSObject* targetFunction, JSValue boundThis, JSValue boundArgs, int, const Identifier&);
 
-    virtual bool hasInstance(ExecState*, JSValue value, JSValue proto);
+    static bool hasInstance(JSObject*, ExecState*, JSValue, JSValue proto);
 
     JSObject* targetFunction() { return m_targetFunction.get(); }
     JSValue boundThis() { return m_boundThis.get(); }

Modified: trunk/Source/_javascript_Core/runtime/JSCell.cpp (99237 => 99238)


--- trunk/Source/_javascript_Core/runtime/JSCell.cpp	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/runtime/JSCell.cpp	2011-11-03 22:40:39 UTC (rev 99238)
@@ -185,4 +185,10 @@
     return UString();
 }
 
+bool JSCell::hasInstance(JSObject*, ExecState*, JSValue, JSValue)
+{
+    ASSERT_NOT_REACHED();
+    return false;
+}
+
 } // namespace JSC

Modified: trunk/Source/_javascript_Core/runtime/JSCell.h (99237 => 99238)


--- trunk/Source/_javascript_Core/runtime/JSCell.h	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/runtime/JSCell.h	2011-11-03 22:40:39 UTC (rev 99238)
@@ -145,6 +145,7 @@
         static JSValue defaultValue(const JSObject*, ExecState*, PreferredPrimitiveType);
         static NO_RETURN_DUE_TO_ASSERT void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
         static UString className(const JSObject*);
+        static bool hasInstance(JSObject*, ExecState*, JSValue, JSValue prototypeProperty);
 
     private:
         WriteBarrier<Structure> m_structure;

Modified: trunk/Source/_javascript_Core/runtime/JSObject.cpp (99237 => 99238)


--- trunk/Source/_javascript_Core/runtime/JSObject.cpp	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/runtime/JSObject.cpp	2011-11-03 22:40:39 UTC (rev 99238)
@@ -456,7 +456,7 @@
     return descriptor.setter();
 }
 
-bool JSObject::hasInstance(ExecState* exec, JSValue value, JSValue proto)
+bool JSObject::hasInstance(JSObject*, ExecState* exec, JSValue value, JSValue proto)
 {
     if (!value.isObject())
         return false;

Modified: trunk/Source/_javascript_Core/runtime/JSObject.h (99237 => 99238)


--- trunk/Source/_javascript_Core/runtime/JSObject.h	2011-11-03 22:28:51 UTC (rev 99237)
+++ trunk/Source/_javascript_Core/runtime/JSObject.h	2011-11-03 22:40:39 UTC (rev 99238)
@@ -124,7 +124,7 @@
 
         static JSValue defaultValue(const JSObject*, ExecState*, PreferredPrimitiveType);
 
-        virtual bool hasInstance(ExecState*, JSValue, JSValue prototypeProperty);
+        static bool hasInstance(JSObject*, ExecState*, JSValue, JSValue prototypeProperty);
 
         virtual void getPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
         static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to