Ignore:
Timestamp:
Nov 13, 2015, 11:13:39 AM (10 years ago)
Author:
[email protected]
Message:

Allow any LeftHandSideExpression as a valid AssignmentElement
https://bugs.webkit.org/show_bug.cgi?id=151026

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

  • bytecompiler/NodesCodegen.cpp:

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

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::isAssignmentLocation):
(JSC::ASTBuilder::createAssignmentElement):

  • parser/NodeConstructors.h:

(JSC::AssignmentElementNode::AssignmentElementNode):

  • parser/Nodes.h:

(JSC::AssignmentElementNode::assignmentTarget):
(JSC::AssignmentElementNode::divotStart):
(JSC::AssignmentElementNode::divotEnd):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::createAssignmentElement):
(JSC::Parser<LexerType>::parseDestructuringPattern):

  • parser/Parser.h:
  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::operatorStackPop):

File:
1 edited

Legend:

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

    r192147 r192436  
    732732
    733733template <typename LexerType>
     734template <class TreeBuilder> NEVER_INLINE TreeDestructuringPattern Parser<LexerType>::createAssignmentElement(TreeBuilder& context, TreeExpression& assignmentTarget, const JSTextPosition& startPosition, const JSTextPosition& endPosition)
     735{
     736    return context.createAssignmentElement(assignmentTarget, startPosition, endPosition);
     737}
     738
     739template <typename LexerType>
    734740template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseArrowFunctionSingleExpressionBodySourceElements(TreeBuilder& context)
    735741{
     
    764770{
    765771    return parseDestructuringPattern(context, DestructureToExpressions, ExportType::NotExported, nullptr, nullptr, bindingContext);
     772}
     773
     774template <typename LexerType>
     775template <class TreeBuilder> TreeDestructuringPattern Parser<LexerType>::parseBindingOrAssignmentElement(TreeBuilder& context, DestructuringKind kind, ExportType exportType, const Identifier** duplicateIdentifier, bool* hasDestructuringPattern, AssignmentContext bindingContext, int depth)
     776{
     777    if (kind == DestructureToExpressions)
     778        return parseAssignmentElement(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth);
     779    return parseDestructuringPattern(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth);
     780}
     781
     782template <typename LexerType>
     783template <class TreeBuilder> TreeDestructuringPattern Parser<LexerType>::parseAssignmentElement(TreeBuilder& context, DestructuringKind kind, ExportType exportType, const Identifier** duplicateIdentifier, bool* hasDestructuringPattern, AssignmentContext bindingContext, int depth)
     784{
     785    SavePoint savePoint = createSavePoint();
     786    TreeDestructuringPattern assignmentTarget = 0;
     787
     788    if (match(OPENBRACE) || match(OPENBRACKET))
     789        assignmentTarget = parseDestructuringPattern(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth);
     790    if (!assignmentTarget || match(DOT) || match(OPENBRACKET) || match(OPENPAREN) || match(TEMPLATE)) {
     791        restoreSavePoint(savePoint);
     792        JSTextPosition startPosition = tokenStartPosition();
     793        auto element = parseMemberExpression(context);
     794
     795        semanticFailIfFalse(element && context.isAssignmentLocation(element), "Invalid destructuring assignment target");
     796
     797        return createAssignmentElement(context, element, startPosition, lastTokenEndPosition());
     798    }
     799    return assignmentTarget;
    766800}
    767801
     
    796830                JSTokenLocation location = m_token.m_location;
    797831                next();
    798                 auto innerPattern = parseDestructuringPattern(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1);
     832                auto innerPattern = parseBindingOrAssignmentElement(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1);
    799833                if (kind == DestructureToExpressions && !innerPattern)
    800834                    return 0;
     
    809843
    810844            JSTokenLocation location = m_token.m_location;
    811             auto innerPattern = parseDestructuringPattern(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1);
     845            auto innerPattern = parseBindingOrAssignmentElement(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1);
    812846            if (kind == DestructureToExpressions && !innerPattern)
    813847                return 0;
     
    817851        } while (consume(COMMA));
    818852
    819         if (kind == DestructureToExpressions && !match(CLOSEBRACKET))
    820             return 0;
    821853        consumeOrFail(CLOSEBRACKET, restElementWasFound ? "Expected a closing ']' following a rest element destructuring pattern" : "Expected either a closing ']' or a ',' following an element destructuring pattern");
    822854        context.finishArrayPattern(arrayPattern, divotStart, divotStart, lastTokenEndPosition());
     
    846878                next();
    847879                if (consume(COLON))
    848                     innerPattern = parseDestructuringPattern(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1);
     880                    innerPattern = parseBindingOrAssignmentElement(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1);
    849881                else
    850882                    innerPattern = createBindingPattern(context, kind, exportType, *propertyName, depth + 1, identifierToken, bindingContext, duplicateIdentifier);
     
    879911                    failWithMessage("Expected a ':' prior to a named destructuring property");
    880912                }
    881                 innerPattern = parseDestructuringPattern(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1);
     913                innerPattern = parseBindingOrAssignmentElement(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1);
    882914            }
    883915            if (kind == DestructureToExpressions && !innerPattern)
     
    26902722    int initialAssignmentCount = m_assignmentCount;
    26912723    int initialNonLHSCount = m_nonLHSCount;
     2724    String assignmentPatternError = String();
    26922725    if (match(OPENBRACE) || match(OPENBRACKET)) {
    26932726        SavePoint savePoint = createSavePoint();
     
    26982731                return context.createDestructuringAssignment(location, pattern, rhs);
    26992732        }
     2733        assignmentPatternError = m_errorMessage;
    27002734        restoreSavePoint(savePoint);
    27012735    }
     
    27122746   
    27132747    TreeExpression lhs = parseConditionalExpression(context);
     2748    if (!assignmentPatternError.isNull() && (lhs && (context.isObjectOrArrayLiteral(lhs) && match(EQUAL)))) {
     2749        setErrorMessage(assignmentPatternError);
     2750        return 0;
     2751    }
    27142752    failIfFalse(lhs, "Cannot parse expression");
    27152753    if (initialNonLHSCount != m_nonLHSCount) {
Note: See TracChangeset for help on using the changeset viewer.