Changeset 111433 in webkit
- Timestamp:
- Mar 20, 2012 1:22:57 PM (12 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r111431 r111433 1 2012-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 1 27 2012-03-20 Oliver Hunt <oliver@apple.com> 2 28 -
trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h
r109008 r111433 73 73 macro(valueOf) \ 74 74 macro(writable) \ 75 macro(displayName) \ 76 macro(undefined) 75 macro(displayName) 77 76 78 77 #define JSC_COMMON_IDENTIFIERS_EACH_KEYWORD(macro) \ -
trunk/Source/JavaScriptCore/runtime/JSValue.cpp
r109824 r111433 261 261 JSString* JSValue::toStringSlowCase(ExecState* exec) const 262 262 { 263 JSGlobalData& globalData = exec->globalData(); 263 264 ASSERT(!isString()); 264 265 if (isInt32()) 265 return jsString(& exec->globalData(), exec->globalData().numericStrings.add(asInt32()));266 return jsString(&globalData, globalData.numericStrings.add(asInt32())); 266 267 if (isDouble()) 267 return jsString(& exec->globalData(), exec->globalData().numericStrings.add(asDouble()));268 return jsString(&globalData, globalData.numericStrings.add(asDouble())); 268 269 if (isTrue()) 269 return jsNontrivialString(exec, exec->propertyNames().trueKeyword.ustring());270 return globalData.smallStrings.trueString(&globalData); 270 271 if (isFalse()) 271 return jsNontrivialString(exec, exec->propertyNames().falseKeyword.ustring());272 return globalData.smallStrings.falseString(&globalData); 272 273 if (isNull()) 273 return jsNontrivialString(exec, exec->propertyNames().nullKeyword.ustring());274 return globalData.smallStrings.nullString(&globalData); 274 275 if (isUndefined()) 275 return jsNontrivialString(exec, exec->propertyNames().undefined.ustring());276 return globalData.smallStrings.undefinedString(&globalData); 276 277 277 278 ASSERT(isCell()); -
trunk/Source/JavaScriptCore/runtime/Operations.cpp
r105698 r111433 59 59 JSValue jsTypeStringForValue(CallFrame* callFrame, JSValue v) 60 60 { 61 JSGlobalData& globalData = callFrame->globalData(); 61 62 if (v.isUndefined()) 62 return jsNontrivialString(callFrame, "undefined");63 return globalData.smallStrings.undefinedString(&globalData); 63 64 if (v.isBoolean()) 64 return jsNontrivialString(callFrame, "boolean");65 return globalData.smallStrings.booleanString(&globalData); 65 66 if (v.isNumber()) 66 return jsNontrivialString(callFrame, "number");67 return globalData.smallStrings.numberString(&globalData); 67 68 if (v.isString()) 68 return jsNontrivialString(callFrame, "string");69 return globalData.smallStrings.stringString(&globalData); 69 70 if (v.isObject()) { 70 71 // Return "undefined" for objects that should be treated 71 72 // as null when doing comparisons. 72 73 if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined()) 73 return jsNontrivialString(callFrame, "undefined");74 return globalData.smallStrings.undefinedString(&globalData); 74 75 CallData callData; 75 76 JSObject* object = asObject(v); 76 77 if (object->methodTable()->getCallData(object, callData) != CallTypeNone) 77 return jsNontrivialString(callFrame, "function");78 return globalData.smallStrings.functionString(&globalData); 78 79 } 79 return jsNontrivialString(callFrame, "object");80 return globalData.smallStrings.objectString(&globalData); 80 81 } 81 82 -
trunk/Source/JavaScriptCore/runtime/SmallStrings.cpp
r111306 r111433 69 69 70 70 SmallStrings::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 71 75 { 72 76 COMPILE_ASSERT(singleCharacterStringCount == sizeof(m_singleCharacterStrings) / sizeof(m_singleCharacterStrings[0]), IsNumCharactersConstInSyncWithClassUsage); 73 77 74 m_emptyString = 0;75 78 for (unsigned i = 0; i < singleCharacterStringCount; ++i) 76 79 m_singleCharacterStrings[i] = 0; … … 86 89 for (unsigned i = 0; i < singleCharacterStringCount; ++i) 87 90 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 88 94 } 89 95 … … 109 115 } 110 116 117 void SmallStrings::initialize(JSGlobalData* globalData, JSString*& string, const char* value) const 118 { 119 string = JSString::create(*globalData, StringImpl::create(value)); 120 } 121 111 122 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/SmallStrings.h
r111306 r111433 30 30 #include <wtf/FixedArray.h> 31 31 #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) 32 43 33 44 namespace JSC { … … 67 78 JSString** singleCharacterStrings() { return &m_singleCharacterStrings[0]; } 68 79 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 69 90 private: 70 91 static const unsigned singleCharacterStringCount = maxSingleCharacterString + 1; … … 73 94 JS_EXPORT_PRIVATE void createSingleCharacterString(JSGlobalData*, unsigned char); 74 95 96 void initialize(JSGlobalData* globalData, JSString*& string, const char* value) const; 97 75 98 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 76 102 JSString* m_singleCharacterStrings[singleCharacterStringCount]; 77 103 OwnPtr<SmallStringsStorage> m_storage;
Note: See TracChangeset
for help on using the changeset viewer.