[JSC] isCallable is redundant with isFunction
authorross.kirsling@sony.com <ross.kirsling@sony.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 26 Apr 2020 05:07:21 +0000 (05:07 +0000)
committerross.kirsling@sony.com <ross.kirsling@sony.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 26 Apr 2020 05:07:21 +0000 (05:07 +0000)
https://bugs.webkit.org/show_bug.cgi?id=211037

Reviewed by Yusuke Suzuki.

Source/JavaScriptCore:

isCallable is only being used in two places and has the same definition as isFunction (aside from out params).
Where CallData is needed, getCallData should be used; where CallData is not needed, isFunction should be used.

* runtime/JSCJSValue.h:
* runtime/JSCJSValueInlines.h:
(JSC::JSValue::isCallable const): Deleted.
* runtime/JSCell.h:
* runtime/JSCellInlines.h:
(JSC::JSCell::isCallable): Deleted.
Remove isCallable.

* runtime/JSONObject.cpp:
(JSC::Stringifier::Stringifier):
(JSC::Stringifier::toJSON):
Use getCallData if you need CallData.

* runtime/ExceptionHelpers.cpp:
(JSC::errorDescriptionForValue):
* runtime/ObjectConstructor.cpp:
(JSC::toPropertyDescriptor):
* runtime/ObjectPrototype.cpp:
(JSC::objectProtoFuncDefineGetter):
(JSC::objectProtoFuncDefineSetter):
Don't use getCallData if you don't need CallData.

Source/WebCore:

* bindings/js/JSDOMConvertScheduledAction.h:
(WebCore::Converter<IDLScheduledAction>::convert):
* worklets/PaintWorkletGlobalScope.cpp:
(WebCore::PaintWorkletGlobalScope::registerPaint):
Don't use getCallData if you don't need CallData.

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

12 files changed:
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ExceptionHelpers.cpp
Source/JavaScriptCore/runtime/JSCJSValue.h
Source/JavaScriptCore/runtime/JSCJSValueInlines.h
Source/JavaScriptCore/runtime/JSCell.h
Source/JavaScriptCore/runtime/JSCellInlines.h
Source/JavaScriptCore/runtime/JSONObject.cpp
Source/JavaScriptCore/runtime/ObjectConstructor.cpp
Source/JavaScriptCore/runtime/ObjectPrototype.cpp
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMConvertScheduledAction.h
Source/WebCore/worklets/PaintWorkletGlobalScope.cpp

index 84dd78b..fa6fba9 100644 (file)
@@ -1,3 +1,35 @@
+2020-04-25  Ross Kirsling  <ross.kirsling@sony.com>
+
+        [JSC] isCallable is redundant with isFunction
+        https://bugs.webkit.org/show_bug.cgi?id=211037
+
+        Reviewed by Yusuke Suzuki.
+
+        isCallable is only being used in two places and has the same definition as isFunction (aside from out params).
+        Where CallData is needed, getCallData should be used; where CallData is not needed, isFunction should be used.
+
+        * runtime/JSCJSValue.h:
+        * runtime/JSCJSValueInlines.h:
+        (JSC::JSValue::isCallable const): Deleted.
+        * runtime/JSCell.h:
+        * runtime/JSCellInlines.h:
+        (JSC::JSCell::isCallable): Deleted.
+        Remove isCallable.
+
+        * runtime/JSONObject.cpp:
+        (JSC::Stringifier::Stringifier):
+        (JSC::Stringifier::toJSON):
+        Use getCallData if you need CallData.
+
+        * runtime/ExceptionHelpers.cpp:
+        (JSC::errorDescriptionForValue):
+        * runtime/ObjectConstructor.cpp:
+        (JSC::toPropertyDescriptor):
+        * runtime/ObjectPrototype.cpp:
+        (JSC::objectProtoFuncDefineGetter):
+        (JSC::objectProtoFuncDefineSetter):
+        Don't use getCallData if you don't need CallData. 
+
 2020-04-25  Yusuke Suzuki  <ysuzuki@apple.com>
 
         [JSC] Handle BigInt32 INT32_MIN shift amount
