Ignore:
Timestamp:
Jan 15, 2008, 10:43:15 PM (17 years ago)
Author:
[email protected]
Message:

JavaScriptCore:

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

Legend:

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

    r28110 r29508  
    8282   * @internal
    8383   *
    84    * Classes to implement all methods that are properties of the
     84   * Functions to implement all methods that are properties of the
    8585   * String.prototype object
    8686   */
    87 #define FOR_EACH_CLASS(macro) \
    88     macro(StringProtoFuncToString) \
    89     macro(StringProtoFuncValueOf) \
    90     macro(StringProtoFuncCharAt) \
    91     macro(StringProtoFuncCharCodeAt) \
    92     macro(StringProtoFuncConcat) \
    93     macro(StringProtoFuncIndexOf) \
    94     macro(StringProtoFuncLastIndexOf) \
    95     macro(StringProtoFuncMatch) \
    96     macro(StringProtoFuncReplace) \
    97     macro(StringProtoFuncSearch) \
    98     macro(StringProtoFuncSlice) \
    99     macro(StringProtoFuncSplit) \
    100     macro(StringProtoFuncSubstr) \
    101     macro(StringProtoFuncSubstring) \
    102     macro(StringProtoFuncToLowerCase) \
    103     macro(StringProtoFuncToUpperCase) \
    104     macro(StringProtoFuncToLocaleLowerCase) \
    105     macro(StringProtoFuncToLocaleUpperCase) \
    106     macro(StringProtoFuncLocaleCompare) \
    10787
    108 #define FOR_EACH_CLASS_NOT_PURE_ECMA(macro) \
    109     macro(StringProtoFuncBig) \
    110     macro(StringProtoFuncSmall) \
    111     macro(StringProtoFuncBlink) \
    112     macro(StringProtoFuncBold) \
    113     macro(StringProtoFuncFixed) \
    114     macro(StringProtoFuncItalics) \
    115     macro(StringProtoFuncStrike) \
    116     macro(StringProtoFuncSub) \
    117     macro(StringProtoFuncSup) \
    118     macro(StringProtoFuncFontcolor) \
    119     macro(StringProtoFuncFontsize) \
    120     macro(StringProtoFuncAnchor) \
    121     macro(StringProtoFuncLink) \
     88  JSValue* stringProtoFuncToString(ExecState*, JSObject*, const List&);
     89  JSValue* stringProtoFuncValueOf(ExecState*, JSObject*, const List&);
     90  JSValue* stringProtoFuncCharAt(ExecState*, JSObject*, const List&);
     91  JSValue* stringProtoFuncCharCodeAt(ExecState*, JSObject*, const List&);
     92  JSValue* stringProtoFuncConcat(ExecState*, JSObject*, const List&);
     93  JSValue* stringProtoFuncIndexOf(ExecState*, JSObject*, const List&);
     94  JSValue* stringProtoFuncLastIndexOf(ExecState*, JSObject*, const List&);
     95  JSValue* stringProtoFuncMatch(ExecState*, JSObject*, const List&);
     96  JSValue* stringProtoFuncReplace(ExecState*, JSObject*, const List&);
     97  JSValue* stringProtoFuncSearch(ExecState*, JSObject*, const List&);
     98  JSValue* stringProtoFuncSlice(ExecState*, JSObject*, const List&);
     99  JSValue* stringProtoFuncSplit(ExecState*, JSObject*, const List&);
     100  JSValue* stringProtoFuncSubstr(ExecState*, JSObject*, const List&);
     101  JSValue* stringProtoFuncSubstring(ExecState*, JSObject*, const List&);
     102  JSValue* stringProtoFuncToLowerCase(ExecState*, JSObject*, const List&);
     103  JSValue* stringProtoFuncToUpperCase(ExecState*, JSObject*, const List&);
     104  JSValue* stringProtoFuncToLocaleLowerCase(ExecState*, JSObject*, const List&);
     105  JSValue* stringProtoFuncToLocaleUpperCase(ExecState*, JSObject*, const List&);
     106  JSValue* stringProtoFuncLocaleCompare(ExecState*, JSObject*, const List&);
    122107
    123 FOR_EACH_CLASS(KJS_IMPLEMENT_PROTOTYPE_FUNCTION_WITH_CREATE)
    124108#ifndef KJS_PURE_ECMA
    125 FOR_EACH_CLASS_NOT_PURE_ECMA(KJS_IMPLEMENT_PROTOTYPE_FUNCTION_WITH_CREATE)
    126 #endif
    127 
    128 #undef FOR_EACH_CLASS
    129 #undef FOR_EACH_CLASS_NOT_PURE_ECMA
    130 
     109  JSValue* stringProtoFuncBig(ExecState*, JSObject*, const List&);
     110  JSValue* stringProtoFuncSmall(ExecState*, JSObject*, const List&);
     111  JSValue* stringProtoFuncBlink(ExecState*, JSObject*, const List&);
     112  JSValue* stringProtoFuncBold(ExecState*, JSObject*, const List&);
     113  JSValue* stringProtoFuncFixed(ExecState*, JSObject*, const List&);
     114  JSValue* stringProtoFuncItalics(ExecState*, JSObject*, const List&);
     115  JSValue* stringProtoFuncStrike(ExecState*, JSObject*, const List&);
     116  JSValue* stringProtoFuncSub(ExecState*, JSObject*, const List&);
     117  JSValue* stringProtoFuncSup(ExecState*, JSObject*, const List&);
     118  JSValue* stringProtoFuncFontcolor(ExecState*, JSObject*, const List&);
     119  JSValue* stringProtoFuncFontsize(ExecState*, JSObject*, const List&);
     120  JSValue* stringProtoFuncAnchor(ExecState*, JSObject*, const List&);
     121  JSValue* stringProtoFuncLink(ExecState*, JSObject*, const List&);
     122#endif // KJS_PURE_ECMA
    131123
    132124  /**
Note: See TracChangeset for help on using the changeset viewer.