Ignore:
Timestamp:
Dec 1, 2015, 2:47:00 PM (10 years ago)
Author:
[email protected]
Message:

[JSC] support CoverInitializedName in nested AssignmentPatterns
https://bugs.webkit.org/show_bug.cgi?id=151595

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

A regression introduced in bug https://bugs.webkit.org/show_bug.cgi?id=151026
causes the parser to fail when attempting to parse nested
ObjectAssignmentPatterns with CoverInitializedName destructuring targets.

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseAssignmentExpressionOrPropagateErrorClass):
(JSC::Parser<LexerType>::parseAssignmentExpression):
(JSC::Parser<LexerType>::parseProperty):
(JSC::Parser<LexerType>::parseArrayLiteral):

  • parser/Parser.h:

(JSC::Parser::ExpressionErrorClassifier::propagateExpressionErrorClass):

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

(test1):
(test2):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r192914 r192919  
    28312831}
    28322832
    2833    
     2833template <typename LexerType>
     2834template <typename TreeBuilder> TreeExpression Parser<LexerType>::parseAssignmentExpressionOrPropagateErrorClass(TreeBuilder& context)
     2835{
     2836    ExpressionErrorClassifier classifier(this);
     2837    auto assignment = parseAssignmentExpression(context, classifier);
     2838    if (!assignment)
     2839        classifier.propagateExpressionErrorClass();
     2840    return assignment;
     2841}
     2842
    28342843template <typename LexerType>
    28352844template <typename TreeBuilder> TreeExpression Parser<LexerType>::parseAssignmentExpression(TreeBuilder& context)
     2845{
     2846    ExpressionErrorClassifier classifier(this);
     2847    return parseAssignmentExpression(context, classifier);
     2848}
     2849   
     2850template <typename LexerType>
     2851template <typename TreeBuilder> TreeExpression Parser<LexerType>::parseAssignmentExpression(TreeBuilder& context, ExpressionErrorClassifier& classifier)
    28362852{
    28372853    failIfStackOverflow();
     
    28422858    bool maybeAssignmentPattern = match(OPENBRACE) || match(OPENBRACKET);
    28432859    SavePoint savePoint = createSavePoint();
    2844     ExpressionErrorClassifier classifier(this);
    28452860
    28462861#if ENABLE(ES6_GENERATORS)
     
    30723087        if (!isGenerator && match(COLON)) {
    30733088            next();
    3074             TreeExpression node = parseAssignmentExpression(context);
     3089            TreeExpression node = parseAssignmentExpressionOrPropagateErrorClass(context);
    30753090            failIfFalse(node, "Cannot parse expression for property declaration");
    30763091            context.setEndOffset(node, m_lexer->currentOffset());
     
    33483363        auto divot = m_token.m_endPosition;
    33493364        next();
    3350         auto spreadExpr = parseAssignmentExpression(context);
     3365        auto spreadExpr = parseAssignmentExpressionOrPropagateErrorClass(context);
    33513366        failIfFalse(spreadExpr, "Cannot parse subject of a spread operation");
    33523367        elem = context.createSpreadExpression(spreadLocation, spreadExpr, start, divot, m_lastTokenEndPosition);
    33533368    } else
    3354         elem = parseAssignmentExpression(context);
     3369        elem = parseAssignmentExpressionOrPropagateErrorClass(context);
    33553370    failIfFalse(elem, "Cannot parse array literal element");
    33563371    typename TreeBuilder::ElementList elementList = context.createElementList(elisions, elem);
     
    33763391            auto divot = m_token.m_endPosition;
    33773392            next();
    3378             TreeExpression elem = parseAssignmentExpression(context);
     3393            TreeExpression elem = parseAssignmentExpressionOrPropagateErrorClass(context);
    33793394            failIfFalse(elem, "Cannot parse subject of a spread operation");
    33803395            auto spread = context.createSpreadExpression(spreadLocation, elem, start, divot, m_lastTokenEndPosition);
     
    33823397            continue;
    33833398        }
    3384         TreeExpression elem = parseAssignmentExpression(context);
     3399        TreeExpression elem = parseAssignmentExpressionOrPropagateErrorClass(context);
    33853400        failIfFalse(elem, "Cannot parse array literal element");
    33863401        tail = context.createElementList(tail, elisions, elem);
Note: See TracChangeset for help on using the changeset viewer.