Ignore:
Timestamp:
Jan 30, 2020, 11:04:13 AM (5 years ago)
Author:
[email protected]
Message:

Parser needs to restore unary stack state when backtracking
https://bugs.webkit.org/show_bug.cgi?id=206972

Reviewed by Saam Barati.

JSTests:

  • stress/parser-save-state-remove-stale-entries.js: Added.
  • stress/parser-syntax-checker-assignments-are-not-resolve-expressions.js: Added.

(foo):

Source/JavaScriptCore:

Previously we would try to parse possibly stale unary operator
stack entries after backtracking from a parse error. This would
cause us to think one token was a different token while reparsing
after backtracking. Additionally, this patch fixes an issue where
the syntax checker would think assignment expressions were resolve
expressions. Intrestingly, this was not tested in test262.

Lastly, I tried adding some assertions to improve help diagnose
when our source text locations are incorrect.

  • bytecompiler/BytecodeGenerator.h:

(JSC::BytecodeGenerator::emitExpressionInfo):

  • bytecompiler/NodesCodegen.cpp:

(JSC::ThisNode::emitBytecode):
(JSC::ResolveNode::emitBytecode):
(JSC::EmptyVarExpression::emitBytecode):
(JSC::EmptyLetExpression::emitBytecode):
(JSC::ForInNode::emitLoopHeader):
(JSC::ForOfNode::emitBytecode):
(JSC::DefineFieldNode::emitBytecode):

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::unaryTokenStackDepth const):
(JSC::ASTBuilder::setUnaryTokenStackDepth):

  • parser/Lexer.cpp:

(JSC::Lexer<T>::Lexer):

  • parser/Lexer.h:

(JSC::Lexer::setLineNumber):

  • parser/Nodes.cpp:

(JSC::FunctionMetadataNode::operator== const):

  • parser/Nodes.h:

(JSC::ThrowableExpressionData::ThrowableExpressionData):
(JSC::ThrowableExpressionData::setExceptionSourceCode):
(JSC::ThrowableExpressionData::checkConsistency const):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::isArrowFunctionParameters):
(JSC::Parser<LexerType>::parseSourceElements):
(JSC::Parser<LexerType>::parseModuleSourceElements):
(JSC::Parser<LexerType>::parseStatementListItem):
(JSC::Parser<LexerType>::parseAssignmentElement):
(JSC::Parser<LexerType>::parseForStatement):
(JSC::Parser<LexerType>::maybeParseAsyncFunctionDeclarationStatement):
(JSC::Parser<LexerType>::parseFunctionInfo):
(JSC::Parser<LexerType>::parseClass):
(JSC::Parser<LexerType>::parseExportDeclaration):
(JSC::Parser<LexerType>::parseAssignmentExpression):
(JSC::Parser<LexerType>::parseYieldExpression):
(JSC::Parser<LexerType>::parseProperty):
(JSC::Parser<LexerType>::parseMemberExpression):
(JSC::Parser<LexerType>::parseUnaryExpression):

  • parser/Parser.h:

(JSC::Parser::lexCurrentTokenAgainUnderCurrentContext):
(JSC::Parser::internalSaveParserState):
(JSC::Parser::restoreParserState):
(JSC::Parser::internalSaveState):
(JSC::Parser::swapSavePointForError):
(JSC::Parser::createSavePoint):
(JSC::Parser::internalRestoreState):
(JSC::Parser::restoreSavePointWithError):
(JSC::Parser::restoreSavePoint):
(JSC::Parser::createSavePointForError): Deleted.

  • parser/ParserTokens.h:

(JSC::JSTextPosition::JSTextPosition):
(JSC::JSTextPosition::checkConsistency):

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::operatorStackPop):

File:
1 edited

Legend:

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

    r254653 r255440  
    335335    JSTextPosition unaryTokenStackLastStart(int&) { return JSTextPosition(0, 0, 0); }
    336336    void unaryTokenStackRemoveLast(int& stackDepth) { stackDepth = 0; }
     337    int unaryTokenStackDepth() const { return 0; }
     338    void setUnaryTokenStackDepth(int) { }
    337339   
    338     void assignmentStackAppend(int, int, int, int, int, Operator) { }
    339     int createAssignment(const JSTokenLocation&, int, int, int, int, int) { RELEASE_ASSERT_NOT_REACHED(); return AssignmentExpr; }
     340    void assignmentStackAppend(int& assignmentStackDepth, int, int, int, int, Operator) { assignmentStackDepth = 1; }
     341    int createAssignment(const JSTokenLocation&, int& assignmentStackDepth, int, int, int, int) { assignmentStackDepth = 0; return AssignmentExpr; }
    340342    const Identifier* getName(const Property& property) const { return property.name; }
    341343    PropertyNode::Type getType(const Property& property) const { return property.type; }
     
    436438    void setStartOffset(int, int) { }
    437439
    438     JSTextPosition breakpointLocation(int) { return JSTextPosition(-1, 0, 0); }
     440    JSTextPosition breakpointLocation(int) { return { }; }
    439441
    440442    void propagateArgumentsUse() { }
Note: See TracChangeset for help on using the changeset viewer.