Changeset 34754 in webkit for trunk/JavaScriptCore/API


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:
Location:
trunk/JavaScriptCore/API
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/API/JSCallbackConstructor.cpp

    r34587 r34754  
    11// -*- mode: c++; c-basic-offset: 4 -*-
    22/*
    3  * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
     3 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
    44 *
    55 * Redistribution and use in source and binary forms, with or without
     
    5757}
    5858
    59 ConstructType JSCallbackConstructor::getConstructData(ConstructData&)
    60 {
    61     return ConstructTypeNative;
    62 }
    63 
    64 JSObject* JSCallbackConstructor::construct(ExecState* exec, const ArgList &args)
     59static JSObject* constructJSCallback(ExecState* exec, JSObject* constructor, const ArgList& args)
    6560{
    6661    JSContextRef ctx = toRef(exec);
    67     JSObjectRef thisRef = toRef(this);
     62    JSObjectRef constructorRef = toRef(constructor);
    6863
    69     if (m_callback) {
     64    JSObjectCallAsConstructorCallback callback = static_cast<JSCallbackConstructor*>(constructor)->callback();
     65    if (callback) {
    7066        int argumentCount = static_cast<int>(args.size());
    7167        Vector<JSValueRef, 16> arguments(argumentCount);
     
    7470           
    7571        JSLock::DropAllLocks dropAllLocks;
    76         return toJS(m_callback(ctx, thisRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
     72        return toJS(callback(ctx, constructorRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
    7773    }
    7874   
    79     return toJS(JSObjectMake(ctx, m_class, 0));
     75    return toJS(JSObjectMake(ctx, static_cast<JSCallbackConstructor*>(constructor)->classRef(), 0));
     76}
     77
     78ConstructType JSCallbackConstructor::getConstructData(ConstructData& constructData)
     79{
     80    constructData.native.function = constructJSCallback;
     81    return ConstructTypeNative;
    8082}
    8183
  • trunk/JavaScriptCore/API/JSCallbackConstructor.h

    r34587 r34754  
    11// -*- mode: c++; c-basic-offset: 4 -*-
    22/*
    3  * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
     3 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
    44 *
    55 * Redistribution and use in source and binary forms, with or without
     
    3535class JSCallbackConstructor : public JSObject {
    3636public:
    37     JSCallbackConstructor(ExecState* exec, JSClassRef jsClass, JSObjectCallAsConstructorCallback callback);
     37    JSCallbackConstructor(ExecState*, JSClassRef, JSObjectCallAsConstructorCallback);
    3838    virtual ~JSCallbackConstructor();
    39    
    40     virtual bool implementsHasInstance() const;
    41    
    42     virtual ConstructType getConstructData(ConstructData&);
    43     virtual JSObject* construct(ExecState*, const ArgList& args);
    44    
    45     virtual const ClassInfo *classInfo() const { return &info; }
     39    JSClassRef classRef() const { return m_class; }
     40    JSObjectCallAsConstructorCallback callback() const { return m_callback; }
    4641    static const ClassInfo info;
    4742   
    4843private:
    49     JSCallbackConstructor(); // prevent default construction
    50     JSCallbackConstructor(const JSCallbackConstructor&);
     44    virtual bool implementsHasInstance() const;   
     45    virtual ConstructType getConstructData(ConstructData&);
     46    virtual const ClassInfo* classInfo() const { return &info; }
    5147
    5248    JSClassRef m_class;
  • trunk/JavaScriptCore/API/JSCallbackFunction.cpp

    r34587 r34754  
    11// -*- mode: c++; c-basic-offset: 4 -*-
    22/*
    3  * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
     3 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
    44 *
    55 * Redistribution and use in source and binary forms, with or without
     
    4747// InternalFunction mish-mashes constructor and function behavior -- we should
    4848// refactor the code so this override isn't necessary
    49 bool JSCallbackFunction::implementsHasInstance() const {
     49bool JSCallbackFunction::implementsHasInstance() const
     50{
    5051    return false;
    5152}
    5253
    53 JSValue* JSCallbackFunction::callAsFunction(ExecState* exec, JSObject* thisObj, const ArgList &args)
     54JSValue* JSCallbackFunction::call(ExecState* exec, JSObject* functionObject, JSValue* thisValue, const ArgList& args)
    5455{
    5556    JSContextRef execRef = toRef(exec);
    56     JSObjectRef thisRef = toRef(this);
    57     JSObjectRef thisObjRef = toRef(thisObj);
     57    JSObjectRef functionRef = toRef(functionObject);
     58    JSObjectRef thisObjRef = toRef(thisValue->toThisObject(exec));
    5859
    5960    int argumentCount = static_cast<int>(args.size());
     
    6364
    6465    JSLock::DropAllLocks dropAllLocks;
    65     return toJS(m_callback(execRef, thisRef, thisObjRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
     66    return toJS(static_cast<JSCallbackFunction*>(functionObject)->m_callback(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
     67}
     68
     69CallType JSCallbackFunction::getCallData(CallData& callData)
     70{
     71    callData.native.function = call;
     72    return CallTypeNative;
    6673}
    6774
  • trunk/JavaScriptCore/API/JSCallbackFunction.h

    r34587 r34754  
    11// -*- mode: c++; c-basic-offset: 4 -*-
    22/*
    3  * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
     3 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
    44 *
    55 * Redistribution and use in source and binary forms, with or without
     
    2828#define JSCallbackFunction_h
    2929
     30#include "JSFunction.h"
    3031#include "JSObjectRef.h"
    31 #include "JSFunction.h"
    32 #include "JSObject.h"
    3332
    3433namespace KJS {
    3534
    36 class JSCallbackFunction : public InternalFunction
    37 {
     35class JSCallbackFunction : public InternalFunction {
    3836public:
    39     JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCallback callback, const Identifier& name);
     37    JSCallbackFunction(ExecState*, JSObjectCallAsFunctionCallback, const Identifier& name);
    4038
    41     virtual bool implementsHasInstance() const;
    42     virtual JSValue* callAsFunction(ExecState*, JSObject* thisObj, const ArgList &args);
    43 
    44     virtual const ClassInfo *classInfo() const { return &info; }
    4539    static const ClassInfo info;
    4640   
    4741private:
    48     JSCallbackFunction(); // prevent default construction
    49     JSCallbackFunction(const JSCallbackFunction&);
    50    
     42    virtual bool implementsHasInstance() const;
     43    virtual CallType getCallData(CallData&);
     44    virtual const ClassInfo* classInfo() const { return &info; }
     45
     46    static JSValue* call(ExecState*, JSObject*, JSValue*, const ArgList&);
     47
    5148    JSObjectCallAsFunctionCallback m_callback;
    5249};
  • trunk/JavaScriptCore/API/JSCallbackObject.h

    r34587 r34754  
    11// -*- mode: c++; c-basic-offset: 4 -*-
    22/*
    3  * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
     3 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
    44 * Copyright (C) 2007 Eric Seidel <[email protected]>
    55 *
     
    3636
    3737template <class Base>
    38 class JSCallbackObject : public Base
    39 {
     38class JSCallbackObject : public Base {
    4039public:
    4140    JSCallbackObject(ExecState*, JSClassRef, JSValue* prototype, void* data);
     
    4342    virtual ~JSCallbackObject();
    4443
     44    void setPrivate(void* data);
     45    void* getPrivate();
     46
     47    static const ClassInfo info;
     48
     49    JSClassRef classRef() const { return m_class; }
     50    bool inherits(JSClassRef) const;
     51
     52private:
    4553    virtual UString className() const;
    4654
     
    5462    virtual bool deleteProperty(ExecState*, unsigned);
    5563
    56     virtual ConstructType getConstructData(ConstructData&);
    57     virtual JSObject* construct(ExecState*, const ArgList& args);
    58 
    5964    virtual bool implementsHasInstance() const;
    6065    virtual bool hasInstance(ExecState *exec, JSValue *value);
    61 
    62     virtual CallType getCallData(CallData&);
    63     virtual JSValue* callAsFunction(ExecState*, JSObject* thisObj, const ArgList &args);
    6466
    6567    virtual void getPropertyNames(ExecState*, PropertyNameArray&);
     
    6870    virtual UString toString(ExecState*) const;
    6971
    70     void setPrivate(void* data);
    71     void* getPrivate();
    72    
    73     virtual const ClassInfo *classInfo() const { return &info; }
    74     static const ClassInfo info;
     72    virtual ConstructType getConstructData(ConstructData&);
     73    virtual CallType getCallData(CallData&);
     74    virtual const ClassInfo* classInfo() const { return &info; }
    7575
    76     bool inherits(JSClassRef) const;
    77    
    78 private:
    7976    void init(ExecState*);
    80    
     77 
     78    static JSValue* call(ExecState*, JSObject* functionObject, JSValue* thisValue, const ArgList&);
     79    static JSObject* construct(ExecState*, JSObject* constructor, const ArgList&);
     80   
    8181    static JSValue* cachedValueGetter(ExecState*, const Identifier&, const PropertySlot&);
    8282    static JSValue* staticValueGetter(ExecState*, const Identifier&, const PropertySlot&);
  • trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h

    r34659 r34754  
    2626 */
    2727
    28 #include <wtf/Platform.h>
    2928#include "APICast.h"
    3029#include "JSCallbackFunction.h"
    3130#include "JSClassRef.h"
     31#include "JSGlobalObject.h"
    3232#include "JSObjectRef.h"
    33 #include "JSGlobalObject.h"
     33#include "JSString.h"
    3434#include "JSStringRef.h"
    3535#include "PropertyNameArray.h"
    36 #include "JSString.h"
    3736#include <wtf/Vector.h>
    3837
     
    4847}
    4948
    50 // Global object constructor. FIXME: Move this into a JSGlobalCallbackObject subclass.
     49// Global object constructor.
     50// FIXME: Move this into a separate JSGlobalCallbackObject class derived from this one.
    5151template <class Base>
    5252JSCallbackObject<Base>::JSCallbackObject(JSClassRef jsClass)
     
    238238
    239239template <class Base>
    240 ConstructType JSCallbackObject<Base>::getConstructData(ConstructData&)
    241 {
    242     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)
    243         if (jsClass->callAsConstructor)
     240ConstructType JSCallbackObject<Base>::getConstructData(ConstructData& constructData)
     241{
     242    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
     243        if (jsClass->callAsConstructor) {
     244            constructData.native.function = construct;
    244245            return ConstructTypeNative;
    245    
     246        }
     247    }
    246248    return ConstructTypeNone;
    247249}
    248250
    249251template <class Base>
    250 JSObject* JSCallbackObject<Base>::construct(ExecState* exec, const ArgList& args)
     252JSObject* JSCallbackObject<Base>::construct(ExecState* exec, JSObject* constructor, const ArgList& args)
    251253{
    252254    JSContextRef execRef = toRef(exec);
    253     JSObjectRef thisRef = toRef(this);
    254    
    255     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
     255    JSObjectRef constructorRef = toRef(constructor);
     256   
     257    for (JSClassRef jsClass = static_cast<JSCallbackObject<Base>*>(constructor)->classRef(); jsClass; jsClass = jsClass->parentClass) {
    256258        if (JSObjectCallAsConstructorCallback callAsConstructor = jsClass->callAsConstructor) {
    257259            int argumentCount = static_cast<int>(args.size());
     
    260262                arguments[i] = toRef(args[i]);
    261263            JSLock::DropAllLocks dropAllLocks;
    262             return toJS(callAsConstructor(execRef, thisRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
    263         }
    264     }
    265    
    266     ASSERT(0); // getConstructData should prevent us from reaching here
     264            return toJS(callAsConstructor(execRef, constructorRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
     265        }
     266    }
     267   
     268    ASSERT_NOT_REACHED(); // getConstructData should prevent us from reaching here
    267269    return 0;
    268270}
     
    295297
    296298template <class Base>
    297 CallType JSCallbackObject<Base>::getCallData(CallData&)
    298 {
    299     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)
    300         if (jsClass->callAsFunction)
     299CallType JSCallbackObject<Base>::getCallData(CallData& callData)
     300{
     301    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
     302        if (jsClass->callAsFunction) {
     303            callData.native.function = call;
    301304            return CallTypeNative;
    302    
     305        }
     306    }
    303307    return CallTypeNone;
    304308}
    305309
    306310template <class Base>
    307 JSValue* JSCallbackObject<Base>::callAsFunction(ExecState* exec, JSObject* thisObj, const ArgList &args)
     311JSValue* JSCallbackObject<Base>::call(ExecState* exec, JSObject* functionObject, JSValue* thisValue, const ArgList& args)
    308312{
    309313    JSContextRef execRef = toRef(exec);
    310     JSObjectRef thisRef = toRef(this);
    311     JSObjectRef thisObjRef = toRef(thisObj);
    312    
    313     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
     314    JSObjectRef functionRef = toRef(functionObject);
     315    JSObjectRef thisObjRef = toRef(thisValue->toThisObject(exec));
     316   
     317    for (JSClassRef jsClass = static_cast<JSCallbackObject<Base>*>(functionObject)->m_class; jsClass; jsClass = jsClass->parentClass) {
    314318        if (JSObjectCallAsFunctionCallback callAsFunction = jsClass->callAsFunction) {
    315319            int argumentCount = static_cast<int>(args.size());
     
    318322                arguments[i] = toRef(args[i]);
    319323            JSLock::DropAllLocks dropAllLocks;
    320             return toJS(callAsFunction(execRef, thisRef, thisObjRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
     324            return toJS(callAsFunction(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
    321325        }
    322326    }
  • trunk/JavaScriptCore/API/JSObjectRef.cpp

    r34659 r34754  
    122122    args.append(jsString(exec, UString(bodyRep)));
    123123
    124     JSObject* result = exec->dynamicGlobalObject()->functionConstructor()->construct(exec, args, nameID, UString(sourceURLRep), startingLineNumber);
     124    JSObject* result = constructFunction(exec, args, nameID, UString(sourceURLRep), startingLineNumber);
    125125    if (exec->hadException()) {
    126126        if (exception)
     
    268268bool JSObjectIsFunction(JSContextRef, JSObjectRef object)
    269269{
    270     JSObject* jsObject = toJS(object);
    271     return jsObject->implementsCall();
     270    CallData callData;
     271    return toJS(object)->getCallData(callData) != CallTypeNone;
    272272}
    273273
     
    286286        argList.append(toJS(arguments[i]));
    287287
    288     JSValueRef result = toRef(jsObject->callAsFunction(exec, jsThisObject, argList)); // returns NULL if object->implementsCall() is false
     288    CallData callData;
     289    CallType callType = jsObject->getCallData(callData);
     290    if (callType == CallTypeNone)
     291        return 0;
     292
     293    JSValueRef result = toRef(call(exec, jsObject, callType, callData, jsThisObject, argList));
    289294    if (exec->hadException()) {
    290295        if (exception)
     
    308313    ExecState* exec = toJS(ctx);
    309314    JSObject* jsObject = toJS(object);
    310    
     315
     316    ConstructData constructData;
     317    ConstructType constructType = jsObject->getConstructData(constructData);
     318    if (constructType == ConstructTypeNone)
     319        return 0;
     320
    311321    ArgList argList;
    312322    for (size_t i = 0; i < argumentCount; i++)
    313323        argList.append(toJS(arguments[i]));
    314    
    315     JSObjectRef result = toRef(jsObject->construct(exec, argList)); // returns NULL if object->implementsCall() is false
     324    JSObjectRef result = toRef(construct(exec, jsObject, constructType, constructData, argList));
    316325    if (exec->hadException()) {
    317326        if (exception)
Note: See TracChangeset for help on using the changeset viewer.