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/Nodes.h

    r192597 r192661  
    154154        virtual bool isNumber() const { return false; }
    155155        virtual bool isString() const { return false; }
     156        virtual bool isObjectLiteral() const { return false; }
     157        virtual bool isArrayLiteral() const { return false; }
    156158        virtual bool isNull() const { return false; }
    157159        virtual bool isPure(BytecodeGenerator&) const { return false; }       
     
    593595        ArrayNode(const JSTokenLocation&, int elision, ElementNode*);
    594596
     597        virtual bool isArrayLiteral() const override { return true; }
     598
    595599        ArgumentListNode* toArgumentList(ParserArena&, int, int) const;
    596600
     
    648652        ObjectLiteralNode(const JSTokenLocation&);
    649653        ObjectLiteralNode(const JSTokenLocation&, PropertyListNode*);
     654        virtual bool isObjectLiteral() const override { return true; }
    650655
    651656    private:
     
    20492054    };
    20502055
     2056    class AssignmentElementNode : public DestructuringPatternNode {
     2057    public:
     2058        AssignmentElementNode(ExpressionNode* assignmentTarget, const JSTextPosition& start, const JSTextPosition& end);
     2059        const ExpressionNode* assignmentTarget() { return m_assignmentTarget; }
     2060
     2061        const JSTextPosition& divotStart() const { return m_divotStart; }
     2062        const JSTextPosition& divotEnd() const { return m_divotEnd; }
     2063
     2064    private:
     2065        virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
     2066        virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
     2067        virtual void toString(StringBuilder&) const override;
     2068
     2069        JSTextPosition m_divotStart;
     2070        JSTextPosition m_divotEnd;
     2071        ExpressionNode* m_assignmentTarget;
     2072    };
     2073
    20512074    class DestructuringAssignmentNode : public ExpressionNode {
    20522075    public:
Note: See TracChangeset for help on using the changeset viewer.