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

    r250655 r255440  
    198198struct JSTextPosition {
    199199    JSTextPosition() = default;
    200     JSTextPosition(int _line, int _offset, int _lineStartOffset) : line(_line), offset(_offset), lineStartOffset(_lineStartOffset) { }
     200    JSTextPosition(int _line, int _offset, int _lineStartOffset)
     201        : line(_line)
     202        , offset(_offset)
     203        , lineStartOffset(_lineStartOffset)
     204    {
     205        checkConsistency();
     206    }
    201207
    202208    JSTextPosition operator+(int adjustment) const { return JSTextPosition(line, offset + adjustment, lineStartOffset); }
     
    219225
    220226    int column() const { return offset - lineStartOffset; }
    221 
    222     int line { 0 };
    223     int offset { 0 };
    224     int lineStartOffset { 0 };
     227    void checkConsistency()
     228    {
     229        // FIXME: We should test ASSERT(offset >= lineStartOffset); but that breaks a lot of tests.
     230        ASSERT(line >= 0);
     231        ASSERT(offset >= 0);
     232        ASSERT(lineStartOffset >= 0);
     233    }
     234
     235    // FIXME: these should be unsigned.
     236    int line { -1 };
     237    int offset { -1 };
     238    int lineStartOffset { -1 };
    225239};
    226240
Note: See TracChangeset for help on using the changeset viewer.