Ignore:
Timestamp:
Nov 19, 2015, 2:54:46 PM (10 years ago)
Author:
[email protected]
Message:

[JSC] Fix AssignmentElement parsing
https://bugs.webkit.org/show_bug.cgi?id=151026

Patch by Caitlin Potter <[email protected]> on 2015-11-19
Reviewed by Geoffrey Garen.

When parsing an AssignmentPattern, any LeftHandSideExpression which
is a valid assignment target is acceptable.

Additionally, this change minimizes the amount of time spent
re-parsing ObjectLiteral and ArrayLiterals, by parsing as an
Expression first (the common case), and re-parsing only if the
result is a valid ObjectLiteral or ArrayLiteral followed by an =,
or if an error specifically indicates that the expression could
have been parsed as an AssignmentPattern.

  • bytecompiler/NodesCodegen.cpp:

(JSC::AssignmentElementNode::collectBoundIdentifiers):
(JSC::AssignmentElementNode::bindValue):
(JSC::AssignmentElementNode::toString):

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::isAssignmentLocation):
(JSC::ASTBuilder::isObjectLiteral):
(JSC::ASTBuilder::isArrayLiteral):
(JSC::ASTBuilder::isObjectOrArrayLiteral):
(JSC::ASTBuilder::createAssignmentElement):

  • parser/NodeConstructors.h:

(JSC::AssignmentElementNode::AssignmentElementNode):

  • parser/Nodes.h:

(JSC::ExpressionNode::isObjectLiteral):
(JSC::ExpressionNode::isArrayLiteral):
(JSC::AssignmentElementNode::assignmentTarget):
(JSC::AssignmentElementNode::divotStart):
(JSC::AssignmentElementNode::divotEnd):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::Parser):
(JSC::Parser<LexerType>::createAssignmentElement):
(JSC::Parser<LexerType>::parseBindingOrAssignmentElement):
(JSC::Parser<LexerType>::parseAssignmentElement):
(JSC::Parser<LexerType>::parseDestructuringPattern):
(JSC::Parser<LexerType>::parseAssignmentExpression):
(JSC::Parser<LexerType>::parseProperty):

  • parser/Parser.h:

(JSC::Parser::ExpressionErrorClassifier::ExpressionErrorClassifier):
(JSC::Parser::ExpressionErrorClassifier::~ExpressionErrorClassifier):
(JSC::Parser::ExpressionErrorClassifier::classifyExpressionError):
(JSC::Parser::ExpressionErrorClassifier::indicatesPossiblePattern):
(JSC::Parser::classifyExpressionError):

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::operatorStackPop):

  • tests/es6.yaml:
  • tests/es6/destructuring_assignment_non_simple_target.js: Added.

(test.):
(test):

  • tests/es6/destructuring_initializer_scoping.js: Added.

(test.tester):

  • tests/stress/destructuring-assignment-syntax.js: Added.

(testSyntax):
(testSyntaxError):

  • tests/stress/rest-elements.js:

(shouldThrow): Deleted.

File:
1 edited

Legend:

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

    r192597 r192661  
    122122    typedef ObjectPatternNode* ObjectPattern;
    123123    typedef BindingNode* BindingPattern;
     124    typedef AssignmentElementNode* AssignmentElement;
    124125    static const bool CreatesAST = true;
    125126    static const bool NeedsFreeVariableInfo = true;
     
    525526    }
    526527
     528    bool isAssignmentLocation(const Expression& pattern)
     529    {
     530        return pattern->isAssignmentLocation();
     531    }
     532
     533    bool isObjectLiteral(const Expression& node)
     534    {
     535        return node->isObjectLiteral();
     536    }
     537
     538    bool isArrayLiteral(const Expression& node)
     539    {
     540        return node->isArrayLiteral();
     541    }
     542
     543    bool isObjectOrArrayLiteral(const Expression& node)
     544    {
     545        return isObjectLiteral(node) || isArrayLiteral(node);
     546    }
     547
    527548    StatementNode* createEmptyStatement(const JSTokenLocation& location) { return new (m_parserArena) EmptyStatementNode(location); }
    528549
     
    835856    {
    836857        return new (m_parserArena) BindingNode(boundProperty, start, end, context);
     858    }
     859
     860    AssignmentElement createAssignmentElement(const Expression& assignmentTarget, const JSTextPosition& start, const JSTextPosition& end)
     861    {
     862        return new (m_parserArena) AssignmentElementNode(assignmentTarget, start, end);
    837863    }
    838864
Note: See TracChangeset for help on using the changeset viewer.