[JSC] Invalid AssignmentTargetType should be an early error.
https://bugs.webkit.org/show_bug.cgi?id=197603
Reviewed by Keith Miller.
JSTests:
- test262/expectations.yaml:
Update expectations to reflect new SyntaxErrors.
(Ideally, these should all be viewed as passing in the near future.)
- stress/async-await-basic.js:
- stress/big-int-literals.js:
Update tests to reflect new SyntaxErrors.
- ChakraCore.yaml:
- ChakraCore/test/EH/try6.baseline-jsc:
- ChakraCore/test/Error/variousErrors3.baseline-jsc: Added.
Update baselines to reflect new SyntaxErrors.
Source/JavaScriptCore:
Since ES6, expressions like 0++, ++0, 0 = 0, and 0 += 0 are all specified as early errors:
https://tc39.github.io/ecma262/#sec-update-expressions-static-semantics-early-errors
https://tc39.github.io/ecma262/#sec-assignment-operators-static-semantics-early-errors
We currently throw late ReferenceErrors for these -- let's turn them into early SyntaxErrors.
(This is based on the expectation that https://github.com/tc39/ecma262/pull/1527 will be accepted;
if that doesn't come to pass, we can subsequently introduce early ReferenceError and revise these.)
- bytecompiler/NodesCodegen.cpp:
(JSC::PostfixNode::emitBytecode): Add an assert for "function call LHS" case.
(JSC::PrefixNode::emitBytecode): Add an assert for "function call LHS" case.
(JSC::ASTBuilder::isLocation): Added.
(JSC::ASTBuilder::isAssignmentLocation): Fix misleading parameter name.
(JSC::ASTBuilder::isFunctionCall): Added.
(JSC::ASTBuilder::makeAssignNode): Add an assert for "function call LHS" case.
(JSC::SyntaxChecker::isLocation): Added.
(JSC::SyntaxChecker::isAssignmentLocation): Fix incorrect definition and align with ASTBuilder.
(JSC::SyntaxChecker::isFunctionCall): Added.
(JSC::ExpressionNode::isFunctionCall const): Added.
Ensure that the parser can check whether an expression node is a function call.
(JSC::Parser<LexerType>::isSimpleAssignmentTarget): Added.
(JSC::Parser<LexerType>::parseAssignmentExpression):
(JSC::Parser<LexerType>::parseUnaryExpression): See below.
Throw SyntaxError whenever an assignment or update expression's target is invalid.
Unfortunately, it seems that web compatibility obliges us to exempt the "function call LHS" case in sloppy mode.
(https://github.com/tc39/ecma262/issues/257#issuecomment-195106880)
Additional cleanup items:
- Make use of
semanticFailIfTrue
for isMetaProperty
checks, as it's equivalent.
- Rename
requiresLExpr
to hasPrefixUpdateOp
since it's now confusing,
and get rid of modifiesExpr
since it refers to the exact same condition.
- Stop setting
lastOperator
near the end -- one case was incorrect and regardless neither is used.
LayoutTests:
- fast/events/window-onerror4-expected.txt:
- ietestcenter/Javascript/11.13.1-1-1-expected.txt:
- ietestcenter/Javascript/11.13.1-1-2-expected.txt:
- ietestcenter/Javascript/11.13.1-1-3-expected.txt:
- ietestcenter/Javascript/11.13.1-1-4-expected.txt:
- js/basic-strict-mode-expected.txt:
- js/dom/assign-expected.txt:
- js/dom/line-column-numbers-expected.txt:
- js/dom/line-column-numbers.html:
- js/dom/postfix-syntax-expected.txt:
- js/dom/prefix-syntax-expected.txt:
- js/dom/script-tests/line-column-numbers.js:
- js/function-toString-parentheses-expected.txt:
- js/parser-syntax-check-expected.txt:
- js/parser-xml-close-comment-expected.txt:
- js/script-tests/function-toString-parentheses.js:
- js/script-tests/parser-syntax-check.js:
Update tests & expectations to reflect new SyntaxErrors.
- js/script-tests/toString-prefix-postfix-preserve-parens.js:
- js/toString-prefix-postfix-preserve-parens-expected.txt:
None of the prefix/postfix tests make sense here now that they're all SyntaxErrors;
remove them and just leave the typeof tests.