JavaScriptCore:
2008-06-23 Darin Adler <darin@apple.com>
Reviewed by Geoff.
- work toward https://bugs.webkit.org/show_bug.cgi?id=19721
More preparation toward making functions work on primitive types without
creating wrapper objects. No speedup this time, but prepares for a future
speedup without slowing things down.
SunSpider reports no change.
- Eliminated the implementsCall, callAsFunction and construct virtual
functions from JSObject. Instead, the CallData and ConstructData for
a native function includes a function pointer that the caller can use
directly. Changed all call sites to use CallData and ConstructData.
- Changed the "this" argument to native functions to be a JSValue rather
than a JSObject. This prepares us for passing primitives into these
functions. The conversion to an object now must be done inside the
function. Critically, if it's a function that can be called on a DOM
window object, then we have to be sure to call toThisObject on the
argument before we use it for anything even if it's already an object.
- Eliminated the practice of using constructor objects in the global
object to make objects of the various basic types. Since these
constructors can't be replaced by script, there's no reason to involve
a constructor object at all. Added functions to do the construction
directly.
- Made some more class members private and protected, including virtual
function overrides. This can catch code using unnecessarily slow virtual
function code paths when the type of an object is known statically. If we
later find a new reason use the members outside the class it's easy to
make them public again.
- Moved the declarations of the native implementations for functions out
of header files. These can have internal linkage and be declared inside
the source file.
- Changed PrototypeFunction to take function pointers with the right
arguments to be put directly into CallData. This eliminates the
need to have a separate PrototypeReflexiveFunction, and reveals that the
real purpose of that class included something else specific to eval --
storage of a cached global object. So renamed PrototypeReflexiveFunction
to GlobalEvalFunction.
* API/JSCallbackConstructor.cpp:
(KJS::constructJSCallback):
(KJS::JSCallbackConstructor::getConstructData):
* API/JSCallbackConstructor.h:
* API/JSCallbackFunction.cpp:
(KJS::JSCallbackFunction::implementsHasInstance):
(KJS::JSCallbackFunction::call):
(KJS::JSCallbackFunction::getCallData):
* API/JSCallbackFunction.h:
(KJS::JSCallbackFunction::classInfo):
* API/JSCallbackObject.h:
(KJS::JSCallbackObject::classRef):
(KJS::JSCallbackObject::classInfo):
* API/JSCallbackObjectFunctions.h:
(KJS::::getConstructData):
(KJS::::construct):
(KJS::::getCallData):
(KJS::::call):
* API/JSObjectRef.cpp:
(JSObjectMakeFunction):
(JSObjectIsFunction):
(JSObjectCallAsFunction):
(JSObjectCallAsConstructor):
* JavaScriptCore.exp:
* VM/Machine.cpp:
(KJS::jsTypeStringForValue):
(KJS::Machine::privateExecute):
* kjs/ArrayPrototype.cpp:
(KJS::arrayProtoFuncToString):
(KJS::arrayProtoFuncToLocaleString):
(KJS::arrayProtoFuncJoin):
(KJS::arrayProtoFuncConcat):
(KJS::arrayProtoFuncPop):
(KJS::arrayProtoFuncPush):
(KJS::arrayProtoFuncReverse):
(KJS::arrayProtoFuncShift):
(KJS::arrayProtoFuncSlice):
(KJS::arrayProtoFuncSort):
(KJS::arrayProtoFuncSplice):
(KJS::arrayProtoFuncUnShift):
(KJS::arrayProtoFuncFilter):
(KJS::arrayProtoFuncMap):
(KJS::arrayProtoFuncEvery):
(KJS::arrayProtoFuncForEach):
(KJS::arrayProtoFuncSome):
(KJS::arrayProtoFuncIndexOf):
(KJS::arrayProtoFuncLastIndexOf):
(KJS::ArrayConstructor::ArrayConstructor):
(KJS::constructArrayWithSizeQuirk):
(KJS::constructWithArrayConstructor):
(KJS::ArrayConstructor::getConstructData):
(KJS::callArrayConstructor):
(KJS::ArrayConstructor::getCallData):
* kjs/ArrayPrototype.h:
* kjs/BooleanObject.cpp:
(KJS::booleanProtoFuncToString):
(KJS::booleanProtoFuncValueOf):
(KJS::constructBoolean):
(KJS::constructWithBooleanConstructor):
(KJS::BooleanConstructor::getConstructData):
(KJS::callBooleanConstructor):
(KJS::BooleanConstructor::getCallData):
(KJS::constructBooleanFromImmediateBoolean):
* kjs/BooleanObject.h:
* kjs/CallData.h:
(KJS::):
* kjs/ConstructData.h:
(KJS::):
* kjs/FunctionPrototype.cpp:
(KJS::callFunctionPrototype):
(KJS::FunctionPrototype::getCallData):
(KJS::functionProtoFuncToString):
(KJS::functionProtoFuncApply):
(KJS::functionProtoFuncCall):
(KJS::constructWithFunctionConstructor):
(KJS::FunctionConstructor::getConstructData):
(KJS::callFunctionConstructor):
(KJS::FunctionConstructor::getCallData):
(KJS::constructFunction):
* kjs/FunctionPrototype.h:
* kjs/JSArray.cpp:
(KJS::AVLTreeAbstractorForArrayCompare::compare_key_key):
(KJS::JSArray::sort):
(KJS::constructEmptyArray):
(KJS::constructArray):
* kjs/JSArray.h:
(KJS::JSArray::classInfo):
* kjs/JSFunction.cpp:
(KJS::JSFunction::call):
(KJS::globalFuncEval):
(KJS::globalFuncParseInt):
(KJS::globalFuncParseFloat):
(KJS::globalFuncIsNaN):
(KJS::globalFuncIsFinite):
(KJS::globalFuncDecodeURI):
(KJS::globalFuncDecodeURIComponent):
(KJS::globalFuncEncodeURI):
(KJS::globalFuncEncodeURIComponent):
(KJS::globalFuncEscape):
(KJS::globalFuncUnescape):
(KJS::globalFuncKJSPrint):
(KJS::PrototypeFunction::PrototypeFunction):
(KJS::PrototypeFunction::getCallData):
(KJS::GlobalEvalFunction::GlobalEvalFunction):
(KJS::GlobalEvalFunction::mark):
* kjs/JSFunction.h:
(KJS::InternalFunction::classInfo):
(KJS::InternalFunction::functionName):
(KJS::JSFunction::classInfo):
(KJS::GlobalEvalFunction::cachedGlobalObject):
* kjs/JSGlobalObject.cpp:
(KJS::JSGlobalObject::reset):
(KJS::JSGlobalObject::mark):
* kjs/JSGlobalObject.h:
(KJS::JSGlobalObject::JSGlobalObject):
(KJS::JSGlobalObject::evalFunction):
* kjs/JSImmediate.cpp:
(KJS::JSImmediate::toObject):
* kjs/JSNotAnObject.cpp:
* kjs/JSNotAnObject.h:
* kjs/JSObject.cpp:
(KJS::JSObject::put):
(KJS::callDefaultValueFunction):
(KJS::JSObject::defaultValue):
(KJS::JSObject::lookupGetter):
(KJS::JSObject::lookupSetter):
(KJS::JSObject::hasInstance):
(KJS::JSObject::fillGetterPropertySlot):
(KJS::Error::create):
(KJS::constructEmptyObject):
* kjs/JSObject.h:
(KJS::GetterSetter::GetterSetter):
(KJS::GetterSetter::getter):
(KJS::GetterSetter::setGetter):
(KJS::GetterSetter::setter):
(KJS::GetterSetter::setSetter):
* kjs/JSValue.cpp:
(KJS::JSCell::deleteProperty):
(KJS::call):
(KJS::construct):
* kjs/JSValue.h:
* kjs/MathObject.cpp:
(KJS::mathProtoFuncAbs):
(KJS::mathProtoFuncACos):
(KJS::mathProtoFuncASin):
(KJS::mathProtoFuncATan):
(KJS::mathProtoFuncATan2):
(KJS::mathProtoFuncCeil):
(KJS::mathProtoFuncCos):
(KJS::mathProtoFuncExp):
(KJS::mathProtoFuncFloor):
(KJS::mathProtoFuncLog):
(KJS::mathProtoFuncMax):
(KJS::mathProtoFuncMin):
(KJS::mathProtoFuncPow):
(KJS::mathProtoFuncRandom):
(KJS::mathProtoFuncRound):
(KJS::mathProtoFuncSin):
(KJS::mathProtoFuncSqrt):
(KJS::mathProtoFuncTan):
* kjs/MathObject.h:
* kjs/NumberObject.cpp:
(KJS::numberProtoFuncToString):
(KJS::numberProtoFuncToLocaleString):
(KJS::numberProtoFuncValueOf):
(KJS::numberProtoFuncToFixed):
(KJS::numberProtoFuncToExponential):
(KJS::numberProtoFuncToPrecision):
(KJS::NumberConstructor::NumberConstructor):
(KJS::constructWithNumberConstructor):
(KJS::NumberConstructor::getConstructData):
(KJS::callNumberConstructor):
(KJS::NumberConstructor::getCallData):
(KJS::constructNumber):
(KJS::constructNumberFromImmediateNumber):
* kjs/NumberObject.h:
(KJS::NumberObject::classInfo):
(KJS::NumberConstructor::classInfo):
* kjs/PropertySlot.cpp:
(KJS::PropertySlot::functionGetter):
* kjs/RegExpObject.cpp:
(KJS::regExpProtoFuncTest):
(KJS::regExpProtoFuncExec):
(KJS::regExpProtoFuncCompile):
(KJS::regExpProtoFuncToString):
(KJS::callRegExpObject):
(KJS::RegExpObject::getCallData):
(KJS::constructRegExp):
(KJS::constructWithRegExpConstructor):
(KJS::RegExpConstructor::getConstructData):
(KJS::callRegExpConstructor):
(KJS::RegExpConstructor::getCallData):
* kjs/RegExpObject.h:
(KJS::RegExpConstructor::classInfo):
* kjs/Shell.cpp:
(GlobalObject::GlobalObject):
(functionPrint):
(functionDebug):
(functionGC):
(functionVersion):
(functionRun):
(functionLoad):
(functionReadline):
(functionQuit):
* kjs/date_object.cpp:
(KJS::gmtoffset):
(KJS::formatLocaleDate):
(KJS::fillStructuresUsingDateArgs):
(KJS::DateInstance::getTime):
(KJS::DateInstance::getUTCTime):
(KJS::DateConstructor::DateConstructor):
(KJS::constructDate):
(KJS::DateConstructor::getConstructData):
(KJS::callDate):
(KJS::DateConstructor::getCallData):
(KJS::dateParse):
(KJS::dateNow):
(KJS::dateUTC):
(KJS::dateProtoFuncToString):
(KJS::dateProtoFuncToUTCString):
(KJS::dateProtoFuncToDateString):
(KJS::dateProtoFuncToTimeString):
(KJS::dateProtoFuncToLocaleString):
(KJS::dateProtoFuncToLocaleDateString):
(KJS::dateProtoFuncToLocaleTimeString):
(KJS::dateProtoFuncValueOf):
(KJS::dateProtoFuncGetTime):
(KJS::dateProtoFuncGetFullYear):
(KJS::dateProtoFuncGetUTCFullYear):
(KJS::dateProtoFuncToGMTString):
(KJS::dateProtoFuncGetMonth):
(KJS::dateProtoFuncGetUTCMonth):
(KJS::dateProtoFuncGetDate):
(KJS::dateProtoFuncGetUTCDate):
(KJS::dateProtoFuncGetDay):
(KJS::dateProtoFuncGetUTCDay):
(KJS::dateProtoFuncGetHours):
(KJS::dateProtoFuncGetUTCHours):
(KJS::dateProtoFuncGetMinutes):
(KJS::dateProtoFuncGetUTCMinutes):
(KJS::dateProtoFuncGetSeconds):
(KJS::dateProtoFuncGetUTCSeconds):
(KJS::dateProtoFuncGetMilliSeconds):
(KJS::dateProtoFuncGetUTCMilliseconds):
(KJS::dateProtoFuncGetTimezoneOffset):
(KJS::dateProtoFuncSetTime):
(KJS::setNewValueFromTimeArgs):
(KJS::setNewValueFromDateArgs):
(KJS::dateProtoFuncSetMilliSeconds):
(KJS::dateProtoFuncSetUTCMilliseconds):
(KJS::dateProtoFuncSetSeconds):
(KJS::dateProtoFuncSetUTCSeconds):
(KJS::dateProtoFuncSetMinutes):
(KJS::dateProtoFuncSetUTCMinutes):
(KJS::dateProtoFuncSetHours):
(KJS::dateProtoFuncSetUTCHours):
(KJS::dateProtoFuncSetDate):
(KJS::dateProtoFuncSetUTCDate):
(KJS::dateProtoFuncSetMonth):
(KJS::dateProtoFuncSetUTCMonth):
(KJS::dateProtoFuncSetFullYear):
(KJS::dateProtoFuncSetUTCFullYear):
(KJS::dateProtoFuncSetYear):
(KJS::dateProtoFuncGetYear):
* kjs/date_object.h:
(KJS::DateInstance::internalNumber):
(KJS::DateInstance::classInfo):
* kjs/error_object.cpp:
(KJS::errorProtoFuncToString):
(KJS::constructError):
(KJS::constructWithErrorConstructor):
(KJS::ErrorConstructor::getConstructData):
(KJS::callErrorConstructor):
(KJS::ErrorConstructor::getCallData):
(KJS::NativeErrorConstructor::construct):
(KJS::constructWithNativeErrorConstructor):
(KJS::NativeErrorConstructor::getConstructData):
(KJS::callNativeErrorConstructor):
(KJS::NativeErrorConstructor::getCallData):
* kjs/error_object.h:
(KJS::NativeErrorConstructor::classInfo):
* kjs/internal.cpp:
(KJS::JSNumberCell::toObject):
(KJS::JSNumberCell::toThisObject):
(KJS::GetterSetter::mark):
(KJS::GetterSetter::toPrimitive):
(KJS::GetterSetter::toBoolean):
(KJS::GetterSetter::toNumber):
(KJS::GetterSetter::toString):
(KJS::GetterSetter::toObject):
(KJS::InternalFunction::InternalFunction):
(KJS::InternalFunction::implementsHasInstance):
* kjs/lookup.h:
(KJS::HashEntry::):
* kjs/nodes.cpp:
(KJS::FuncDeclNode::makeFunction):
(KJS::FuncExprNode::makeFunction):
* kjs/object_object.cpp:
(KJS::objectProtoFuncValueOf):
(KJS::objectProtoFuncHasOwnProperty):
(KJS::objectProtoFuncIsPrototypeOf):
(KJS::objectProtoFuncDefineGetter):
(KJS::objectProtoFuncDefineSetter):
(KJS::objectProtoFuncLookupGetter):
(KJS::objectProtoFuncLookupSetter):
(KJS::objectProtoFuncPropertyIsEnumerable):
(KJS::objectProtoFuncToLocaleString):
(KJS::objectProtoFuncToString):
(KJS::ObjectConstructor::ObjectConstructor):
(KJS::constructObject):
(KJS::constructWithObjectConstructor):
(KJS::ObjectConstructor::getConstructData):
(KJS::callObjectConstructor):
(KJS::ObjectConstructor::getCallData):
* kjs/object_object.h:
* kjs/string_object.cpp:
(KJS::replace):
(KJS::stringProtoFuncToString):
(KJS::stringProtoFuncValueOf):
(KJS::stringProtoFuncCharAt):
(KJS::stringProtoFuncCharCodeAt):
(KJS::stringProtoFuncConcat):
(KJS::stringProtoFuncIndexOf):
(KJS::stringProtoFuncLastIndexOf):
(KJS::stringProtoFuncMatch):
(KJS::stringProtoFuncSearch):
(KJS::stringProtoFuncReplace):
(KJS::stringProtoFuncSlice):
(KJS::stringProtoFuncSplit):
(KJS::stringProtoFuncSubstr):
(KJS::stringProtoFuncSubstring):
(KJS::stringProtoFuncToLowerCase):
(KJS::stringProtoFuncToUpperCase):
(KJS::stringProtoFuncToLocaleLowerCase):
(KJS::stringProtoFuncToLocaleUpperCase):
(KJS::stringProtoFuncLocaleCompare):
(KJS::stringProtoFuncBig):
(KJS::stringProtoFuncSmall):
(KJS::stringProtoFuncBlink):
(KJS::stringProtoFuncBold):
(KJS::stringProtoFuncFixed):
(KJS::stringProtoFuncItalics):
(KJS::stringProtoFuncStrike):
(KJS::stringProtoFuncSub):
(KJS::stringProtoFuncSup):
(KJS::stringProtoFuncFontcolor):
(KJS::stringProtoFuncFontsize):
(KJS::stringProtoFuncAnchor):
(KJS::stringProtoFuncLink):
(KJS::stringFromCharCode):
(KJS::StringConstructor::StringConstructor):
(KJS::constructWithStringConstructor):
(KJS::StringConstructor::getConstructData):
(KJS::callStringConstructor):
(KJS::StringConstructor::getCallData):
* kjs/string_object.h:
JavaScriptGlue:
2008-06-23 Darin Adler <darin@apple.com>
Reviewed by Geoff.
* JSValueWrapper.cpp:
(JSValueWrapper::JSObjectCallFunction): Updated to use getCallData and call instead
of the old callAsFunction.
WebCore:
2008-06-23 Darin Adler <darin@apple.com>
Reviewed by Geoff.
Update for JavaScript changes.
- Use CallData and ConstructData instead of the obsolete implementsCall,
callAsFunction, and construct functions.
- Updated native function arguments, specifically to allow a JSValue
rather than a JSObject for the this argument, and to call toThisObject
as needed when treating it as an object.
- Made some more class members private and protected, including virtual
function overrides.
- Eliminated the use of getCallData in the JavaScript bridging code as
a way to check if an instance supports invokeDefaultMethod.
- Eliminated unnecessary polymorphism in the NodeIterator and TreeWalker
classes. They were using virtual functions simply to share an instance
of the RefCounted template, which was not helpful.
* bindings/js/JSAudioConstructor.cpp:
(WebCore::constructAudio):
(WebCore::JSAudioConstructor::getConstructData):
* bindings/js/JSAudioConstructor.h:
(WebCore::JSAudioConstructor::document):
(WebCore::JSAudioConstructor::classInfo):
* bindings/js/JSClipboardCustom.cpp:
(WebCore::JSClipboard::types):
* bindings/js/JSCustomSQLStatementCallback.cpp:
(WebCore::JSCustomSQLStatementCallback::handleEvent):
* bindings/js/JSCustomSQLStatementErrorCallback.cpp:
(WebCore::JSCustomSQLStatementErrorCallback::handleEvent):
* bindings/js/JSCustomSQLTransactionCallback.cpp:
(WebCore::JSCustomSQLTransactionCallback::handleEvent):
* bindings/js/JSCustomSQLTransactionErrorCallback.cpp:
(WebCore::JSCustomSQLTransactionErrorCallback::handleEvent):
* bindings/js/JSCustomVoidCallback.cpp:
(WebCore::JSCustomVoidCallback::handleEvent):
* bindings/js/JSCustomXPathNSResolver.cpp:
(WebCore::JSCustomXPathNSResolver::lookupNamespaceURI):
* bindings/js/JSDOMBinding.h:
(WebCore::DOMObject::DOMObject):
* bindings/js/JSDOMWindowBase.cpp:
(WebCore::windowProtoFuncAToB):
(WebCore::windowProtoFuncBToA):
(WebCore::windowProtoFuncOpen):
(WebCore::windowProtoFuncSetTimeout):
(WebCore::windowProtoFuncClearTimeout):
(WebCore::windowProtoFuncSetInterval):
(WebCore::windowProtoFuncAddEventListener):
(WebCore::windowProtoFuncRemoveEventListener):
(WebCore::windowProtoFuncShowModalDialog):
(WebCore::windowProtoFuncNotImplemented):
(WebCore::toJSDOMWindow):
* bindings/js/JSDOMWindowBase.h:
* bindings/js/JSDOMWindowShell.h:
(WebCore::JSDOMWindowShell::classInfo):
* bindings/js/JSEventListener.cpp:
(WebCore::JSAbstractEventListener::handleEvent):
(WebCore::JSLazyEventListener::parseCode):
* bindings/js/JSEventTargetBase.cpp:
(WebCore::retrieveEventTargetAndCorrespondingNode):
(WebCore::jsEventTargetAddEventListener):
(WebCore::jsEventTargetRemoveEventListener):
(WebCore::jsEventTargetDispatchEvent):
* bindings/js/JSEventTargetBase.h:
* bindings/js/JSHTMLAppletElementCustom.cpp:
(WebCore::JSHTMLAppletElement::customGetOwnPropertySlot):
(WebCore::JSHTMLAppletElement::customPut):
(WebCore::JSHTMLAppletElement::getCallData):
* bindings/js/JSHTMLCollectionCustom.cpp:
(WebCore::callHTMLCollection):
(WebCore::JSHTMLCollection::getCallData):
* bindings/js/JSHTMLDocumentCustom.cpp:
(WebCore::JSHTMLDocument::open):
* bindings/js/JSHTMLEmbedElementCustom.cpp:
(WebCore::JSHTMLEmbedElement::customGetOwnPropertySlot):
(WebCore::JSHTMLEmbedElement::customPut):
(WebCore::JSHTMLEmbedElement::getCallData):
* bindings/js/JSHTMLInputElementBase.cpp:
(WebCore::jsHTMLInputElementBaseFunctionSetSelectionRange):
* bindings/js/JSHTMLInputElementBase.h:
* bindings/js/JSHTMLObjectElementCustom.cpp:
(WebCore::JSHTMLObjectElement::customGetOwnPropertySlot):
(WebCore::JSHTMLObjectElement::customPut):
(WebCore::JSHTMLObjectElement::getCallData):
* bindings/js/JSHTMLOptionElementConstructor.cpp:
(WebCore::constructHTMLOptionElement):
(WebCore::JSHTMLOptionElementConstructor::getConstructData):
* bindings/js/JSHTMLOptionElementConstructor.h:
(WebCore::JSHTMLOptionElementConstructor::document):
(WebCore::JSHTMLOptionElementConstructor::classInfo):
* bindings/js/JSImageConstructor.cpp:
(WebCore::constructImage):
(WebCore::JSImageConstructor::getConstructData):
* bindings/js/JSImageConstructor.h:
(WebCore::JSImageConstructor::document):
(WebCore::JSImageConstructor::classInfo):
* bindings/js/JSInspectedObjectWrapper.h:
(WebCore::JSInspectedObjectWrapper::classInfo):
* bindings/js/JSInspectorCallbackWrapper.cpp:
(WebCore::JSInspectorCallbackWrapper::prepareIncomingValue):
* bindings/js/JSJavaScriptCallFrameCustom.cpp:
(WebCore::JSJavaScriptCallFrame::scopeChain):
* bindings/js/JSNodeFilterCondition.cpp:
(WebCore::JSNodeFilterCondition::JSNodeFilterCondition):
(WebCore::JSNodeFilterCondition::mark):
(WebCore::JSNodeFilterCondition::acceptNode):
* bindings/js/JSNodeFilterCondition.h:
(WebCore::JSNodeFilterCondition::create):
* bindings/js/JSNodeFilterCustom.cpp:
(WebCore::toNodeFilter):
* bindings/js/JSNodeListCustom.cpp:
(WebCore::callNodeList):
(WebCore::JSNodeList::getCallData):
(WebCore::JSNodeList::canGetItemsForName):
(WebCore::JSNodeList::nameGetter):
* bindings/js/JSPluginElementFunctions.cpp:
(WebCore::runtimeObjectGetter):
(WebCore::runtimeObjectPropertyGetter):
(WebCore::runtimeObjectCustomGetOwnPropertySlot):
(WebCore::runtimeObjectCustomPut):
(WebCore::runtimeObjectGetCallData):
(WebCore::pluginInstance):
(WebCore::getRuntimeObject):
(WebCore::callPlugin):
* bindings/js/JSPluginElementFunctions.h:
* bindings/js/JSQuarantinedObjectWrapper.cpp:
(WebCore::JSQuarantinedObjectWrapper::put):
(WebCore::JSQuarantinedObjectWrapper::construct):
(WebCore::JSQuarantinedObjectWrapper::getConstructData):
(WebCore::JSQuarantinedObjectWrapper::hasInstance):
(WebCore::JSQuarantinedObjectWrapper::call):
(WebCore::JSQuarantinedObjectWrapper::getCallData):
* bindings/js/JSQuarantinedObjectWrapper.h:
(WebCore::JSQuarantinedObjectWrapper::className):
* bindings/js/JSRGBColor.cpp:
* bindings/js/JSXMLHttpRequestConstructor.cpp:
(WebCore::constructXMLHttpRequest):
(WebCore::JSXMLHttpRequestConstructor::getConstructData):
* bindings/js/JSXMLHttpRequestConstructor.h:
(WebCore::JSXMLHttpRequestConstructor::document):
(WebCore::JSXMLHttpRequestConstructor::classInfo):
* bindings/js/JSXSLTProcessorConstructor.cpp:
(WebCore::constructXSLTProcessor):
(WebCore::JSXSLTProcessorConstructor::getConstructData):
* bindings/js/JSXSLTProcessorConstructor.h:
(WebCore::JSXSLTProcessorConstructor::classInfo):
* bindings/js/ScheduledAction.cpp:
(WebCore::ScheduledAction::ScheduledAction):
(WebCore::ScheduledAction::execute):
* bindings/js/ScheduledAction.h:
* bindings/objc/WebScriptObject.mm:
(-[WebScriptObject callWebScriptMethod:withArguments:]):
* bindings/scripts/CodeGeneratorJS.pm:
* bridge/NP_jsobject.cpp:
(_NPN_InvokeDefault):
(_NPN_Invoke):
* bridge/c/c_instance.cpp:
(KJS::Bindings::CInstance::supportsInvokeDefaultMethod):
* bridge/c/c_instance.h:
* bridge/jni/jni_jsobject.mm:
(JavaJSObject::call):
* bridge/objc/objc_instance.h:
* bridge/objc/objc_instance.mm:
(ObjcInstance::supportsInvokeDefaultMethod):
* bridge/objc/objc_runtime.h:
(KJS::Bindings::ObjcFallbackObjectImp::propertyName):
(KJS::Bindings::ObjcFallbackObjectImp::classInfo):
* bridge/objc/objc_runtime.mm:
(Bindings::webScriptObjectClass):
(Bindings::webUndefinedClass):
(ObjcFallbackObjectImp::ObjcFallbackObjectImp):
(callObjCFallbackObject):
(ObjcFallbackObjectImp::getCallData):
* bridge/qt/qt_instance.h:
* bridge/runtime.cpp:
(KJS::Bindings::Instance::createRuntimeObject):
(KJS::Bindings::Instance::getInstance):
* bridge/runtime.h:
(KJS::Bindings::Field::~Field):
(KJS::Bindings::Method::~Method):
(KJS::Bindings::Class::~Class):
(KJS::Bindings::Instance::supportsInvokeDefaultMethod):
* bridge/runtime_method.cpp:
(KJS::callRuntimeMethod):
(KJS::RuntimeMethod::getCallData):
* bridge/runtime_method.h:
(KJS::RuntimeMethod::methods):
* bridge/runtime_object.cpp:
(RuntimeObjectImp::defaultValue):
(callRuntimeObject):
(RuntimeObjectImp::getCallData):
* bridge/runtime_object.h:
(KJS::RuntimeObjectImp::getInternalInstance):
(KJS::RuntimeObjectImp::classInfo):
* dom/NodeIterator.h:
* dom/Traversal.cpp:
* dom/Traversal.h:
* dom/TreeWalker.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@34754 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/kjs/string_object.cpp b/JavaScriptCore/kjs/string_object.cpp
index d2c4853..b679c252 100644
--- a/JavaScriptCore/kjs/string_object.cpp
+++ b/JavaScriptCore/kjs/string_object.cpp
@@ -21,7 +21,6 @@
#include "config.h"
#include "string_object.h"
-#include "string_object.lut.h"
#include "JSWrapperObject.h"
#include "PropertyNameArray.h"
@@ -36,6 +35,46 @@
namespace KJS {
+static JSValue* stringProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncValueOf(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncCharAt(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncCharCodeAt(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncConcat(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncIndexOf(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncLastIndexOf(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncMatch(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncReplace(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSearch(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSlice(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSplit(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSubstr(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSubstring(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncToLowerCase(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncToUpperCase(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncToLocaleLowerCase(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncToLocaleUpperCase(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncLocaleCompare(ExecState*, JSObject*, JSValue*, const ArgList&);
+
+static JSValue* stringProtoFuncBig(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSmall(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncBlink(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncBold(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncFixed(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncItalics(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncStrike(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSub(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSup(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncFontcolor(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncFontsize(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncAnchor(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncLink(ExecState*, JSObject*, JSValue*, const ArgList&);
+
+}
+
+#include "string_object.lut.h"
+
+namespace KJS {
+
// ------------------------------ StringObject ----------------------------
const ClassInfo StringObject::info = { "String", 0, 0, 0 };
@@ -98,39 +137,39 @@
const ClassInfo StringPrototype::info = { "String", &StringObject::info, 0, ExecState::stringTable };
/* Source for string_object.lut.h
@begin stringTable 26
- toString &stringProtoFuncToString DontEnum|Function 0
- valueOf &stringProtoFuncValueOf DontEnum|Function 0
- charAt &stringProtoFuncCharAt DontEnum|Function 1
- charCodeAt &stringProtoFuncCharCodeAt DontEnum|Function 1
- concat &stringProtoFuncConcat DontEnum|Function 1
- indexOf &stringProtoFuncIndexOf DontEnum|Function 1
- lastIndexOf &stringProtoFuncLastIndexOf DontEnum|Function 1
- match &stringProtoFuncMatch DontEnum|Function 1
- replace &stringProtoFuncReplace DontEnum|Function 2
- search &stringProtoFuncSearch DontEnum|Function 1
- slice &stringProtoFuncSlice DontEnum|Function 2
- split &stringProtoFuncSplit DontEnum|Function 2
- substr &stringProtoFuncSubstr DontEnum|Function 2
- substring &stringProtoFuncSubstring DontEnum|Function 2
- toLowerCase &stringProtoFuncToLowerCase DontEnum|Function 0
- toUpperCase &stringProtoFuncToUpperCase DontEnum|Function 0
- toLocaleLowerCase &stringProtoFuncToLocaleLowerCase DontEnum|Function 0
- toLocaleUpperCase &stringProtoFuncToLocaleUpperCase DontEnum|Function 0
- localeCompare &stringProtoFuncLocaleCompare DontEnum|Function 1
+ toString stringProtoFuncToString DontEnum|Function 0
+ valueOf stringProtoFuncValueOf DontEnum|Function 0
+ charAt stringProtoFuncCharAt DontEnum|Function 1
+ charCodeAt stringProtoFuncCharCodeAt DontEnum|Function 1
+ concat stringProtoFuncConcat DontEnum|Function 1
+ indexOf stringProtoFuncIndexOf DontEnum|Function 1
+ lastIndexOf stringProtoFuncLastIndexOf DontEnum|Function 1
+ match stringProtoFuncMatch DontEnum|Function 1
+ replace stringProtoFuncReplace DontEnum|Function 2
+ search stringProtoFuncSearch DontEnum|Function 1
+ slice stringProtoFuncSlice DontEnum|Function 2
+ split stringProtoFuncSplit DontEnum|Function 2
+ substr stringProtoFuncSubstr DontEnum|Function 2
+ substring stringProtoFuncSubstring DontEnum|Function 2
+ toLowerCase stringProtoFuncToLowerCase DontEnum|Function 0
+ toUpperCase stringProtoFuncToUpperCase DontEnum|Function 0
+ toLocaleLowerCase stringProtoFuncToLocaleLowerCase DontEnum|Function 0
+ toLocaleUpperCase stringProtoFuncToLocaleUpperCase DontEnum|Function 0
+ localeCompare stringProtoFuncLocaleCompare DontEnum|Function 1
- big &stringProtoFuncBig DontEnum|Function 0
- small &stringProtoFuncSmall DontEnum|Function 0
- blink &stringProtoFuncBlink DontEnum|Function 0
- bold &stringProtoFuncBold DontEnum|Function 0
- fixed &stringProtoFuncFixed DontEnum|Function 0
- italics &stringProtoFuncItalics DontEnum|Function 0
- strike &stringProtoFuncStrike DontEnum|Function 0
- sub &stringProtoFuncSub DontEnum|Function 0
- sup &stringProtoFuncSup DontEnum|Function 0
- fontcolor &stringProtoFuncFontcolor DontEnum|Function 1
- fontsize &stringProtoFuncFontsize DontEnum|Function 1
- anchor &stringProtoFuncAnchor DontEnum|Function 1
- link &stringProtoFuncLink DontEnum|Function 1
+ big stringProtoFuncBig DontEnum|Function 0
+ small stringProtoFuncSmall DontEnum|Function 0
+ blink stringProtoFuncBlink DontEnum|Function 0
+ bold stringProtoFuncBold DontEnum|Function 0
+ fixed stringProtoFuncFixed DontEnum|Function 0
+ italics stringProtoFuncItalics DontEnum|Function 0
+ strike stringProtoFuncStrike DontEnum|Function 0
+ sub stringProtoFuncSub DontEnum|Function 0
+ sup stringProtoFuncSup DontEnum|Function 0
+ fontcolor stringProtoFuncFontcolor DontEnum|Function 1
+ fontsize stringProtoFuncFontsize DontEnum|Function 1
+ anchor stringProtoFuncAnchor DontEnum|Function 1
+ link stringProtoFuncLink DontEnum|Function 1
@end
*/
// ECMA 15.5.4
@@ -267,12 +306,11 @@
static JSValue *replace(ExecState *exec, JSString* sourceVal, JSValue *pattern, JSValue *replacement)
{
UString source = sourceVal->value();
- JSObject *replacementFunction = 0;
+ CallData callData;
UString replacementString;
- if (replacement->isObject() && replacement->toObject(exec)->implementsCall())
- replacementFunction = replacement->toObject(exec);
- else
+ CallType callType = replacement->getCallData(callData);
+ if (callType == CallTypeNone)
replacementString = replacement->toString(exec);
if (pattern->isObject() && static_cast<JSObject *>(pattern)->inherits(&RegExpObject::info)) {
@@ -303,7 +341,7 @@
pushSourceRange(sourceRanges, sourceRangeCount, sourceRangeCapacity, UString::Range(lastIndex, matchIndex - lastIndex));
UString substitutedReplacement;
- if (replacementFunction) {
+ if (callType != CallTypeNone) {
int completeMatchStart = ovector[0];
ArgList args;
@@ -320,7 +358,7 @@
args.append(jsNumber(exec, completeMatchStart));
args.append(sourceVal);
- substitutedReplacement = replacementFunction->callAsFunction(exec, exec->globalThisValue(), args)->toString(exec);
+ substitutedReplacement = call(exec, replacement, callType, callData, exec->globalThisValue(), args)->toString(exec);
} else
substitutedReplacement = substituteBackreferences(replacementString, source, ovector, reg);
@@ -362,39 +400,39 @@
if (matchPos == -1)
return sourceVal;
- if (replacementFunction) {
+ if (callType != CallTypeNone) {
ArgList args;
args.append(jsString(exec, source.substr(matchPos, matchLen)));
args.append(jsNumber(exec, matchPos));
args.append(sourceVal);
- replacementString = replacementFunction->callAsFunction(exec, exec->globalThisValue(), args)->toString(exec);
+ replacementString = call(exec, replacement, callType, callData, exec->globalThisValue(), args)->toString(exec);
}
return jsString(exec, source.substr(0, matchPos) + replacementString + source.substr(matchPos + matchLen));
}
-JSValue* stringProtoFuncToString(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToString(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
- if (!thisObj->inherits(&StringObject::info))
+ if (!thisValue->isObject(&StringObject::info))
return throwError(exec, TypeError);
- return static_cast<StringObject*>(thisObj)->internalValue();
+ return static_cast<StringObject*>(thisValue)->internalValue();
}
-JSValue* stringProtoFuncValueOf(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncValueOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
- if (!thisObj->inherits(&StringObject::info))
+ if (!thisValue->isObject(&StringObject::info))
return throwError(exec, TypeError);
- return static_cast<StringObject*>(thisObj)->internalValue();
+ return static_cast<StringObject*>(thisValue)->internalValue();
}
-JSValue* stringProtoFuncCharAt(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncCharAt(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
int len = s.size();
UString u;
@@ -407,10 +445,10 @@
return jsString(exec, u);
}
-JSValue* stringProtoFuncCharCodeAt(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncCharCodeAt(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
int len = s.size();
JSValue* result = 0;
@@ -424,10 +462,10 @@
return result;
}
-JSValue* stringProtoFuncConcat(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncConcat(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
ArgList::const_iterator end = args.end();
for (ArgList::const_iterator it = args.begin(); it != end; ++it) {
@@ -436,10 +474,10 @@
return jsString(exec, s);
}
-JSValue* stringProtoFuncIndexOf(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncIndexOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
int len = s.size();
JSValue* a0 = args[0];
@@ -453,10 +491,10 @@
return jsNumber(exec, s.find(u2, static_cast<int>(dpos)));
}
-JSValue* stringProtoFuncLastIndexOf(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncLastIndexOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
int len = s.size();
JSValue* a0 = args[0];
@@ -471,10 +509,10 @@
return jsNumber(exec, s.rfind(u2, static_cast<int>(dpos)));
}
-JSValue* stringProtoFuncMatch(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncMatch(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
JSValue* a0 = args[0];
@@ -520,16 +558,16 @@
// other browsers and because Null is a false value.
result = jsNull();
} else {
- result = exec->lexicalGlobalObject()->arrayConstructor()->construct(exec, list);
+ result = constructArray(exec, list);
}
}
return result;
}
-JSValue* stringProtoFuncSearch(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSearch(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
JSValue* a0 = args[0];
@@ -552,13 +590,13 @@
return jsNumber(exec, pos);
}
-JSValue* stringProtoFuncReplace(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncReplace(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
- JSString* sVal = thisObj->inherits(&StringObject::info) ?
- static_cast<StringObject*>(thisObj)->internalValue() :
+ JSString* sVal = thisValue->isObject(&StringObject::info) ?
+ static_cast<StringObject*>(thisValue)->internalValue() :
static_cast<JSString*>(jsString(exec, s));
JSValue* a0 = args[0];
@@ -567,10 +605,10 @@
return replace(exec, sVal, a0, a1);
}
-JSValue* stringProtoFuncSlice(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSlice(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
int len = s.size();
JSValue* a0 = args[0];
@@ -592,16 +630,15 @@
return jsString(exec, "");
}
-JSValue* stringProtoFuncSplit(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSplit(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
JSValue* a0 = args[0];
JSValue* a1 = args[1];
- JSObject *constructor = exec->lexicalGlobalObject()->arrayConstructor();
- JSObject* res = static_cast<JSObject*>(constructor->construct(exec, exec->emptyList()));
+ JSObject* res = constructEmptyArray(exec);
JSValue* result = res;
UString u = s;
int pos;
@@ -662,10 +699,10 @@
return result;
}
-JSValue* stringProtoFuncSubstr(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSubstr(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
int len = s.size();
JSValue* a0 = args[0];
@@ -687,10 +724,10 @@
return jsString(exec, s.substr(static_cast<int>(start), static_cast<int>(length)));
}
-JSValue* stringProtoFuncSubstring(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSubstring(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
int len = s.size();
JSValue* a0 = args[0];
@@ -720,13 +757,13 @@
return jsString(exec, s.substr((int)start, (int)end-(int)start));
}
-JSValue* stringProtoFuncToLowerCase(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToLowerCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
- JSString* sVal = thisObj->inherits(&StringObject::info)
- ? static_cast<StringObject*>(thisObj)->internalValue()
+ JSString* sVal = thisValue->isObject(&StringObject::info)
+ ? static_cast<StringObject*>(thisValue)->internalValue()
: static_cast<JSString*>(jsString(exec, s));
int ssize = s.size();
if (!ssize)
@@ -745,13 +782,13 @@
return jsString(exec, UString(buffer.releaseBuffer(), length, false));
}
-JSValue* stringProtoFuncToUpperCase(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToUpperCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
- JSString* sVal = thisObj->inherits(&StringObject::info)
- ? static_cast<StringObject*>(thisObj)->internalValue()
+ JSString* sVal = thisValue->isObject(&StringObject::info)
+ ? static_cast<StringObject*>(thisValue)->internalValue()
: static_cast<JSString*>(jsString(exec, s));
int ssize = s.size();
if (!ssize)
@@ -770,14 +807,14 @@
return jsString(exec, UString(buffer.releaseBuffer(), length, false));
}
-JSValue* stringProtoFuncToLocaleLowerCase(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToLocaleLowerCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
// FIXME: See http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt for locale-sensitive mappings that aren't implemented.
- JSString* sVal = thisObj->inherits(&StringObject::info)
- ? static_cast<StringObject*>(thisObj)->internalValue()
+ JSString* sVal = thisValue->isObject(&StringObject::info)
+ ? static_cast<StringObject*>(thisValue)->internalValue()
: static_cast<JSString*>(jsString(exec, s));
int ssize = s.size();
if (!ssize)
@@ -796,13 +833,13 @@
return jsString(exec, UString(buffer.releaseBuffer(), length, false));
}
-JSValue* stringProtoFuncToLocaleUpperCase(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToLocaleUpperCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
- JSString* sVal = thisObj->inherits(&StringObject::info)
- ? static_cast<StringObject*>(thisObj)->internalValue()
+ JSString* sVal = thisValue->isObject(&StringObject::info)
+ ? static_cast<StringObject*>(thisValue)->internalValue()
: static_cast<JSString*>(jsString(exec, s));
int ssize = s.size();
if (!ssize)
@@ -821,177 +858,170 @@
return jsString(exec, UString(buffer.releaseBuffer(), length, false));
}
-JSValue* stringProtoFuncLocaleCompare(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncLocaleCompare(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
if (args.size() < 1)
return jsNumber(exec, 0);
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
JSValue* a0 = args[0];
return jsNumber(exec, localeCompare(s, a0->toString(exec)));
}
-JSValue* stringProtoFuncBig(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncBig(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<big>" + s + "</big>");
}
-JSValue* stringProtoFuncSmall(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncSmall(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<small>" + s + "</small>");
}
-JSValue* stringProtoFuncBlink(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncBlink(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<blink>" + s + "</blink>");
}
-JSValue* stringProtoFuncBold(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncBold(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<b>" + s + "</b>");
}
-JSValue* stringProtoFuncFixed(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncFixed(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<tt>" + s + "</tt>");
}
-JSValue* stringProtoFuncItalics(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncItalics(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<i>" + s + "</i>");
}
-JSValue* stringProtoFuncStrike(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncStrike(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<strike>" + s + "</strike>");
}
-JSValue* stringProtoFuncSub(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncSub(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<sub>" + s + "</sub>");
}
-JSValue* stringProtoFuncSup(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncSup(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
return jsString(exec, "<sup>" + s + "</sup>");
}
-JSValue* stringProtoFuncFontcolor(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncFontcolor(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
JSValue* a0 = args[0];
return jsString(exec, "<font color=\"" + a0->toString(exec) + "\">" + s + "</font>");
}
-JSValue* stringProtoFuncFontsize(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncFontsize(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
JSValue* a0 = args[0];
return jsString(exec, "<font size=\"" + a0->toString(exec) + "\">" + s + "</font>");
}
-JSValue* stringProtoFuncAnchor(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncAnchor(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
JSValue* a0 = args[0];
return jsString(exec, "<a name=\"" + a0->toString(exec) + "\">" + s + "</a>");
}
-JSValue* stringProtoFuncLink(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncLink(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
{
// This optimizes the common case that thisObj is a StringObject
- UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+ UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
JSValue* a0 = args[0];
return jsString(exec, "<a href=\"" + a0->toString(exec) + "\">" + s + "</a>");
}
// ------------------------------ StringConstructor ------------------------------
+static JSValue* stringFromCharCode(ExecState* exec, JSObject*, JSValue*, const ArgList& args)
+{
+ UString s;
+ if (args.size()) {
+ UChar* buf = static_cast<UChar*>(fastMalloc(args.size() * sizeof(UChar)));
+ UChar* p = buf;
+ ArgList::const_iterator end = args.end();
+ for (ArgList::const_iterator it = args.begin(); it != end; ++it)
+ *p++ = static_cast<UChar>((*it)->toUInt32(exec));
+ s = UString(buf, args.size(), false);
+ } else
+ s = "";
+
+ return jsString(exec, s);
+}
+
StringConstructor::StringConstructor(ExecState* exec, FunctionPrototype* funcProto, StringPrototype* stringProto)
: InternalFunction(funcProto, Identifier(exec, stringProto->classInfo()->className))
{
// ECMA 15.5.3.1 String.prototype
- putDirect(exec->propertyNames().prototype, stringProto, DontEnum|DontDelete|ReadOnly);
+ putDirect(exec->propertyNames().prototype, stringProto, ReadOnly | DontEnum | DontDelete);
- putDirectFunction(new (exec) StringConstructorFunction(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);
+ // ECMA 15.5.3.2 fromCharCode()
+ putDirectFunction(new (exec) PrototypeFunction(exec, funcProto, 1, exec->propertyNames().fromCharCode, stringFromCharCode), DontEnum);
// no. of arguments for constructor
- putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
-}
-
-
-ConstructType StringConstructor::getConstructData(ConstructData&)
-{
- return ConstructTypeNative;
+ putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly | DontEnum | DontDelete);
}
// ECMA 15.5.2
-JSObject* StringConstructor::construct(ExecState* exec, const ArgList& args)
+static JSObject* constructWithStringConstructor(ExecState* exec, JSObject*, const ArgList& args)
{
- JSObject* proto = exec->lexicalGlobalObject()->stringPrototype();
- if (!args.size())
- return new (exec) StringObject(exec, proto);
- return new (exec) StringObject(exec, proto, args[0]->toString(exec));
+ JSObject* prototype = exec->lexicalGlobalObject()->stringPrototype();
+ if (args.isEmpty())
+ return new (exec) StringObject(exec, prototype);
+ return new (exec) StringObject(exec, prototype, args[0]->toString(exec));
+}
+
+ConstructType StringConstructor::getConstructData(ConstructData& constructData)
+{
+ constructData.native.function = constructWithStringConstructor;
+ return ConstructTypeNative;
}
// ECMA 15.5.1
-JSValue *StringConstructor::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const ArgList &args)
+static JSValue* callStringConstructor(ExecState* exec, JSObject*, JSValue*, const ArgList& args)
{
- if (args.isEmpty())
- return jsString(exec, "");
- else {
- JSValue *v = args[0];
- return jsString(exec, v->toString(exec));
- }
+ if (args.isEmpty())
+ return jsString(exec, "");
+ return jsString(exec, args[0]->toString(exec));
}
-// ------------------------------ StringConstructorFunction --------------------------
-
-// ECMA 15.5.3.2 fromCharCode()
-StringConstructorFunction::StringConstructorFunction(ExecState* exec, FunctionPrototype* funcProto, const Identifier& name)
- : InternalFunction(funcProto, name)
+CallType StringConstructor::getCallData(CallData& callData)
{
- putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum);
-}
-
-JSValue *StringConstructorFunction::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const ArgList &args)
-{
- UString s;
- if (args.size()) {
- UChar *buf = static_cast<UChar *>(fastMalloc(args.size() * sizeof(UChar)));
- UChar *p = buf;
- ArgList::const_iterator end = args.end();
- for (ArgList::const_iterator it = args.begin(); it != end; ++it) {
- unsigned short u = static_cast<unsigned short>((*it)->toUInt32(exec));
- *p++ = UChar(u);
- }
- s = UString(buf, args.size(), false);
- } else
- s = "";
-
- return jsString(exec, s);
+ callData.native.function = callStringConstructor;
+ return CallTypeNative;
}
} // namespace KJS