Skip to content

Commit

Permalink
[[FIX]] Tolerate valid assignments
Browse files Browse the repository at this point in the history
  • Loading branch information
jugglinmike authored and rwaldron committed Jun 6, 2019
1 parent e04746b commit 0a60c9e
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 26 deletions.
15 changes: 13 additions & 2 deletions src/jshint.js
Expand Up @@ -1577,11 +1577,22 @@ var JSHINT = (function() {
}

return true;
} else if (left.identifier && !isReserved(context, left) && !left.isMetaProperty &&
left.value !== "eval" && left.value !== "arguments") {
} else if (left.identifier && !isReserved(context, left) && !left.isMetaProperty) {
if (state.funct["(scope)"].bindingtype(left.value) === "exception") {
warning("W022", left);
}

if (left.value === "eval" && state.isStrict()) {
error("E031", assignToken);
return false;
} else if (left.value === "arguments") {
if (!state.isStrict()) {
warning("W143", assignToken);
} else {
error("E031", assignToken);
return false;
}
}
state.nameStack.set(left);
return true;
}
Expand Down
24 changes: 0 additions & 24 deletions tests/test262/expectations.txt
Expand Up @@ -1718,7 +1718,6 @@ test/language/expressions/bitwise-xor/bigint-toprimitive.js(default)
test/language/expressions/bitwise-xor/bigint-toprimitive.js(strict mode)
test/language/expressions/bitwise-xor/bigint.js(default)
test/language/expressions/bitwise-xor/bigint.js(strict mode)
test/language/expressions/call/tco-non-eval-global.js(default)
test/language/expressions/class/constructor-this-tdz-during-initializers.js(default)
test/language/expressions/class/constructor-this-tdz-during-initializers.js(strict mode)
test/language/expressions/division/bigint-and-number.js(default)
Expand Down Expand Up @@ -1937,22 +1936,14 @@ test/language/expressions/multiplication/bigint-wrapped-values.js(default)
test/language/expressions/multiplication/bigint-wrapped-values.js(strict mode)
test/language/expressions/multiplication/bigint-toprimitive.js(default)
test/language/expressions/multiplication/bigint-toprimitive.js(strict mode)
test/language/expressions/postfix-decrement/arguments-nostrict.js(default)
test/language/expressions/postfix-decrement/bigint.js(default)
test/language/expressions/postfix-decrement/bigint.js(strict mode)
test/language/expressions/postfix-decrement/eval-nostrict.js(default)
test/language/expressions/postfix-increment/arguments-nostrict.js(default)
test/language/expressions/postfix-increment/bigint.js(default)
test/language/expressions/postfix-increment/bigint.js(strict mode)
test/language/expressions/postfix-increment/eval-nostrict.js(default)
test/language/expressions/prefix-decrement/arguments-nostrict.js(default)
test/language/expressions/prefix-decrement/bigint.js(default)
test/language/expressions/prefix-decrement/bigint.js(strict mode)
test/language/expressions/prefix-decrement/eval-nostrict.js(default)
test/language/expressions/prefix-increment/arguments-nostrict.js(default)
test/language/expressions/prefix-increment/bigint.js(default)
test/language/expressions/prefix-increment/bigint.js(strict mode)
test/language/expressions/prefix-increment/eval-nostrict.js(default)
test/language/expressions/right-shift/bigint-and-number.js(default)
test/language/expressions/right-shift/bigint-and-number.js(strict mode)
test/language/expressions/right-shift/bigint-errors.js(default)
Expand Down Expand Up @@ -2093,17 +2084,14 @@ test/language/statements/class/static-classelementname-abrupt-completion.js(defa
test/language/statements/class/static-classelementname-abrupt-completion.js(strict mode)
test/language/statements/for/let-block-with-newline.js(default)
test/language/statements/for/let-identifier-with-newline.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-simple-no-strict.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-array-rest-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-simple-no-strict.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-obj-id-simple-no-strict.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-target-yield-ident-valid.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array-yield-ident-valid.js(default)
Expand All @@ -2112,18 +2100,14 @@ test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property-
test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property-with-setter.js(strict mode)
test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property.js(default)
test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property.js(strict mode)
test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-simple-no-strict.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-yield-expr.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-yield-expr.js(strict mode)
test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-simple-no-strict.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-yield-expr.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-yield-expr.js(strict mode)
test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-yield-expr.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-yield-expr.js(strict mode)
test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-yield-expr.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-yield-expr.js(strict mode)
test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-simple-no-strict.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-simple-no-strict.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-target-yield-expr.js(default)
test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-target-yield-expr.js(strict mode)
test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property-with-setter.js(default)
Expand Down Expand Up @@ -2440,7 +2424,6 @@ test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-style-short.js(def
test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-style-short.js(strict mode)
test/intl402/RelativeTimeFormat/prototype/formatToParts/value-tonumber.js(default)
test/intl402/RelativeTimeFormat/prototype/formatToParts/value-tonumber.js(strict mode)
test/language/expressions/assignment/dstr/array-elem-init-simple-no-strict.js(default)
test/language/expressions/assignment/dstr/array-elem-init-yield-ident-valid.js(default)
test/language/expressions/assignment/dstr/array-elem-iter-rtrn-close-err.js(default)
test/language/expressions/assignment/dstr/array-elem-iter-rtrn-close-err.js(strict mode)
Expand All @@ -2452,7 +2435,6 @@ test/language/expressions/assignment/dstr/array-elem-nested-array-yield-expr.js(
test/language/expressions/assignment/dstr/array-elem-nested-array-yield-expr.js(strict mode)
test/language/expressions/assignment/dstr/array-elem-nested-array-yield-ident-valid.js(default)
test/language/expressions/assignment/dstr/array-elem-nested-obj-yield-ident-valid.js(default)
test/language/expressions/assignment/dstr/array-elem-target-simple-no-strict.js(default)
test/language/expressions/assignment/dstr/array-elem-target-yield-expr.js(default)
test/language/expressions/assignment/dstr/array-elem-target-yield-expr.js(strict mode)
test/language/expressions/assignment/dstr/array-elem-target-yield-valid.js(default)
Expand Down Expand Up @@ -2492,9 +2474,7 @@ test/language/expressions/assignment/dstr/array-rest-yield-expr.js(default)
test/language/expressions/assignment/dstr/array-rest-yield-expr.js(strict mode)
test/language/expressions/assignment/dstr/array-rest-yield-ident-valid.js(default)
test/language/expressions/assignment/dstr/obj-id-identifier-yield-ident-valid.js(default)
test/language/expressions/assignment/dstr/obj-id-init-simple-no-strict.js(default)
test/language/expressions/assignment/dstr/obj-id-init-yield-ident-valid.js(default)
test/language/expressions/assignment/dstr/obj-id-simple-no-strict.js(default)
test/language/expressions/assignment/dstr/obj-prop-elem-init-yield-ident-valid.js(default)
test/language/expressions/assignment/dstr/obj-prop-elem-target-yield-expr.js(default)
test/language/expressions/assignment/dstr/obj-prop-elem-target-yield-expr.js(strict mode)
Expand Down Expand Up @@ -9017,7 +8997,6 @@ test/language/statements/class/method-static/dflt-params-ref-later.js(default)
test/language/statements/class/method-static/dflt-params-ref-later.js(strict mode)
test/language/statements/class/method-static/dflt-params-ref-self.js(default)
test/language/statements/class/method-static/dflt-params-ref-self.js(strict mode)
test/language/statements/for-of/dstr/array-elem-init-simple-no-strict.js(default)
test/language/statements/for-of/dstr/array-elem-init-yield-ident-valid.js(default)
test/language/statements/for-of/dstr/array-elem-iter-rtrn-close-err.js(default)
test/language/statements/for-of/dstr/array-elem-iter-rtrn-close-err.js(strict mode)
Expand All @@ -9029,7 +9008,6 @@ test/language/statements/for-of/dstr/array-elem-nested-array-yield-expr.js(defau
test/language/statements/for-of/dstr/array-elem-nested-array-yield-expr.js(strict mode)
test/language/statements/for-of/dstr/array-elem-nested-array-yield-ident-valid.js(default)
test/language/statements/for-of/dstr/array-elem-nested-obj-yield-ident-valid.js(default)
test/language/statements/for-of/dstr/array-elem-target-simple-no-strict.js(default)
test/language/statements/for-of/dstr/array-elem-target-yield-expr.js(default)
test/language/statements/for-of/dstr/array-elem-target-yield-expr.js(strict mode)
test/language/statements/for-of/dstr/array-elem-target-yield-valid.js(default)
Expand Down Expand Up @@ -9069,9 +9047,7 @@ test/language/statements/for-of/dstr/array-rest-yield-expr.js(default)
test/language/statements/for-of/dstr/array-rest-yield-expr.js(strict mode)
test/language/statements/for-of/dstr/array-rest-yield-ident-valid.js(default)
test/language/statements/for-of/dstr/obj-id-identifier-yield-ident-valid.js(default)
test/language/statements/for-of/dstr/obj-id-init-simple-no-strict.js(default)
test/language/statements/for-of/dstr/obj-id-init-yield-ident-valid.js(default)
test/language/statements/for-of/dstr/obj-id-simple-no-strict.js(default)
test/language/statements/for-of/dstr/obj-prop-elem-init-yield-ident-valid.js(default)
test/language/statements/for-of/dstr/obj-prop-elem-target-yield-expr.js(default)
test/language/statements/for-of/dstr/obj-prop-elem-target-yield-expr.js(strict mode)
Expand Down
36 changes: 36 additions & 0 deletions tests/unit/parser.js
Expand Up @@ -211,6 +211,42 @@ exports.assignment = function (test) {
run.test(code, { plusplus: true, esnext: true });
run.test(code, { plusplus: true, moz: true });

TestRun(test, "assignment to `eval` outside of strict mode code")
.test([
"(function() {",
" var eval = 3;",
"}());"
]);

TestRun(test, "assignment to `eval` within strict mode code")
.addError(5, 10, "Bad assignment.")
.test([
"(function() {",
" var eval;",
" (function() {",
" 'use strict';",
" eval = 3;",
" }());",
"}());"
]);

TestRun(test, "assignment to `arguments` outside of strict mode code")
.addError(2, 13, "Assignment to properties of a mapped arguments object may cause unexpected changes to formal parameters.")
.test([
"(function() {",
" arguments = 3;",
"}());"
]);

TestRun(test, "assignment to `arguments` within strict mode code")
.addError(3, 13, "Bad assignment.")
.test([
"(function() {",
" 'use strict';",
" arguments = 3;",
"}());"
]);

test.done();
};

Expand Down

0 comments on commit 0a60c9e

Please sign in to comment.