Optimise lookup of Math, undefined, NaN and Infinity
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 22 Mar 2008 04:59:20 +0000 (04:59 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 22 Mar 2008 04:59:20 +0000 (04:59 +0000)
Reviewed by Maciej

Added a method to JSVariableObject to allow us to inject DontDelete properties
into the symbol table and localStorage.  This results in a 0.4% progression in
SunSpider, with a 8% gain in math-partial-sums.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@31226 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/JSGlobalObject.cpp
JavaScriptCore/kjs/JSVariableObject.h

index 8c31e3a..aaa1129 100644 (file)
@@ -1,5 +1,20 @@
 2008-03-21  Oliver Hunt  <oliver@apple.com>
 
+        Reviewed by Maciej.
+
+        Optimise lookup of Math, undefined, NaN and Infinity
+
+        Added a method to JSVariableObject to allow us to inject DontDelete properties
+        into the symbol table and localStorage.  This results in a 0.4% progression in
+        SunSpider, with a 8% gain in math-partial-sums.
+
+        * kjs/JSGlobalObject.cpp:
+        (KJS::JSGlobalObject::reset):
+        * kjs/JSVariableObject.h:
+        (KJS::JSVariableObject::symbolTableInsert):
+
+2008-03-21  Oliver Hunt  <oliver@apple.com>
+
         Reviewed by Geoff Garen.
 
         Global properties that use LocalStorage are not correctly listed as enumerable.
index 261828b..4f4169f 100644 (file)
@@ -309,12 +309,21 @@ void JSGlobalObject::reset(JSValue* prototype)
     putDirect("URIError", d()->URIErrorConstructor);
 
     // Set global values.
-
-    putDirect("Math", new MathObjectImp(exec, d()->objectPrototype), DontEnum);
-
-    putDirect("NaN", jsNaN(), DontEnum | DontDelete);
-    putDirect("Infinity", jsNumber(Inf), DontEnum | DontDelete);
-    putDirect("undefined", jsUndefined(), DontEnum | DontDelete);
+    Identifier mathIdent = "Math";
+    JSValue* mathObject = new MathObjectImp(exec, d()->objectPrototype);
+    symbolTableInsert(mathIdent, mathObject, DontEnum | DontDelete);
+    
+    Identifier nanIdent = "NaN";
+    JSValue* nanValue = jsNaN();
+    symbolTableInsert(nanIdent, nanValue, DontEnum | DontDelete);
+    
+    Identifier infinityIdent = "Infinity";
+    JSValue* infinityValue = jsNumber(Inf);
+    symbolTableInsert(infinityIdent, infinityValue, DontEnum | DontDelete);
+    
+    Identifier undefinedIdent = "undefined";
+    JSValue* undefinedValue = jsUndefined();
+    symbolTableInsert(undefinedIdent, undefinedValue, DontEnum | DontDelete);
 
     // Set global functions.
 
index b00448a..8c9a087 100644 (file)
@@ -86,6 +86,7 @@ namespace KJS {
         bool symbolTableGet(const Identifier&, PropertySlot&);
         bool symbolTablePut(const Identifier&, JSValue*);
         bool symbolTableInitializeVariable(const Identifier&, JSValue*, unsigned attributes);
+        bool symbolTableInsert(const Identifier&, JSValue*, unsigned attributes);
 
         JSVariableObjectData* d;
     };
@@ -134,7 +135,18 @@ namespace KJS {
         entry.attributes = attributes;
         return true;
     }
+    
+    inline bool JSVariableObject::symbolTableInsert(const Identifier& propertyName, JSValue* value, unsigned attributes)
+    {
+        if (symbolTable().get(propertyName.ustring().rep()) != missingSymbolMarker())
+            return false;
 
+        ASSERT((attributes & DontDelete) != 0);
+        size_t localStorageIndex = d->localStorage.size();
+        d->localStorage.append(LocalStorageEntry(value, attributes));
+        symbolTable().add(propertyName.ustring().rep(), localStorageIndex);
+        return true;
+    }
 } // namespace KJS
 
 #endif // JSVariableObject_h