Skip to content
  • weinig@apple.com's avatar
    JavaScriptCore: · 5902380f
    weinig@apple.com authored
            Reviewed by Geoffrey Garen.
    
            Fix <rdar://problem/5595552> r27608 introduced a 20% increase in JS binary size, 4% increase in WebCore binary size
    
            - This changes the way JS functions that use Lookup tables are handled.  Instead using
              one class per function, which allowed specialization of the virtual callAsFunction
              method, we now use on class, PrototypeFunction, which takes a pointer to a static
              function to use as the implementation.  This significantly decreases the binary size
              of JavaScriptCore (about 145k on an Intel only build) while still keeping some of the
              speedup r27608 garnered (SunSpider says this is 1.005x as slow, which should leave some
              wiggle room from the original 1% speedup) and keeps the functions implementations in separate
              functions to help with optimizations.
    
            * JavaScriptCore.exp:
            * JavaScriptCore.xcodeproj/project.pbxproj:
            * kjs/array_object.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/array_object.h:
            * kjs/date_object.cpp:
            (KJS::DatePrototype::getOwnPropertySlot):
            (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::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/function.cpp:
            (KJS::PrototypeFunction::PrototypeFunction):
            (KJS::PrototypeFunction::callAsFunction):
            * kjs/function.h:
            * kjs/lookup.h:
            (KJS::HashEntry::):
            (KJS::staticFunctionGetter):
            * kjs/math_object.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/math_object.h:
            * kjs/string_object.cpp:
            (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/string_object.h:
    
    WebCore:
    
            Reviewed by Geoffrey Garen.
    
            Fix <rdar://problem/5595552> r27608 introduced a 20% increase in JS binary size, 4% increase in WebCore binary size
    
            - Update JS Function implementations to use a static function based method. This decreases
              the binary size of an Intel only build by 1013.5K.
    
            * WebCore.xcodeproj/project.pbxproj:
            * bindings/js/JSDOMWindowCustom.cpp:
            (WebCore::JSDOMWindow::customGetOwnPropertySlot):
            * bindings/js/JSEventTargetBase.cpp:
            (WebCore::jsEventTargetAddEventListener):
            (WebCore::jsEventTargetRemoveEventListener):
            (WebCore::jsEventTargetDispatchEvent):
            (WebCore::retrieveEventTargetAndCorrespondingNode):
            * bindings/js/JSEventTargetBase.h:
            * bindings/js/JSHTMLInputElementBase.cpp:
            (WebCore::jsHTMLInputElementBaseFunctionSetSelectionRange):
            (WebCore::JSHTMLInputElementBase::getOwnPropertySlot):
            * bindings/js/JSHTMLInputElementBase.h:
            * bindings/js/JSLocation.cpp:
            (WebCore::JSLocation::getOwnPropertySlot):
            (WebCore::jsLocationProtoFuncReplace):
            (WebCore::jsLocationProtoFuncReload):
            (WebCore::jsLocationProtoFuncAssign):
            (WebCore::jsLocationProtoFuncToString):
            * bindings/js/JSLocation.h:
            * bindings/js/JSXMLHttpRequest.cpp:
            (KJS::jsXMLHttpRequestPrototypeFunctionAbort):
            (KJS::jsXMLHttpRequestPrototypeFunctionGetAllResponseHeaders):
            (KJS::jsXMLHttpRequestPrototypeFunctionGetResponseHeader):
            (KJS::jsXMLHttpRequestPrototypeFunctionOpen):
            (KJS::jsXMLHttpRequestPrototypeFunctionSend):
            (KJS::jsXMLHttpRequestPrototypeFunctionSetRequestHeader):
            (KJS::jsXMLHttpRequestPrototypeFunctionOverrideMIMEType):
            (KJS::jsXMLHttpRequestPrototypeFunctionAddEventListener):
            (KJS::jsXMLHttpRequestPrototypeFunctionRemoveEventListener):
            (KJS::jsXMLHttpRequestPrototypeFunctionDispatchEvent):
            * bindings/js/JSXMLHttpRequest.h:
            * bindings/js/JSXSLTProcessor.cpp:
            (KJS::jsXSLTProcessorPrototypeFunctionImportStylesheet):
            (KJS::jsXSLTProcessorPrototypeFunctionTransformToFragment):
            (KJS::jsXSLTProcessorPrototypeFunctionTransformToDocument):
            (KJS::jsXSLTProcessorPrototypeFunctionSetParameter):
            (KJS::jsXSLTProcessorPrototypeFunctionGetParameter):
            (KJS::jsXSLTProcessorPrototypeFunctionRemoveParameter):
            (KJS::jsXSLTProcessorPrototypeFunctionClearParameters):
            (KJS::jsXSLTProcessorPrototypeFunctionReset):
            * bindings/js/JSXSLTProcessor.h:
            * bindings/js/kjs_events.cpp:
            (WebCore::jsClipboardPrototypeFunctionClearData):
            (WebCore::jsClipboardPrototypeFunctionGetData):
            (WebCore::jsClipboardPrototypeFunctionSetData):
            (WebCore::jsClipboardPrototypeFunctionSetDragImage):
            * bindings/js/kjs_events.h:
            * bindings/js/kjs_navigator.cpp:
            (KJS::pluginsFunctionRefresh):
            (KJS::navigatorProtoFuncJavaEnabled):
            * bindings/js/kjs_navigator.h:
            * bindings/js/kjs_window.cpp:
            (KJS::Window::getOwnPropertySlot):
            (KJS::windowProtoFuncAToB):
            (KJS::windowProtoFuncBToA):
            (KJS::windowProtoFuncOpen):
            (KJS::windowProtoFuncSetTimeout):
            (KJS::windowProtoFuncClearTimeout):
            (KJS::windowProtoFuncSetInterval):
            (KJS::windowProtoFuncAddEventListener):
            (KJS::windowProtoFuncRemoveEventListener):
            (KJS::windowProtoFuncShowModalDialog):
            (KJS::windowProtoFuncNotImplemented):
            * bindings/js/kjs_window.h:
            * bindings/scripts/CodeGenerator.pm:
            * bindings/scripts/CodeGeneratorJS.pm:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@29508 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    5902380f