Strict mode early error (strict option warning) on assignment to declared const (383902, r=jwalden).
authorBrendan Eich <brendan@mozilla.org>
Tue, 07 Jun 2011 16:24:33 -0700
changeset 70993 8d21b9711d6b69d7c3916e5f36f62e346bf78e8c
parent 70992 22d6d8748ee798e7206298bdbd9b4915f75138d7
child 70994 561b7ff795233901b299cf04ab95e5e9238548f1
push id20463
push usercleary@mozilla.com
push dateMon, 13 Jun 2011 17:53:39 +0000
treeherdermozilla-central@872ae1cef345 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjwalden
bugs383902
milestone7.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Strict mode early error (strict option warning) on assignment to declared const (383902, r=jwalden).
js/src/jsemit.cpp
js/src/tests/js1_8_5/regress/jstests.list
js/src/tests/js1_8_5/regress/regress-383902.js
--- a/js/src/jsemit.cpp
+++ b/js/src/jsemit.cpp
@@ -2177,18 +2177,26 @@ BindNameToSlot(JSContext *cx, JSCodeGene
                 JS_ASSERT(cg->compileAndGo());
             else
                 pn->pn_op = JSOP_FALSE;
             pn->pn_dflags |= PND_BOUND;
             return JS_TRUE;
         }
         break;
       default:
-        if (pn->isConst())
+        if (pn->isConst()) {
+            if (cg->needStrictChecks()) {
+                JSAutoByteString name;
+                if (!js_AtomToPrintableString(cx, atom, &name) ||
+                    !ReportStrictModeError(cx, CG_TS(cg), cg, pn, JSMSG_READ_ONLY, name.ptr())) {
+                    return JS_FALSE;
+                }
+            }
             pn->pn_op = op = JSOP_NAME;
+        }
     }
 
     if (dn->isGlobal()) {
         if (op == JSOP_NAME) {
             /*
              * If the definition is a defined global, not potentially aliased
              * by a local variable, and not mutating the variable, try and
              * optimize to a fast, unguarded global access.
--- a/js/src/tests/js1_8_5/regress/jstests.list
+++ b/js/src/tests/js1_8_5/regress/jstests.list
@@ -1,9 +1,10 @@
 url-prefix ../../jsreftest.html?test=js1_8_5/regress/
+script regress-383902.js
 script regress-500528.js
 script regress-533876.js
 script regress-541255-0.js
 script regress-541255-1.js
 script regress-541255-2.js
 script regress-541255-3.js
 script regress-541255-4.js
 script regress-541455.js
new file mode 100644
--- /dev/null
+++ b/js/src/tests/js1_8_5/regress/regress-383902.js
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var c = 0;
+
+function f(a) {
+  const b = a;
+  try {
+    eval('"use strict"; b = 1 + a; c = 1');
+    assertEq(0, 1);
+  } catch (e) {
+    assertEq(e.name, 'TypeError');
+    assertEq(0, c);
+    assertEq(a, b);
+  }
+}
+
+var w = 42;
+f(w);
+
+c = 2;
+try {
+  eval('"use strict"; function g(x) { const y = x; y = 1 + x; } c = 3');
+  assertEq(0, 1);
+} catch (e) {
+  assertEq(e.name, 'TypeError');
+  assertEq(2, c);
+}
+
+c = 4;
+try {
+  eval('"use strict"; const z = w; z = 1 + w; c = 5');
+  assertEq(0, 1);
+} catch (e) {
+  assertEq(e.name, 'TypeError');
+  assertEq(4, c);
+  assertEq('z' in this, false);
+}
+
+reportCompare(0, 0, "ok");