Reviewed by Oliver.
authormjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Dec 2007 22:54:10 +0000 (22:54 +0000)
committermjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Dec 2007 22:54:10 +0000 (22:54 +0000)
        - Remove unnecessary redundant check from property setting
        http://bugs.webkit.org/show_bug.cgi?id=16602

        1.3% speedup on SunSpider.

        * kjs/object.cpp:
        (KJS::JSObject::put): Don't do canPut check when not needed; let
        the PropertyMap handle it.
        (KJS::JSObject::canPut): Don't check the static property
        table. lookupPut does that already.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/object.cpp

index 153a76ff066f9da29976358ceb7b3793e64dbf73..860c58bc99b78adf70f2fa73510d79b3db3d82c6 100644 (file)
@@ -1,3 +1,18 @@
+2007-12-25  Maciej Stachowiak  <mjs@apple.com>
+        
+        Reviewed by Oliver.
+                
+        - Remove unnecessary redundant check from property setting
+        http://bugs.webkit.org/show_bug.cgi?id=16602
+                
+        1.3% speedup on SunSpider.
+        
+        * kjs/object.cpp:
+        (KJS::JSObject::put): Don't do canPut check when not needed; let
+        the PropertyMap handle it.        
+        (KJS::JSObject::canPut): Don't check the static property
+        table. lookupPut does that already.
+        
 2007-12-24  Alp Toker  <alp@atoker.com>
 
         Fix builds that don't use AllInOneFile.cpp following breakage
index 0894e42d8975b74252d90596430e8484f956d6a2..805217e878b2f8d6ca835bfedefe0f03c3b7af08 100644 (file)
@@ -226,10 +226,7 @@ void JSObject::put(ExecState* exec, const Identifier &propertyName, JSValue *val
   // putValue() is used for JS assignemnts. It passes no attribute.
   // Assume that a C++ implementation knows what it is doing
   // and let it override the canPut() check.
-  if ((attr == None || attr == DontDelete) && !canPut(exec,propertyName)) {
-    return;
-  }
-
+  bool checkReadOnly = !(attr & (ReadOnly | DontEnum | Internal | Function | GetterSetter));
   // Check if there are any setters or getters in the prototype chain
   JSObject *obj = this;
   bool hasGettersOrSetters = false;
@@ -246,6 +243,10 @@ void JSObject::put(ExecState* exec, const Identifier &propertyName, JSValue *val
   }
   
   if (hasGettersOrSetters) {
+    if (checkReadOnly && !canPut(exec,propertyName)) {
+      return;
+    }
+
     obj = this;
     while (true) {
       unsigned attributes;
@@ -277,7 +278,7 @@ void JSObject::put(ExecState* exec, const Identifier &propertyName, JSValue *val
     }
   }
   
-  _prop.put(propertyName,value,attr);
+  _prop.put(propertyName, value, attr, checkReadOnly);
 }
 
 void JSObject::put(ExecState *exec, unsigned propertyName,
@@ -293,11 +294,13 @@ bool JSObject::canPut(ExecState *, const Identifier &propertyName) const
     
   // Don't look in the prototype here. We can always put an override
   // in the object, even if the prototype has a ReadOnly property.
+  // Also, there is no need to check the static property table, as this
+  // would have been done by the subclass already.
 
-  if (!getPropertyAttributes(propertyName, attributes))
+  if (!_prop.get(propertyName, attributes))
     return true;
-  else
-    return !(attributes & ReadOnly);
+
+  return !(attributes & ReadOnly);
 }
 
 // ECMA 8.6.2.4