Changeset 111433 in webkit


Ignore:
Timestamp:
Mar 20, 2012 1:22:57 PM (12 years ago)
Author:
benjamin@webkit.org
Message:

Cache the type string of JavaScript object
https://bugs.webkit.org/show_bug.cgi?id=81446

Patch by Benjamin Poulain <bpoulain@apple.com> on 2012-03-20
Reviewed by Geoffrey Garen.

Instead of creating the JSString every time, we create
lazily the strings in JSGlobalData.

This avoid the construction of the StringImpl and of the JSString,
which gives some performance improvements.

  • runtime/CommonIdentifiers.h:
  • runtime/JSValue.cpp:

(JSC::JSValue::toStringSlowCase):

  • runtime/Operations.cpp:

(JSC::jsTypeStringForValue):

  • runtime/SmallStrings.cpp:

(JSC::SmallStrings::SmallStrings):
(JSC::SmallStrings::finalizeSmallStrings):
(JSC::SmallStrings::initialize):
(JSC):

  • runtime/SmallStrings.h:

(SmallStrings):

Location:
trunk/Source/JavaScriptCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r111431 r111433  
     12012-03-20  Benjamin Poulain  <bpoulain@apple.com>
     2
     3        Cache the type string of JavaScript object
     4        https://bugs.webkit.org/show_bug.cgi?id=81446
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Instead of creating the JSString every time, we create
     9        lazily the strings in JSGlobalData.
     10
     11        This avoid the construction of the StringImpl and of the JSString,
     12        which gives some performance improvements.
     13
     14        * runtime/CommonIdentifiers.h:
     15        * runtime/JSValue.cpp:
     16        (JSC::JSValue::toStringSlowCase):
     17        * runtime/Operations.cpp:
     18        (JSC::jsTypeStringForValue):
     19        * runtime/SmallStrings.cpp:
     20        (JSC::SmallStrings::SmallStrings):
     21        (JSC::SmallStrings::finalizeSmallStrings):
     22        (JSC::SmallStrings::initialize):
     23        (JSC):
     24        * runtime/SmallStrings.h:
     25        (SmallStrings):
     26
    1272012-03-20  Oliver Hunt  <oliver@apple.com>
    228
  • trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h

    r109008 r111433  
    7373    macro(valueOf) \
    7474    macro(writable) \
    75     macro(displayName) \
    76     macro(undefined)
     75    macro(displayName)
    7776
    7877#define JSC_COMMON_IDENTIFIERS_EACH_KEYWORD(macro) \
  • trunk/Source/JavaScriptCore/runtime/JSValue.cpp

    r109824 r111433  
    261261JSString* JSValue::toStringSlowCase(ExecState* exec) const
    262262{
     263    JSGlobalData& globalData = exec->globalData();
    263264    ASSERT(!isString());
    264265    if (isInt32())
    265         return jsString(&exec->globalData(), exec->globalData().numericStrings.add(asInt32()));
     266        return jsString(&globalData, globalData.numericStrings.add(asInt32()));
    266267    if (isDouble())
    267         return jsString(&exec->globalData(), exec->globalData().numericStrings.add(asDouble()));
     268        return jsString(&globalData, globalData.numericStrings.add(asDouble()));
    268269    if (isTrue())
    269         return jsNontrivialString(exec, exec->propertyNames().trueKeyword.ustring());
     270        return globalData.smallStrings.trueString(&globalData);
    270271    if (isFalse())
    271         return jsNontrivialString(exec, exec->propertyNames().falseKeyword.ustring());
     272        return globalData.smallStrings.falseString(&globalData);
    272273    if (isNull())
    273         return jsNontrivialString(exec, exec->propertyNames().nullKeyword.ustring());
     274        return globalData.smallStrings.nullString(&globalData);
    274275    if (isUndefined())
    275         return jsNontrivialString(exec, exec->propertyNames().undefined.ustring());
     276        return globalData.smallStrings.undefinedString(&globalData);
    276277
    277278    ASSERT(isCell());
  • trunk/Source/JavaScriptCore/runtime/Operations.cpp

    r105698 r111433  
    5959JSValue jsTypeStringForValue(CallFrame* callFrame, JSValue v)
    6060{
     61    JSGlobalData& globalData = callFrame->globalData();
    6162    if (v.isUndefined())
    62         return jsNontrivialString(callFrame, "undefined");
     63        return globalData.smallStrings.undefinedString(&globalData);
    6364    if (v.isBoolean())
    64         return jsNontrivialString(callFrame, "boolean");
     65        return globalData.smallStrings.booleanString(&globalData);
    6566    if (v.isNumber())
    66         return jsNontrivialString(callFrame, "number");
     67        return globalData.smallStrings.numberString(&globalData);
    6768    if (v.isString())
    68         return jsNontrivialString(callFrame, "string");
     69        return globalData.smallStrings.stringString(&globalData);
    6970    if (v.isObject()) {
    7071        // Return "undefined" for objects that should be treated
    7172        // as null when doing comparisons.
    7273        if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined())
    73             return jsNontrivialString(callFrame, "undefined");
     74            return globalData.smallStrings.undefinedString(&globalData);
    7475        CallData callData;
    7576        JSObject* object = asObject(v);
    7677        if (object->methodTable()->getCallData(object, callData) != CallTypeNone)
    77             return jsNontrivialString(callFrame, "function");
     78            return globalData.smallStrings.functionString(&globalData);
    7879    }
    79     return jsNontrivialString(callFrame, "object");
     80    return globalData.smallStrings.objectString(&globalData);
    8081}
    8182
  • trunk/Source/JavaScriptCore/runtime/SmallStrings.cpp

    r111306 r111433  
    6969
    7070SmallStrings::SmallStrings()
     71    : m_emptyString(0)
     72#define JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE(name) , m_##name(0)
     73    JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE)
     74#undef JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE
    7175{
    7276    COMPILE_ASSERT(singleCharacterStringCount == sizeof(m_singleCharacterStrings) / sizeof(m_singleCharacterStrings[0]), IsNumCharactersConstInSyncWithClassUsage);
    7377
    74     m_emptyString = 0;
    7578    for (unsigned i = 0; i < singleCharacterStringCount; ++i)
    7679        m_singleCharacterStrings[i] = 0;
     
    8689    for (unsigned i = 0; i < singleCharacterStringCount; ++i)
    8790        finalize(m_singleCharacterStrings[i]);
     91#define JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE(name) finalize(m_##name);
     92    JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE)
     93#undef JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE
    8894}
    8995
     
    109115}
    110116
     117void SmallStrings::initialize(JSGlobalData* globalData, JSString*& string, const char* value) const
     118{
     119    string = JSString::create(*globalData, StringImpl::create(value));
     120}
     121
    111122} // namespace JSC
  • trunk/Source/JavaScriptCore/runtime/SmallStrings.h

    r111306 r111433  
    3030#include <wtf/FixedArray.h>
    3131#include <wtf/OwnPtr.h>
     32
     33#define JSC_COMMON_STRINGS_EACH_NAME(macro) \
     34    macro(boolean) \
     35    macro(false) \
     36    macro(function) \
     37    macro(number) \
     38    macro(null) \
     39    macro(object) \
     40    macro(undefined) \
     41    macro(string) \
     42    macro(true)
    3243
    3344namespace JSC {
     
    6778        JSString** singleCharacterStrings() { return &m_singleCharacterStrings[0]; }
    6879
     80#define JSC_COMMON_STRINGS_ACCESSOR_DEFINITION(name) \
     81        JSString* name##String(JSGlobalData* globalData) const \
     82        { \
     83            if (!m_##name) \
     84                initialize(globalData, m_##name, #name); \
     85            return m_##name; \
     86        }
     87        JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ACCESSOR_DEFINITION)
     88#undef JSC_COMMON_STRINGS_ACCESSOR_DEFINITION
     89
    6990    private:
    7091        static const unsigned singleCharacterStringCount = maxSingleCharacterString + 1;
     
    7394        JS_EXPORT_PRIVATE void createSingleCharacterString(JSGlobalData*, unsigned char);
    7495
     96        void initialize(JSGlobalData* globalData, JSString*& string, const char* value) const;
     97
    7598        JSString* m_emptyString;
     99#define JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION(name) mutable JSString* m_##name;
     100        JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION)
     101#undef JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION
    76102        JSString* m_singleCharacterStrings[singleCharacterStringCount];
    77103        OwnPtr<SmallStringsStorage> m_storage;
Note: See TracChangeset for help on using the changeset viewer.