Reviewed by Oliver.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Jul 2007 08:48:04 +0000 (08:48 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Jul 2007 08:48:04 +0000 (08:48 +0000)
        - fix Window shadowing regressions caused by the previous commit.

        * kjs/nodes.cpp:
        (VarDeclNode::evaluate): Handle the case of global scope specially.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/nodes.cpp

index e60d5c7..03ba957 100644 (file)
@@ -1,3 +1,12 @@
+2007-07-23  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Oliver.
+        
+        - fix Window shadowing regressions caused by the previous commit.
+
+        * kjs/nodes.cpp:
+        (VarDeclNode::evaluate): Handle the case of global scope specially.
+
 2007-07-22  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Darin.
 2007-07-22  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Darin.
index eef4dea..9ffea7b 100644 (file)
@@ -1618,17 +1618,15 @@ JSValue* VarDeclNode::handleSlowCase(ExecState* exec, const ScopeChain& chain, J
 // ECMA 12.2
 JSValue* VarDeclNode::evaluate(ExecState* exec)
 {
 // ECMA 12.2
 JSValue* VarDeclNode::evaluate(ExecState* exec)
 {
-    JSValue* val;
+    const ScopeChain& chain = exec->context()->scopeChain();
+    JSObject* variableObject = exec->context()->variableObject();
+
+    ASSERT(!chain.isEmpty());
+
     if (init) {
     if (init) {
-        val = init->evaluate(exec);
+        JSValue* val = init->evaluate(exec);
         KJS_CHECKEXCEPTIONVALUE
             
         KJS_CHECKEXCEPTIONVALUE
             
-        const ScopeChain& chain = exec->context()->scopeChain();
-        JSObject* variableObject = exec->context()->variableObject();
-
-        ASSERT(!chain.isEmpty());
-        ASSERT(variableObject->getDirect(ident) || ident == exec->propertyNames().arguments);
-
         // if the variable object is the top of the scope chain, then that must
         // be where this variable is declared, processVarDecls would have put 
         // it there. Don't search the scope chain, to optimize this very common case.
         // if the variable object is the top of the scope chain, then that must
         // be where this variable is declared, processVarDecls would have put 
         // it there. Don't search the scope chain, to optimize this very common case.
@@ -1640,8 +1638,29 @@ JSValue* VarDeclNode::evaluate(ExecState* exec)
         if (varType == VarDeclNode::Constant)
             flags |= ReadOnly;
         
         if (varType == VarDeclNode::Constant)
             flags |= ReadOnly;
         
-        variableObject->put(exec, ident, val, flags);
-    } 
+        if (++chain.begin() == chain.end()) {
+            int flags = Internal;
+            if (exec->context()->codeType() != EvalCode)
+                flags |= DontDelete;
+            if (varType == VarDeclNode::Constant)
+                flags |= ReadOnly;
+            variableObject->putDirect(ident, val, flags);
+        } else {
+            ASSERT(variableObject->getDirect(ident) || ident == exec->propertyNames().arguments);
+            variableObject->put(exec, ident, val, flags);
+        }
+    } else {
+        if (++chain.begin() == chain.end()) {
+            int flags = Internal;
+            if (exec->context()->codeType() != EvalCode)
+                flags |= DontDelete;
+            if (varType == VarDeclNode::Constant)
+                flags |= ReadOnly;
+            variableObject->putDirect(ident, jsUndefined(), flags);
+        } else {
+
+        }
+    }
 
     // no caller of this function actually uses the return value. 
     // FIXME: It would be better to change the inheritence hierarchy so this
 
     // no caller of this function actually uses the return value. 
     // FIXME: It would be better to change the inheritence hierarchy so this