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