Bug 17924: Crash in KJS::ConstDeclNode::evaluate with |with| and |const|
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 29 Mar 2008 07:25:34 +0000 (07:25 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 29 Mar 2008 07:25:34 +0000 (07:25 +0000)
<http://bugs.webkit.org/show_bug.cgi?id=17924>
<rdar://problem/5806933>

Reviewed by Geoff.

It turns out this is trivially avoidable if we just match firefox's
semantics and ensure that an assignment in a const declaration always
writes to the variable object.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/nodes.cpp
LayoutTests/ChangeLog
LayoutTests/fast/js/const-expected.txt
LayoutTests/fast/js/resources/const.js

index 297465b..fc88ab6 100644 (file)
@@ -1,3 +1,18 @@
+2008-03-29  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Geoff.
+
+        Bug 17924: Crash in KJS::ConstDeclNode::evaluate with |with| and |const|
+        <http://bugs.webkit.org/show_bug.cgi?id=17924>
+        <rdar://problem/5806933>
+
+        It turns out this is trivially avoidable if we just match firefox's
+        semantics and ensure that an assignment in a const declaration always
+        writes to the variable object.
+
+        * kjs/nodes.cpp:
+        (KJS::ConstDeclNode::handleSlowCase):
+
 2008-03-28  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Sam Weinig.
index 25817b3..219a7fb 100644 (file)
@@ -3836,17 +3836,16 @@ void ConstDeclNode::handleSlowCase(ExecState* exec, const ScopeChain& chain, JSV
     // We must always have something in the scope chain
     ASSERT(iter != end);
 
-    PropertySlot slot;
     JSObject* base;
 
     do {
         base = *iter;
-        if (base->getPropertySlot(exec, m_ident, slot))
+        if (base->isVariableObject())
             break;
         ++iter;
     } while (iter != end);
 
-    ASSERT(base->isActivationObject() || base->isGlobalObject());
+    ASSERT(base && base->isVariableObject());
 
     static_cast<JSVariableObject*>(base)->initializeVariable(exec, m_ident, val, ReadOnly);
 }
index d6faa8b..d1bba65 100644 (file)
@@ -1,3 +1,15 @@
+2008-03-29  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Geoff.
+
+        Bug 17924: Crash in KJS::ConstDeclNode::evaluate with |with| and |const|
+        <http://bugs.webkit.org/show_bug.cgi?id=17924>
+
+        Add test cases for const inside with
+
+        * fast/js/const-expected.txt:
+        * fast/js/resources/const.js:
+
 2008-03-28  Dan Bernstein  <mitz@apple.com>
 
         Reviewed by Dave Hyatt.
index 6430fd1..665cd30 100644 (file)
@@ -43,6 +43,8 @@ PASS one += 1 is 2
 PASS one is 1
 PASS one = 2 is 2
 PASS one is 1
+PASS object.inWith1 is 'RIGHT'
+PASS inWith2 is 'RIGHT'
 PASS successfullyParsed is true
 
 TEST COMPLETE
index ee462cd..623ba2c 100644 (file)
@@ -94,4 +94,13 @@ shouldBe("one", "1");
 shouldBe("one = 2", "2");
 shouldBe("one", "1");
 
+var object = { inWith1: "RIGHT", inWith2: ""}
+with (object) {
+    const inWith1 = "WRONG";
+    const inWith2 = "RIGHT";
+    inWith2 = "WRONG";
+}
+shouldBe("object.inWith1", "'RIGHT'");
+shouldBe("inWith2", "'RIGHT'");
+
 var successfullyParsed = true;