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):
(JSC::ASTBuilder::unaryTokenStackDepth const):
(JSC::ASTBuilder::setUnaryTokenStackDepth):
(JSC::Lexer<T>::Lexer):
(JSC::Lexer::setLineNumber):
(JSC::FunctionMetadataNode::operator== const):
(JSC::ThrowableExpressionData::ThrowableExpressionData):
(JSC::ThrowableExpressionData::setExceptionSourceCode):
(JSC::ThrowableExpressionData::checkConsistency const):
(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):
(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.
(JSC::JSTextPosition::JSTextPosition):
(JSC::JSTextPosition::checkConsistency):
(JSC::SyntaxChecker::operatorStackPop):