Fixed: <rdar://problem/4147745> JavaScript discards locally defined "arguments"...
authorggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 14 Jun 2005 16:36:11 +0000 (16:36 +0000)
committerggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 14 Jun 2005 16:36:11 +0000 (16:36 +0000)
No layout tests added because this change fixes existing tests:
ecma/ExecutionContexts/10.1.6.js
        ecma_3/Function/regress-94506.js
        js1_4/Functions/function-001.js

        Reviewed by cblu.

        * kjs/function.cpp:
        (KJS::ActivationImp::get): get now checks for an "arguments" property defined in the local variable object
before trying to return the built-in arguments array.

        * kjs/function.h: ActivationImp::put no longer overrides ObjectImp::put

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/function.cpp
JavaScriptCore/kjs/function.h

index f1029aca6bda2fd61138d5f7d50e77a843ebdcf8..586fe9a5633962e532e675472c48703718320aa5 100644 (file)
@@ -1,3 +1,20 @@
+2005-06-14  Geoffrey Garen  <ggaren@apple.com>
+
+       Fixed: <rdar://problem/4147745> JavaScript discards locally defined "arguments" property
+
+       No layout tests added because this change fixes existing tests:
+       ecma/ExecutionContexts/10.1.6.js
+        ecma_3/Function/regress-94506.js
+        js1_4/Functions/function-001.js
+
+        Reviewed by cblu.
+
+        * kjs/function.cpp:
+        (KJS::ActivationImp::get): get now checks for an "arguments" property defined in the local variable object
+       before trying to return the built-in arguments array.
+       
+        * kjs/function.h: ActivationImp::put no longer overrides ObjectImp::put
+
 2005-06-10  Darin Adler  <darin@apple.com>
 
         Change by Mark Rowe <opendarwin.org@bdash.net.nz>.
index 37ee22216caffdd29fcf7b3f1d001de4c9c18c9a..5fcff52df3907b3afd31e80710caf34e9e83782f 100644 (file)
@@ -344,22 +344,19 @@ ActivationImp::ActivationImp(FunctionImp *function, const List &arguments)
 Value ActivationImp::get(ExecState *exec, const Identifier &propertyName) const
 {
     if (propertyName == argumentsPropertyName) {
+        // check for locally declared arguments property
+        ValueImp *v = getDirect(propertyName);
+        if (v)
+            return Value(v);
+
+        // default: return builtin arguments array
         if (!_argumentsObject)
-            createArgumentsObject(exec);
+                createArgumentsObject(exec);
         return Value(_argumentsObject);
     }
     return ObjectImp::get(exec, propertyName);
 }
 
-void ActivationImp::put(ExecState *exec, const Identifier &propertyName, const Value &value, int attr)
-{
-    if (propertyName == argumentsPropertyName) {
-        // FIXME: Do we need to allow overwriting this?
-        return;
-    }
-    ObjectImp::put(exec, propertyName, value, attr);
-}
-
 bool ActivationImp::hasProperty(ExecState *exec, const Identifier &propertyName) const
 {
     if (propertyName == argumentsPropertyName)
index 7c0d2906dc9b85cd211691895309b69c94fbcd96..18567f4c15004c22ef4393ccf3e483aafdf7fc4e 100644 (file)
@@ -104,7 +104,6 @@ namespace KJS {
     ActivationImp(FunctionImp *function, const List &arguments);
 
     virtual Value get(ExecState *exec, const Identifier &propertyName) const;
-    virtual void put(ExecState *exec, const Identifier &propertyName, const Value &value, int attr = None);
     virtual bool hasProperty(ExecState *exec, const Identifier &propertyName) const;
     virtual bool deleteProperty(ExecState *exec, const Identifier &propertyName);