author | Brendan Eich <brendan@mozilla.org> |
Tue, 07 Jun 2011 16:24:33 -0700 (2011-06-07) | |
changeset 70993 | 8d21b9711d6b69d7c3916e5f36f62e346bf78e8c |
parent 70992 | 22d6d8748ee798e7206298bdbd9b4915f75138d7 |
child 70994 | 561b7ff795233901b299cf04ab95e5e9238548f1 |
push id | 20463 |
push user | cleary@mozilla.com |
push date | Mon, 13 Jun 2011 17:53:39 +0000 (2011-06-13) |
treeherder | mozilla-central@872ae1cef345 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jwalden |
bugs | 383902 |
milestone | 7.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
|
--- 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");