index af98d4d..79150fe 100644 (file)
@@ -94,9 +94,8 @@ String errorDescriptionForValue(JSGlobalObject* globalObject, JSValue v)
         return asSymbol(v)->descriptiveString();
     if (v.isObject()) {
         VM& vm = globalObject->vm();
-        CallData callData;
         JSObject* object = asObject(v);
-        if (object->methodTable(vm)->getCallData(object, callData) != CallType::None)
+        if (object->isFunction(vm))
             return vm.smallStrings.functionString()->value(globalObject);
         return JSObject::calculatedClassName(object);
     }
index 254d47f..f52bc7b 100644 (file)
@@ -234,8 +234,6 @@ public:
     // Querying the type.
     bool isEmpty() const;
     bool isFunction(VM&) const;
-    bool isCallable(VM&) const;
-    bool isCallable(VM&, CallType&, CallData&) const;
     bool isConstructor(VM&) const;
     bool isConstructor(VM&, ConstructType&, ConstructData&) const;
     bool isUndefined() const;
index edb0b82..c2af6a1 100644 (file)
@@ -882,20 +882,6 @@ inline bool JSValue::isFunction(VM& vm) const
     return asCell()->isFunction(vm);
 }
 
-inline bool JSValue::isCallable(VM& vm) const
-{
-    CallType unusedType;
-    CallData unusedData;
-    return isCallable(vm, unusedType, unusedData);
-}
-
-inline bool JSValue::isCallable(VM& vm, CallType& callType, CallData& callData) const
-{
-    if (!isCell())
-        return false;
-    return asCell()->isCallable(vm, callType, callData);
-}
-
 inline bool JSValue::isConstructor(VM& vm) const
 {
     if (!isCell())
index 06ed4e7..02c3cb4 100644 (file)
@@ -108,7 +108,6 @@ public:
     bool isCustomGetterSetter() const;
     bool isProxy() const;
     bool isFunction(VM&);
-    bool isCallable(VM&, CallType&, CallData&);
     bool isConstructor(VM&);
     bool isConstructor(VM&, ConstructType&, ConstructData&);
     bool inherits(VM&, const ClassInfo*) const;
index 8798c5a..4893e07 100644 (file)
@@ -240,14 +240,6 @@ ALWAYS_INLINE bool JSCell::isFunction(VM& vm)
     return false;
 }
 
