Strict mode early error (strict option warning) on assignment to declared const (383902, r=jwalden).

This commit is contained in:
Brendan Eich 2011-06-07 16:24:33 -07:00
Родитель 0474b2589d
Коммит a3685cb41e
3 изменённых файлов: 53 добавлений и 1 удалений

Просмотреть файл

@ -2182,8 +2182,16 @@ BindNameToSlot(JSContext *cx, JSCodeGenerator *cg, JSParseNode *pn)
}
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()) {

Просмотреть файл

@ -1,4 +1,5 @@
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

Просмотреть файл

@ -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");