Ignore:
Timestamp:
May 16, 2019, 1:08:22 PM (6 years ago)
Author:
Ross Kirsling
Message:

[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.

  • parser/ASTBuilder.h:

(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.

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::isLocation): Added.
(JSC::SyntaxChecker::isAssignmentLocation): Fix incorrect definition and align with ASTBuilder.
(JSC::SyntaxChecker::isFunctionCall): Added.

  • parser/Nodes.h:

(JSC::ExpressionNode::isFunctionCall const): Added.
Ensure that the parser can check whether an expression node is a function call.

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::isSimpleAssignmentTarget): Added.
(JSC::Parser<LexerType>::parseAssignmentExpression):
(JSC::Parser<LexerType>::parseUnaryExpression): See below.

  • parser/Parser.h:

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/SyntaxChecker.h

    r229608 r245406  
    394394    }
    395395
     396    bool isLocation(ExpressionType type)
     397    {
     398        return type == ResolveExpr || type == DotExpr || type == BracketExpr;
     399    }
     400
    396401    bool isAssignmentLocation(ExpressionType type)
    397402    {
    398         return type == ResolveExpr || type == DotExpr || type == BracketExpr;
     403        return isLocation(type) || type == DestructuringAssignment;
    399404    }
    400405
     
    412417    {
    413418        return isObjectLiteral(type) || isArrayLiteral(type);
     419    }
     420
     421    bool isFunctionCall(ExpressionType type)
     422    {
     423        return type == CallExpr;
    414424    }
    415425
Note: See TracChangeset for help on using the changeset viewer.