Ignore:
Timestamp:
Jun 23, 2008, 10:23:17 PM (17 years ago)
Author:
Darin Adler
Message:

JavaScriptCore:

2008-06-23 Darin Adler <Darin Adler>

Reviewed by Geoff.

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 Adler>

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 Adler>

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:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/string_object.cpp

    r34659 r34754  
    2222#include "config.h"
    2323#include "string_object.h"
    24 #include "string_object.lut.h"
    2524
    2625#include "JSWrapperObject.h"
     
    3736namespace KJS {
    3837
     38static JSValue* stringProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
     39static JSValue* stringProtoFuncValueOf(ExecState*, JSObject*, JSValue*, const ArgList&);
     40static JSValue* stringProtoFuncCharAt(ExecState*, JSObject*, JSValue*, const ArgList&);
     41static JSValue* stringProtoFuncCharCodeAt(ExecState*, JSObject*, JSValue*, const ArgList&);
     42static JSValue* stringProtoFuncConcat(ExecState*, JSObject*, JSValue*, const ArgList&);
     43static JSValue* stringProtoFuncIndexOf(ExecState*, JSObject*, JSValue*, const ArgList&);
     44static JSValue* stringProtoFuncLastIndexOf(ExecState*, JSObject*, JSValue*, const ArgList&);
     45static JSValue* stringProtoFuncMatch(ExecState*, JSObject*, JSValue*, const ArgList&);
     46static JSValue* stringProtoFuncReplace(ExecState*, JSObject*, JSValue*, const ArgList&);
     47static JSValue* stringProtoFuncSearch(ExecState*, JSObject*, JSValue*, const ArgList&);
     48static JSValue* stringProtoFuncSlice(ExecState*, JSObject*, JSValue*, const ArgList&);
     49static JSValue* stringProtoFuncSplit(ExecState*, JSObject*, JSValue*, const ArgList&);
     50static JSValue* stringProtoFuncSubstr(ExecState*, JSObject*, JSValue*, const ArgList&);
     51static JSValue* stringProtoFuncSubstring(ExecState*, JSObject*, JSValue*, const ArgList&);
     52static JSValue* stringProtoFuncToLowerCase(ExecState*, JSObject*, JSValue*, const ArgList&);
     53static JSValue* stringProtoFuncToUpperCase(ExecState*, JSObject*, JSValue*, const ArgList&);
     54static JSValue* stringProtoFuncToLocaleLowerCase(ExecState*, JSObject*, JSValue*, const ArgList&);
     55static JSValue* stringProtoFuncToLocaleUpperCase(ExecState*, JSObject*, JSValue*, const ArgList&);
     56static JSValue* stringProtoFuncLocaleCompare(ExecState*, JSObject*, JSValue*, const ArgList&);
     57
     58static JSValue* stringProtoFuncBig(ExecState*, JSObject*, JSValue*, const ArgList&);
     59static JSValue* stringProtoFuncSmall(ExecState*, JSObject*, JSValue*, const ArgList&);
     60static JSValue* stringProtoFuncBlink(ExecState*, JSObject*, JSValue*, const ArgList&);
     61static JSValue* stringProtoFuncBold(ExecState*, JSObject*, JSValue*, const ArgList&);
     62static JSValue* stringProtoFuncFixed(ExecState*, JSObject*, JSValue*, const ArgList&);
     63static JSValue* stringProtoFuncItalics(ExecState*, JSObject*, JSValue*, const ArgList&);
     64static JSValue* stringProtoFuncStrike(ExecState*, JSObject*, JSValue*, const ArgList&);
     65static JSValue* stringProtoFuncSub(ExecState*, JSObject*, JSValue*, const ArgList&);
     66static JSValue* stringProtoFuncSup(ExecState*, JSObject*, JSValue*, const ArgList&);
     67static JSValue* stringProtoFuncFontcolor(ExecState*, JSObject*, JSValue*, const ArgList&);
     68static JSValue* stringProtoFuncFontsize(ExecState*, JSObject*, JSValue*, const ArgList&);
     69static JSValue* stringProtoFuncAnchor(ExecState*, JSObject*, JSValue*, const ArgList&);
     70static JSValue* stringProtoFuncLink(ExecState*, JSObject*, JSValue*, const ArgList&);
     71
     72}
     73
     74#include "string_object.lut.h"
     75
     76namespace KJS {
     77
    3978// ------------------------------ StringObject ----------------------------
    4079
     
    99138/* Source for string_object.lut.h
    100139@begin stringTable 26
    101   toString              &stringProtoFuncToString          DontEnum|Function       0
    102   valueOf               &stringProtoFuncValueOf           DontEnum|Function       0
    103   charAt                &stringProtoFuncCharAt            DontEnum|Function       1
    104   charCodeAt            &stringProtoFuncCharCodeAt        DontEnum|Function       1
    105   concat                &stringProtoFuncConcat            DontEnum|Function       1
    106   indexOf               &stringProtoFuncIndexOf           DontEnum|Function       1
    107   lastIndexOf           &stringProtoFuncLastIndexOf       DontEnum|Function       1
    108   match                 &stringProtoFuncMatch             DontEnum|Function       1
    109   replace               &stringProtoFuncReplace           DontEnum|Function       2
    110   search                &stringProtoFuncSearch            DontEnum|Function       1
    111   slice                 &stringProtoFuncSlice             DontEnum|Function       2
    112   split                 &stringProtoFuncSplit             DontEnum|Function       2
    113   substr                &stringProtoFuncSubstr            DontEnum|Function       2
    114   substring             &stringProtoFuncSubstring         DontEnum|Function       2
    115   toLowerCase           &stringProtoFuncToLowerCase       DontEnum|Function       0
    116   toUpperCase           &stringProtoFuncToUpperCase       DontEnum|Function       0
    117   toLocaleLowerCase     &stringProtoFuncToLocaleLowerCase DontEnum|Function       0
    118   toLocaleUpperCase     &stringProtoFuncToLocaleUpperCase DontEnum|Function       0
    119   localeCompare         &stringProtoFuncLocaleCompare     DontEnum|Function       1
    120 
    121   big                   &stringProtoFuncBig               DontEnum|Function       0
    122   small                 &stringProtoFuncSmall             DontEnum|Function       0
    123   blink                 &stringProtoFuncBlink             DontEnum|Function       0
    124   bold                  &stringProtoFuncBold              DontEnum|Function       0
    125   fixed                 &stringProtoFuncFixed             DontEnum|Function       0
    126   italics               &stringProtoFuncItalics           DontEnum|Function       0
    127   strike                &stringProtoFuncStrike            DontEnum|Function       0
    128   sub                   &stringProtoFuncSub               DontEnum|Function       0
    129   sup                   &stringProtoFuncSup               DontEnum|Function       0
    130   fontcolor             &stringProtoFuncFontcolor         DontEnum|Function       1
    131   fontsize              &stringProtoFuncFontsize          DontEnum|Function       1
    132   anchor                &stringProtoFuncAnchor            DontEnum|Function       1
    133   link                  &stringProtoFuncLink              DontEnum|Function       1
     140  toString              stringProtoFuncToString          DontEnum|Function       0
     141  valueOf               stringProtoFuncValueOf           DontEnum|Function       0
     142  charAt                stringProtoFuncCharAt            DontEnum|Function       1
     143  charCodeAt            stringProtoFuncCharCodeAt        DontEnum|Function       1
     144  concat                stringProtoFuncConcat            DontEnum|Function       1
     145  indexOf               stringProtoFuncIndexOf           DontEnum|Function       1
     146  lastIndexOf           stringProtoFuncLastIndexOf       DontEnum|Function       1
     147  match                 stringProtoFuncMatch             DontEnum|Function       1
     148  replace               stringProtoFuncReplace           DontEnum|Function       2
     149  search                stringProtoFuncSearch            DontEnum|Function       1
     150  slice                 stringProtoFuncSlice             DontEnum|Function       2
     151  split                 stringProtoFuncSplit             DontEnum|Function       2
     152  substr                stringProtoFuncSubstr            DontEnum|Function       2
     153  substring             stringProtoFuncSubstring         DontEnum|Function       2
     154  toLowerCase           stringProtoFuncToLowerCase       DontEnum|Function       0
     155  toUpperCase           stringProtoFuncToUpperCase       DontEnum|Function       0
     156  toLocaleLowerCase     stringProtoFuncToLocaleLowerCase DontEnum|Function       0
     157  toLocaleUpperCase     stringProtoFuncToLocaleUpperCase DontEnum|Function       0
     158  localeCompare         stringProtoFuncLocaleCompare     DontEnum|Function       1
     159
     160  big                   stringProtoFuncBig               DontEnum|Function       0
     161  small                 stringProtoFuncSmall             DontEnum|Function       0
     162  blink                 stringProtoFuncBlink             DontEnum|Function       0
     163  bold                  stringProtoFuncBold              DontEnum|Function       0
     164  fixed                 stringProtoFuncFixed             DontEnum|Function       0
     165  italics               stringProtoFuncItalics           DontEnum|Function       0
     166  strike                stringProtoFuncStrike            DontEnum|Function       0
     167  sub                   stringProtoFuncSub               DontEnum|Function       0
     168  sup                   stringProtoFuncSup               DontEnum|Function       0
     169  fontcolor             stringProtoFuncFontcolor         DontEnum|Function       1
     170  fontsize              stringProtoFuncFontsize          DontEnum|Function       1
     171  anchor                stringProtoFuncAnchor            DontEnum|Function       1
     172  link                  stringProtoFuncLink              DontEnum|Function       1
    134173@end
    135174*/
     
    268307{
    269308  UString source = sourceVal->value();
    270   JSObject *replacementFunction = 0;
     309  CallData callData;
    271310  UString replacementString;
    272311
    273   if (replacement->isObject() && replacement->toObject(exec)->implementsCall())
    274     replacementFunction = replacement->toObject(exec);
    275   else
     312  CallType callType = replacement->getCallData(callData);
     313  if (callType == CallTypeNone)
    276314    replacementString = replacement->toString(exec);
    277315
     
    304342
    305343      UString substitutedReplacement;
    306       if (replacementFunction) {
     344      if (callType != CallTypeNone) {
    307345          int completeMatchStart = ovector[0];
    308346          ArgList args;
     
    321359          args.append(sourceVal);
    322360
    323           substitutedReplacement = replacementFunction->callAsFunction(exec, exec->globalThisValue(), args)->toString(exec);
     361          substitutedReplacement = call(exec, replacement, callType, callData, exec->globalThisValue(), args)->toString(exec);
    324362      } else
    325363          substitutedReplacement = substituteBackreferences(replacementString, source, ovector, reg);
     
    363401    return sourceVal;
    364402 
    365   if (replacementFunction) {
     403  if (callType != CallTypeNone) {
    366404      ArgList args;
    367405     
     
    370408      args.append(sourceVal);
    371409     
    372       replacementString = replacementFunction->callAsFunction(exec, exec->globalThisValue(), args)->toString(exec);
     410      replacementString = call(exec, replacement, callType, callData, exec->globalThisValue(), args)->toString(exec);
    373411  }
    374412
     
    376414}
    377415
    378 JSValue* stringProtoFuncToString(ExecState* exec, JSObject* thisObj, const ArgList&)
    379 {
    380     if (!thisObj->inherits(&StringObject::info))
     416JSValue* stringProtoFuncToString(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     417{
     418    if (!thisValue->isObject(&StringObject::info))
    381419        return throwError(exec, TypeError);
    382420
    383     return static_cast<StringObject*>(thisObj)->internalValue();
    384 }
    385 
    386 JSValue* stringProtoFuncValueOf(ExecState* exec, JSObject* thisObj, const ArgList&)
    387 {
    388     if (!thisObj->inherits(&StringObject::info))
     421    return static_cast<StringObject*>(thisValue)->internalValue();
     422}
     423
     424JSValue* stringProtoFuncValueOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     425{
     426    if (!thisValue->isObject(&StringObject::info))
    389427        return throwError(exec, TypeError);
    390428
    391     return static_cast<StringObject*>(thisObj)->internalValue();
    392 }
    393 
    394 JSValue* stringProtoFuncCharAt(ExecState* exec, JSObject* thisObj, const ArgList& args)
    395 {
    396     // This optimizes the common case that thisObj is a StringObject
    397     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     429    return static_cast<StringObject*>(thisValue)->internalValue();
     430}
     431
     432JSValue* stringProtoFuncCharAt(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     433{
     434    // This optimizes the common case that thisObj is a StringObject
     435    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    398436    int len = s.size();
    399437
     
    408446}
    409447
    410 JSValue* stringProtoFuncCharCodeAt(ExecState* exec, JSObject* thisObj, const ArgList& args)
    411 {
    412     // This optimizes the common case that thisObj is a StringObject
    413     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     448JSValue* stringProtoFuncCharCodeAt(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     449{
     450    // This optimizes the common case that thisObj is a StringObject
     451    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    414452    int len = s.size();
    415453
     
    425463}
    426464
    427 JSValue* stringProtoFuncConcat(ExecState* exec, JSObject* thisObj, const ArgList& args)
    428 {
    429     // This optimizes the common case that thisObj is a StringObject
    430     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     465JSValue* stringProtoFuncConcat(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     466{
     467    // This optimizes the common case that thisObj is a StringObject
     468    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    431469
    432470    ArgList::const_iterator end = args.end();
     
    437475}
    438476
    439 JSValue* stringProtoFuncIndexOf(ExecState* exec, JSObject* thisObj, const ArgList& args)
    440 {
    441     // This optimizes the common case that thisObj is a StringObject
    442     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     477JSValue* stringProtoFuncIndexOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     478{
     479    // This optimizes the common case that thisObj is a StringObject
     480    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    443481    int len = s.size();
    444482
     
    454492}
    455493
    456 JSValue* stringProtoFuncLastIndexOf(ExecState* exec, JSObject* thisObj, const ArgList& args)
    457 {
    458     // This optimizes the common case that thisObj is a StringObject
    459     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     494JSValue* stringProtoFuncLastIndexOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     495{
     496    // This optimizes the common case that thisObj is a StringObject
     497    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    460498    int len = s.size();
    461499
     
    472510}
    473511
    474 JSValue* stringProtoFuncMatch(ExecState* exec, JSObject* thisObj, const ArgList& args)
    475 {
    476     // This optimizes the common case that thisObj is a StringObject
    477     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     512JSValue* stringProtoFuncMatch(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     513{
     514    // This optimizes the common case that thisObj is a StringObject
     515    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    478516
    479517    JSValue* a0 = args[0];
     
    521559        result = jsNull();
    522560      } else {
    523         result = exec->lexicalGlobalObject()->arrayConstructor()->construct(exec, list);
     561        result = constructArray(exec, list);
    524562      }
    525563    }
     
    527565}
    528566
    529 JSValue* stringProtoFuncSearch(ExecState* exec, JSObject* thisObj, const ArgList& args)
    530 {
    531     // This optimizes the common case that thisObj is a StringObject
    532     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     567JSValue* stringProtoFuncSearch(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     568{
     569    // This optimizes the common case that thisObj is a StringObject
     570    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    533571
    534572    JSValue* a0 = args[0];
     
    553591}
    554592
    555 JSValue* stringProtoFuncReplace(ExecState* exec, JSObject* thisObj, const ArgList& args)
    556 {
    557     // This optimizes the common case that thisObj is a StringObject
    558     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    559 
    560     JSString* sVal = thisObj->inherits(&StringObject::info) ?
    561       static_cast<StringObject*>(thisObj)->internalValue() :
     593JSValue* stringProtoFuncReplace(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     594{
     595    // This optimizes the common case that thisObj is a StringObject
     596    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     597
     598    JSString* sVal = thisValue->isObject(&StringObject::info) ?
     599      static_cast<StringObject*>(thisValue)->internalValue() :
    562600      static_cast<JSString*>(jsString(exec, s));
    563601
     
    568606}
    569607
    570 JSValue* stringProtoFuncSlice(ExecState* exec, JSObject* thisObj, const ArgList& args)
    571 {
    572     // This optimizes the common case that thisObj is a StringObject
    573     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     608JSValue* stringProtoFuncSlice(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     609{
     610    // This optimizes the common case that thisObj is a StringObject
     611    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    574612    int len = s.size();
    575613
     
    593631}
    594632
    595 JSValue* stringProtoFuncSplit(ExecState* exec, JSObject* thisObj, const ArgList& args)
    596 {
    597     // This optimizes the common case that thisObj is a StringObject
    598     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     633JSValue* stringProtoFuncSplit(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     634{
     635    // This optimizes the common case that thisObj is a StringObject
     636    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    599637
    600638    JSValue* a0 = args[0];
    601639    JSValue* a1 = args[1];
    602640
    603     JSObject *constructor = exec->lexicalGlobalObject()->arrayConstructor();
    604     JSObject* res = static_cast<JSObject*>(constructor->construct(exec, exec->emptyList()));
     641    JSObject* res = constructEmptyArray(exec);
    605642    JSValue* result = res;
    606643    UString u = s;
     
    663700}
    664701
    665 JSValue* stringProtoFuncSubstr(ExecState* exec, JSObject* thisObj, const ArgList& args)
    666 {
    667     // This optimizes the common case that thisObj is a StringObject
    668     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     702JSValue* stringProtoFuncSubstr(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     703{
     704    // This optimizes the common case that thisObj is a StringObject
     705    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    669706    int len = s.size();
    670707
     
    688725}
    689726
    690 JSValue* stringProtoFuncSubstring(ExecState* exec, JSObject* thisObj, const ArgList& args)
    691 {
    692     // This optimizes the common case that thisObj is a StringObject
    693     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     727JSValue* stringProtoFuncSubstring(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     728{
     729    // This optimizes the common case that thisObj is a StringObject
     730    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    694731    int len = s.size();
    695732
     
    721758}
    722759
    723 JSValue* stringProtoFuncToLowerCase(ExecState* exec, JSObject* thisObj, const ArgList&)
    724 {
    725     // This optimizes the common case that thisObj is a StringObject
    726     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     760JSValue* stringProtoFuncToLowerCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     761{
     762    // This optimizes the common case that thisObj is a StringObject
     763    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    727764   
    728     JSString* sVal = thisObj->inherits(&StringObject::info)
    729         ? static_cast<StringObject*>(thisObj)->internalValue()
     765    JSString* sVal = thisValue->isObject(&StringObject::info)
     766        ? static_cast<StringObject*>(thisValue)->internalValue()
    730767        : static_cast<JSString*>(jsString(exec, s));
    731768    int ssize = s.size();
     
    746783}
    747784
    748 JSValue* stringProtoFuncToUpperCase(ExecState* exec, JSObject* thisObj, const ArgList&)
    749 {
    750     // This optimizes the common case that thisObj is a StringObject
    751     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    752 
    753     JSString* sVal = thisObj->inherits(&StringObject::info)
    754         ? static_cast<StringObject*>(thisObj)->internalValue()
     785JSValue* stringProtoFuncToUpperCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     786{
     787    // This optimizes the common case that thisObj is a StringObject
     788    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     789
     790    JSString* sVal = thisValue->isObject(&StringObject::info)
     791        ? static_cast<StringObject*>(thisValue)->internalValue()
    755792        : static_cast<JSString*>(jsString(exec, s));
    756793    int ssize = s.size();
     
    771808}
    772809
    773 JSValue* stringProtoFuncToLocaleLowerCase(ExecState* exec, JSObject* thisObj, const ArgList&)
    774 {
    775     // This optimizes the common case that thisObj is a StringObject
    776     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     810JSValue* stringProtoFuncToLocaleLowerCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     811{
     812    // This optimizes the common case that thisObj is a StringObject
     813    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    777814   
    778815    // FIXME: See http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt for locale-sensitive mappings that aren't implemented.
    779     JSString* sVal = thisObj->inherits(&StringObject::info)
    780         ? static_cast<StringObject*>(thisObj)->internalValue()
     816    JSString* sVal = thisValue->isObject(&StringObject::info)
     817        ? static_cast<StringObject*>(thisValue)->internalValue()
    781818        : static_cast<JSString*>(jsString(exec, s));
    782819    int ssize = s.size();
     
    797834}
    798835
    799 JSValue* stringProtoFuncToLocaleUpperCase(ExecState* exec, JSObject* thisObj, const ArgList&)
    800 {
    801     // This optimizes the common case that thisObj is a StringObject
    802     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    803 
    804     JSString* sVal = thisObj->inherits(&StringObject::info)
    805         ? static_cast<StringObject*>(thisObj)->internalValue()
     836JSValue* stringProtoFuncToLocaleUpperCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     837{
     838    // This optimizes the common case that thisObj is a StringObject
     839    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     840
     841    JSString* sVal = thisValue->isObject(&StringObject::info)
     842        ? static_cast<StringObject*>(thisValue)->internalValue()
    806843        : static_cast<JSString*>(jsString(exec, s));
    807844    int ssize = s.size();
     
    822859}
    823860
    824 JSValue* stringProtoFuncLocaleCompare(ExecState* exec, JSObject* thisObj, const ArgList& args)
     861JSValue* stringProtoFuncLocaleCompare(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
    825862{
    826863    if (args.size() < 1)
     
    828865
    829866    // This optimizes the common case that thisObj is a StringObject
    830     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     867    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    831868    JSValue* a0 = args[0];
    832869    return jsNumber(exec, localeCompare(s, a0->toString(exec)));
    833870}
    834871
    835 JSValue* stringProtoFuncBig(ExecState* exec, JSObject* thisObj, const ArgList&)
    836 {
    837     // This optimizes the common case that thisObj is a StringObject
    838     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     872JSValue* stringProtoFuncBig(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     873{
     874    // This optimizes the common case that thisObj is a StringObject
     875    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    839876    return jsString(exec, "<big>" + s + "</big>");
    840877}
    841878
    842 JSValue* stringProtoFuncSmall(ExecState* exec, JSObject* thisObj, const ArgList&)
    843 {
    844     // This optimizes the common case that thisObj is a StringObject
    845     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     879JSValue* stringProtoFuncSmall(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     880{
     881    // This optimizes the common case that thisObj is a StringObject
     882    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    846883    return jsString(exec, "<small>" + s + "</small>");
    847884}
    848885
    849 JSValue* stringProtoFuncBlink(ExecState* exec, JSObject* thisObj, const ArgList&)
    850 {
    851     // This optimizes the common case that thisObj is a StringObject
    852     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     886JSValue* stringProtoFuncBlink(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     887{
     888    // This optimizes the common case that thisObj is a StringObject
     889    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    853890    return jsString(exec, "<blink>" + s + "</blink>");
    854891}
    855892
    856 JSValue* stringProtoFuncBold(ExecState* exec, JSObject* thisObj, const ArgList&)
    857 {
    858     // This optimizes the common case that thisObj is a StringObject
    859     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     893JSValue* stringProtoFuncBold(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     894{
     895    // This optimizes the common case that thisObj is a StringObject
     896    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    860897    return jsString(exec, "<b>" + s + "</b>");
    861898}
    862899
    863 JSValue* stringProtoFuncFixed(ExecState* exec, JSObject* thisObj, const ArgList&)
    864 {
    865     // This optimizes the common case that thisObj is a StringObject
    866     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     900JSValue* stringProtoFuncFixed(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     901{
     902    // This optimizes the common case that thisObj is a StringObject
     903    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    867904    return jsString(exec, "<tt>" + s + "</tt>");
    868905}
    869906
    870 JSValue* stringProtoFuncItalics(ExecState* exec, JSObject* thisObj, const ArgList&)
    871 {
    872     // This optimizes the common case that thisObj is a StringObject
    873     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     907JSValue* stringProtoFuncItalics(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     908{
     909    // This optimizes the common case that thisObj is a StringObject
     910    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    874911    return jsString(exec, "<i>" + s + "</i>");
    875912}
    876913
    877 JSValue* stringProtoFuncStrike(ExecState* exec, JSObject* thisObj, const ArgList&)
    878 {
    879     // This optimizes the common case that thisObj is a StringObject
    880     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     914JSValue* stringProtoFuncStrike(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     915{
     916    // This optimizes the common case that thisObj is a StringObject
     917    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    881918    return jsString(exec, "<strike>" + s + "</strike>");
    882919}
    883920
    884 JSValue* stringProtoFuncSub(ExecState* exec, JSObject* thisObj, const ArgList&)
    885 {
    886     // This optimizes the common case that thisObj is a StringObject
    887     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     921JSValue* stringProtoFuncSub(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     922{
     923    // This optimizes the common case that thisObj is a StringObject
     924    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    888925    return jsString(exec, "<sub>" + s + "</sub>");
    889926}
    890927
    891 JSValue* stringProtoFuncSup(ExecState* exec, JSObject* thisObj, const ArgList&)
    892 {
    893     // This optimizes the common case that thisObj is a StringObject
    894     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     928JSValue* stringProtoFuncSup(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
     929{
     930    // This optimizes the common case that thisObj is a StringObject
     931    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    895932    return jsString(exec, "<sup>" + s + "</sup>");
    896933}
    897934
    898 JSValue* stringProtoFuncFontcolor(ExecState* exec, JSObject* thisObj, const ArgList& args)
    899 {
    900     // This optimizes the common case that thisObj is a StringObject
    901     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     935JSValue* stringProtoFuncFontcolor(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     936{
     937    // This optimizes the common case that thisObj is a StringObject
     938    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    902939    JSValue* a0 = args[0];
    903940    return jsString(exec, "<font color=\"" + a0->toString(exec) + "\">" + s + "</font>");
    904941}
    905942
    906 JSValue* stringProtoFuncFontsize(ExecState* exec, JSObject* thisObj, const ArgList& args)
    907 {
    908     // This optimizes the common case that thisObj is a StringObject
    909     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     943JSValue* stringProtoFuncFontsize(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     944{
     945    // This optimizes the common case that thisObj is a StringObject
     946    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    910947    JSValue* a0 = args[0];
    911948    return jsString(exec, "<font size=\"" + a0->toString(exec) + "\">" + s + "</font>");
    912949}
    913950
    914 JSValue* stringProtoFuncAnchor(ExecState* exec, JSObject* thisObj, const ArgList& args)
    915 {
    916     // This optimizes the common case that thisObj is a StringObject
    917     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     951JSValue* stringProtoFuncAnchor(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     952{
     953    // This optimizes the common case that thisObj is a StringObject
     954    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    918955    JSValue* a0 = args[0];
    919956    return jsString(exec, "<a name=\"" + a0->toString(exec) + "\">" + s + "</a>");
    920957}
    921958
    922 JSValue* stringProtoFuncLink(ExecState* exec, JSObject* thisObj, const ArgList& args)
    923 {
    924     // This optimizes the common case that thisObj is a StringObject
    925     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     959JSValue* stringProtoFuncLink(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
     960{
     961    // This optimizes the common case that thisObj is a StringObject
     962    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
    926963    JSValue* a0 = args[0];
    927964    return jsString(exec, "<a href=\"" + a0->toString(exec) + "\">" + s + "</a>");
     
    929966
    930967// ------------------------------ StringConstructor ------------------------------
     968
     969static JSValue* stringFromCharCode(ExecState* exec, JSObject*, JSValue*, const ArgList& args)
     970{
     971    UString s;
     972    if (args.size()) {
     973        UChar* buf = static_cast<UChar*>(fastMalloc(args.size() * sizeof(UChar)));
     974        UChar* p = buf;
     975        ArgList::const_iterator end = args.end();
     976        for (ArgList::const_iterator it = args.begin(); it != end; ++it)
     977          *p++ = static_cast<UChar>((*it)->toUInt32(exec));
     978        s = UString(buf, args.size(), false);
     979    } else
     980        s = "";
     981
     982    return jsString(exec, s);
     983}
    931984
    932985StringConstructor::StringConstructor(ExecState* exec, FunctionPrototype* funcProto, StringPrototype* stringProto)
     
    934987{
    935988  // ECMA 15.5.3.1 String.prototype
    936   putDirect(exec->propertyNames().prototype, stringProto, DontEnum|DontDelete|ReadOnly);
    937 
    938   putDirectFunction(new (exec) StringConstructorFunction(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);
     989  putDirect(exec->propertyNames().prototype, stringProto, ReadOnly | DontEnum | DontDelete);
     990
     991  // ECMA 15.5.3.2 fromCharCode()
     992  putDirectFunction(new (exec) PrototypeFunction(exec, funcProto, 1, exec->propertyNames().fromCharCode, stringFromCharCode), DontEnum);
    939993
    940994  // no. of arguments for constructor
    941   putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
    942 }
    943 
    944 
    945 ConstructType StringConstructor::getConstructData(ConstructData&)
    946 {
     995  putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly | DontEnum | DontDelete);
     996}
     997
     998// ECMA 15.5.2
     999static JSObject* constructWithStringConstructor(ExecState* exec, JSObject*, const ArgList& args)
     1000{
     1001    JSObject* prototype = exec->lexicalGlobalObject()->stringPrototype();
     1002    if (args.isEmpty())
     1003        return new (exec) StringObject(exec, prototype);
     1004    return new (exec) StringObject(exec, prototype, args[0]->toString(exec));
     1005}
     1006
     1007ConstructType StringConstructor::getConstructData(ConstructData& constructData)
     1008{
     1009    constructData.native.function = constructWithStringConstructor;
    9471010    return ConstructTypeNative;
    9481011}
    9491012
    950 // ECMA 15.5.2
    951 JSObject* StringConstructor::construct(ExecState* exec, const ArgList& args)
    952 {
    953   JSObject* proto = exec->lexicalGlobalObject()->stringPrototype();
    954   if (!args.size())
    955     return new (exec) StringObject(exec, proto);
    956   return new (exec) StringObject(exec, proto, args[0]->toString(exec));
    957 }
    958 
    9591013// ECMA 15.5.1
    960 JSValue *StringConstructor::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const ArgList &args)
    961 {
    962   if (args.isEmpty())
    963     return jsString(exec, "");
    964   else {
    965     JSValue *v = args[0];
    966     return jsString(exec, v->toString(exec));
    967   }
    968 }
    969 
    970 // ------------------------------ StringConstructorFunction --------------------------
    971 
    972 // ECMA 15.5.3.2 fromCharCode()
    973 StringConstructorFunction::StringConstructorFunction(ExecState* exec, FunctionPrototype* funcProto, const Identifier& name)
    974   : InternalFunction(funcProto, name)
    975 {
    976   putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum);
    977 }
    978 
    979 JSValue *StringConstructorFunction::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const ArgList &args)
    980 {
    981   UString s;
    982   if (args.size()) {
    983     UChar *buf = static_cast<UChar *>(fastMalloc(args.size() * sizeof(UChar)));
    984     UChar *p = buf;
    985     ArgList::const_iterator end = args.end();
    986     for (ArgList::const_iterator it = args.begin(); it != end; ++it) {
    987       unsigned short u = static_cast<unsigned short>((*it)->toUInt32(exec));
    988       *p++ = UChar(u);
    989     }
    990     s = UString(buf, args.size(), false);
    991   } else
    992     s = "";
    993 
    994   return jsString(exec, s);
     1014static JSValue* callStringConstructor(ExecState* exec, JSObject*, JSValue*, const ArgList& args)
     1015{
     1016    if (args.isEmpty())
     1017        return jsString(exec, "");
     1018    return jsString(exec, args[0]->toString(exec));
     1019}
     1020
     1021CallType StringConstructor::getCallData(CallData& callData)
     1022{
     1023    callData.native.function = callStringConstructor;
     1024    return CallTypeNative;
    9951025}
    9961026
Note: See TracChangeset for help on using the changeset viewer.