Changeset 169316 in webkit
- Timestamp:
- May 24, 2014 8:50:43 PM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r169285 r169316 1 2014-05-24 Andreas Kling <akling@apple.com> 2 3 Object.prototype.toString() should use cached strings for null/undefined. 4 <https://webkit.org/b/133261> 5 6 Normally, when calling Object.prototype.toString() on a regular object, 7 we'd cache the result of the stringification on the object's structure, 8 making repeated calls fast. 9 10 For null and undefined, we were not as smart. We'd instead construct a 11 new string with either "[object Null]" or "[object Undefined]" each time. 12 13 This was exposed by Dromaeo's JS library tests, where some prototype.js 14 subtests generate millions of strings this way. 15 16 This patch adds two VM-permanent cached strings to the SmallStrings. 17 Looks like ~10% speed-up on Dromaeo/jslib-traverse-prototype.html 18 19 Reviewed by Darin Adler. 20 21 * runtime/ObjectPrototype.cpp: 22 (JSC::objectProtoFuncToString): 23 * runtime/SmallStrings.cpp: 24 (JSC::SmallStrings::SmallStrings): 25 (JSC::SmallStrings::initializeCommonStrings): 26 (JSC::SmallStrings::visitStrongReferences): 27 * runtime/SmallStrings.h: 28 (JSC::SmallStrings::nullObjectString): 29 (JSC::SmallStrings::undefinedObjectString): 30 1 31 2014-05-23 Mark Hahnenberg <mhahnenberg@apple.com> 2 32 -
trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp
r168549 r169316 216 216 JSValue thisValue = exec->thisValue().toThis(exec, StrictMode); 217 217 if (thisValue.isUndefinedOrNull()) 218 return JSValue::encode( jsNontrivialString(&vm, String(thisValue.isUndefined() ? ASCIILiteral("[object Undefined]") : ASCIILiteral("[object Null]"))));218 return JSValue::encode(thisValue.isUndefined() ? vm.smallStrings.undefinedObjectString() : vm.smallStrings.nullObjectString()); 219 219 JSObject* thisObject = thisValue.toObject(exec); 220 220 -
trunk/Source/JavaScriptCore/runtime/SmallStrings.cpp
r165982 r169316 68 68 JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE) 69 69 #undef JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE 70 , m_nullObjectString(nullptr) 71 , m_undefinedObjectString(nullptr) 70 72 { 71 73 COMPILE_ASSERT(singleCharacterStringCount == sizeof(m_singleCharacterStrings) / sizeof(m_singleCharacterStrings[0]), IsNumCharactersConstInSyncWithClassUsage); … … 83 85 JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE) 84 86 #undef JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE 87 initialize(&vm, m_nullObjectString, "[object Null]"); 88 initialize(&vm, m_undefinedObjectString, "[object Undefined]"); 85 89 } 86 90 … … 93 97 JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_VISIT) 94 98 #undef JSC_COMMON_STRINGS_ATTRIBUTE_VISIT 99 visitor.appendUnbarrieredPointer(&m_nullObjectString); 100 visitor.appendUnbarrieredPointer(&m_undefinedObjectString); 95 101 } 96 102 -
trunk/Source/JavaScriptCore/runtime/SmallStrings.h
r160344 r169316 87 87 #undef JSC_COMMON_STRINGS_ACCESSOR_DEFINITION 88 88 89 JSString* nullObjectString() const { return m_nullObjectString; } 90 JSString* undefinedObjectString() const { return m_undefinedObjectString; } 91 89 92 private: 90 93 static const unsigned singleCharacterStringCount = maxSingleCharacterString + 1; … … 99 102 JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION) 100 103 #undef JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION 104 JSString* m_nullObjectString; 105 JSString* m_undefinedObjectString; 101 106 JSString* m_singleCharacterStrings[singleCharacterStringCount]; 102 107 OwnPtr<SmallStringsStorage> m_storage;
Note: See TracChangeset
for help on using the changeset viewer.