-inline bool JSCell::isCallable(VM& vm, CallType& callType, CallData& callData)
-{
-    if (type() != JSFunctionType && !(inlineTypeFlags() & OverridesGetCallData))
-        return false;
-    callType = methodTable(vm)->getCallData(this, callData);
-    return callType != CallType::None;
-}
-
 inline bool JSCell::isConstructor(VM& vm)
 {
     ConstructType constructType;
index 360dd9e..b37458b 100644 (file)
@@ -231,8 +231,8 @@ Stringifier::Stringifier(JSGlobalObject* globalObject, JSValue replacer, JSValue
     if (m_replacer.isObject()) {
         JSObject* replacerObject = asObject(m_replacer);
 
-        m_replacerCallType = CallType::None;
-        if (!replacerObject->isCallable(vm, m_replacerCallType, m_replacerCallData)) {
+        m_replacerCallType = getCallData(vm, replacerObject, m_replacerCallData);
+        if (m_replacerCallType == CallType::None) {
             bool isArrayReplacer = JSC::isArray(globalObject, replacerObject);
             RETURN_IF_EXCEPTION(scope, );
             if (isArrayReplacer) {
@@ -304,9 +304,9 @@ ALWAYS_INLINE JSValue Stringifier::toJSON(JSValue baseValue, const PropertyNameF
     JSValue toJSONFunction = baseValue.get(m_globalObject, vm.propertyNames->toJSON);
     RETURN_IF_EXCEPTION(scope, { });
 
-    CallType callType;
     CallData callData;
-    if (!toJSONFunction.isCallable(vm, callType, callData))
+    CallType callType = getCallData(vm, toJSONFunction, callData);
+    if (callType == CallType::None)
         return baseValue;
 
     MarkedArgumentBuffer args;
index 95ee4c4..db5a708 100644 (file)
@@ -531,12 +531,9 @@ bool toPropertyDescriptor(JSGlobalObject* globalObject, JSValue in, PropertyDesc
     if (hasProperty) {
         JSValue get = description->get(globalObject, vm.propertyNames->get);
         RETURN_IF_EXCEPTION(scope, false);
-        if (!get.isUndefined()) {
-            CallData callData;
-            if (getCallData(vm, get, callData) == CallType::None) {
-                throwTypeError(globalObject, scope, "Getter must be a function."_s);
-                return false;
-            }
+        if (!get.isUndefined() && !get.isFunction(vm)) {
+            throwTypeError(globalObject, scope, "Getter must be a function."_s);
+            return false;
         }
         desc.setGetter(get);
     } else
@@ -547,12 +544,9 @@ bool toPropertyDescriptor(JSGlobalObject* globalObject, JSValue in, PropertyDesc
     if (hasProperty) {
         JSValue set = description->get(globalObject, vm.propertyNames->set);
         RETURN_IF_EXCEPTION(scope, false);
-        if (!set.isUndefined()) {
-            CallData callData;
-            if (getCallData(vm, set, callData) == CallType::None) {
-                throwTypeError(globalObject, scope, "Setter must be a function."_s);
-                return false;
-            }
+        if (!set.isUndefined() && !set.isFunction(vm)) {
+            throwTypeError(globalObject, scope, "Setter must be a function."_s);
+            return false;
         }
         desc.setSetter(set);
     } else
index 41ce8aa..5ee41fa 100644 (file)
@@ -154,8 +154,7 @@ EncodedJSValue JSC_HOST_CALL objectProtoFuncDefineGetter(JSGlobalObject* globalO
     RETURN_IF_EXCEPTION(scope, encodedJSValue());
 
     JSValue get = callFrame->argument(1);
-    CallData callData;
-    if (getCallData(vm, get, callData) == CallType::None)
+    if (!get.isFunction(vm))
         return throwVMTypeError(globalObject, scope, "invalid getter usage"_s);
 
     auto propertyName = callFrame->argument(0).toPropertyKey(globalObject);
@@ -182,8 +181,7 @@ EncodedJSValue JSC_HOST_CALL objectProtoFuncDefineSetter(JSGlobalObject* globalO
     RETURN_IF_EXCEPTION(scope, encodedJSValue());
 
     JSValue set = callFrame->argument(1);
-    CallData callData;
-    if (getCallData(vm, set, callData) == CallType::None)
+    if (!set.isFunction(vm))
         return throwVMTypeError(globalObject, scope, "invalid setter usage"_s);
 
     auto propertyName = callFrame->argument(0).toPropertyKey(globalObject);
index b3f5c5b..dec87ac 100644 (file)
@@ -1,3 +1,16 @@
+2020-04-25  Ross Kirsling  <ross.kirsling@sony.com>
+
+        [JSC] isCallable is redundant with isFunction
+        https://bugs.webkit.org/show_bug.cgi?id=211037
+
+        Reviewed by Yusuke Suzuki.
+
+        * bindings/js/JSDOMConvertScheduledAction.h:
+        (WebCore::Converter<IDLScheduledAction>::convert):
+        * worklets/PaintWorkletGlobalScope.cpp:
+        (WebCore::PaintWorkletGlobalScope::registerPaint):
+        Don't use getCallData if you don't need CallData. 
+
 2020-04-25  Alex Christensen  <achristensen@webkit.org>
 
         Build fix.
index d16d23f..2c9d557 100644 (file)
@@ -38,8 +38,7 @@ template<> struct Converter<IDLScheduledAction> : DefaultConverter<IDLScheduledA
         JSC::VM& vm = JSC::getVM(&lexicalGlobalObject);
         auto scope = DECLARE_THROW_SCOPE(vm);
 
-        JSC::CallData callData;
-        if (getCallData(vm, value, callData) == JSC::CallType::None) {
+        if (!value.isFunction(vm)) {
             auto code = Converter<IDLDOMString>::convert(lexicalGlobalObject, value);
             RETURN_IF_EXCEPTION(scope, nullptr);
             return ScheduledAction::create(globalObject.world(), WTFMove(code));
index 18180c5..4da6833 100644 (file)
@@ -75,8 +75,7 @@ ExceptionOr<void> PaintWorkletGlobalScope::registerPaint(JSC::JSGlobalObject& gl
     auto scope = DECLARE_THROW_SCOPE(vm);
 
     // Validate that paintConstructor is a VoidFunction
-    CallData callData;
-    if (JSC::getCallData(vm, paintConstructor.get(), callData) == JSC::CallType::None)
+    if (!paintConstructor->isFunction(vm))
         return Exception { TypeError, "paintConstructor must be callable" };
 
     if (name.isEmpty())