Changeset 200293 in webkit


Ignore:
Timestamp:
Apr 30, 2016 1:05:13 PM (8 years ago)
Author:
Yusuke Suzuki
Message:

Assertion failure for destructuring assignment with new.target and unary operator
https://bugs.webkit.org/show_bug.cgi?id=157149

Reviewed by Saam Barati.

The caller of parseDefaultValueForDestructuringPattern() should propagate errors.
And this patch also cleans up createSavePoint and createSavePointForError; introducing SavePointWithError.

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseSourceElements):
(JSC::Parser<LexerType>::parseDestructuringPattern):
Add propagateErorr() for parseDefaultValueForDestructuringPattern.

(JSC::Parser<LexerType>::parseAssignmentExpression):

  • parser/Parser.h:

(JSC::Parser::restoreLexerState):
(JSC::Parser::internalSaveState):
(JSC::Parser::createSavePointForError):
(JSC::Parser::createSavePoint):
(JSC::Parser::internalRestoreState):
(JSC::Parser::restoreSavePointWithError):
(JSC::Parser::restoreSavePoint):

  • tests/stress/default-value-parsing-should-propagate-error.js: Added.

(testSyntaxError):
(testSyntaxError.f):

Location:
trunk/Source/JavaScriptCore
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r200288 r200293  
     12016-04-30  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        Assertion failure for destructuring assignment with new.target and unary operator
     4        https://bugs.webkit.org/show_bug.cgi?id=157149
     5
     6        Reviewed by Saam Barati.
     7
     8        The caller of parseDefaultValueForDestructuringPattern() should propagate errors.
     9        And this patch also cleans up createSavePoint and createSavePointForError; introducing SavePointWithError.
     10
     11        * parser/Parser.cpp:
     12        (JSC::Parser<LexerType>::parseSourceElements):
     13        (JSC::Parser<LexerType>::parseDestructuringPattern):
     14        Add propagateErorr() for parseDefaultValueForDestructuringPattern.
     15
     16        (JSC::Parser<LexerType>::parseAssignmentExpression):
     17        * parser/Parser.h:
     18        (JSC::Parser::restoreLexerState):
     19        (JSC::Parser::internalSaveState):
     20        (JSC::Parser::createSavePointForError):
     21        (JSC::Parser::createSavePoint):
     22        (JSC::Parser::internalRestoreState):
     23        (JSC::Parser::restoreSavePointWithError):
     24        (JSC::Parser::restoreSavePoint):
     25        * tests/stress/default-value-parsing-should-propagate-error.js: Added.
     26        (testSyntaxError):
     27        (testSyntaxError.f):
     28
    1292016-04-28  Darin Adler  <darin@apple.com>
    230
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r200038 r200293  
    422422                        semanticFailIfFalse(isValidStrictMode(), "Invalid parameters or function name in strict mode");
    423423                    }
     424                    // Since strict mode is changed, restoring lexer state by calling next() may cause errors.
    424425                    restoreSavePoint(savePoint);
    425426                    propagateError();
     
    955956            failIfFalse(innerPattern, "Cannot parse this destructuring pattern");
    956957            TreeExpression defaultValue = parseDefaultValueForDestructuringPattern(context);
     958            propagateError();
    957959            context.appendArrayPatternEntry(arrayPattern, location, innerPattern, defaultValue);
    958960        } while (consume(COMMA));
     
    10381040            failIfFalse(innerPattern, "Cannot parse this destructuring pattern");
    10391041            TreeExpression defaultValue = parseDefaultValueForDestructuringPattern(context);
     1042            propagateError();
    10401043            if (propertyExpression)
    10411044                context.appendObjectPatternEntry(objectPattern, location, propertyExpression, innerPattern, defaultValue);
     
    30793082        bool isArrowFunctionToken = match(ARROWFUNCTION);
    30803083        if (!lhs || isArrowFunctionToken) {
    3081             SavePoint errorRestorationSavePoint = createSavePointForError();
    3082             String oldErrorMessage = m_errorMessage;
    3083             String oldLexerErrorMessage = m_lexer->getErrorMessage();
    3084             bool hasLexerError = m_lexer->sawError();
     3084            SavePointWithError errorRestorationSavePoint = createSavePointForError();
    30853085            restoreSavePoint(savePoint);
    30863086            if (isArrowFunctionParameters()) {
     
    30893089                return parseArrowFunctionExpression(context);
    30903090            }
    3091             restoreSavePointWithError(errorRestorationSavePoint, oldErrorMessage);
    3092             m_lexer->setErrorMessage(oldLexerErrorMessage);
    3093             m_lexer->setSawError(hasLexerError);
     3091            restoreSavePointWithError(errorRestorationSavePoint);
    30943092            if (isArrowFunctionToken)
    30953093                failDueToUnexpectedToken();
     
    31033101
    31043102    if (maybeAssignmentPattern && (!lhs || (context.isObjectOrArrayLiteral(lhs) && match(EQUAL)))) {
    3105         String expressionError = m_errorMessage;
    3106         String oldLexerErrorMessage = m_lexer->getErrorMessage();
    3107         bool hasLexerError = m_lexer->sawError();
    3108         SavePoint expressionErrorLocation = createSavePointForError();
     3103        SavePointWithError expressionErrorLocation = createSavePointForError();
    31093104        restoreSavePoint(savePoint);
    31103105        auto pattern = tryParseDestructuringPatternExpression(context, AssignmentContext::AssignmentExpression);
    31113106        if (classifier.indicatesPossiblePattern() && (!pattern || !match(EQUAL))) {
    3112             restoreSavePointWithError(expressionErrorLocation, expressionError);
    3113             m_lexer->setErrorMessage(oldLexerErrorMessage);
    3114             m_lexer->setSawError(hasLexerError);
     3107            restoreSavePointWithError(expressionErrorLocation);
    31153108            return 0;
    31163109        }
  • trunk/Source/JavaScriptCore/parser/Parser.h

    r200038 r200293  
    15191519    ALWAYS_INLINE void restoreLexerState(const LexerState& lexerState)
    15201520    {
     1521        // setOffset clears lexer errors.
    15211522        m_lexer->setOffset(lexerState.startOffset, lexerState.oldLineStartOffset);
    15221523        next();
     
    15291530        LexerState lexerState;
    15301531    };
    1531    
    1532     ALWAYS_INLINE SavePoint createSavePointForError()
    1533     {
    1534         SavePoint result;
    1535         result.parserState = internalSaveParserState();
    1536         result.lexerState = internalSaveLexerState();
    1537         return result;
     1532
     1533    struct SavePointWithError : public SavePoint {
     1534        bool lexerError;
     1535        String lexerErrorMessage;
     1536        String parserErrorMessage;
     1537    };
     1538
     1539    ALWAYS_INLINE void internalSaveState(SavePoint& savePoint)
     1540    {
     1541        savePoint.parserState = internalSaveParserState();
     1542        savePoint.lexerState = internalSaveLexerState();
     1543    }
     1544   
     1545    ALWAYS_INLINE SavePointWithError createSavePointForError()
     1546    {
     1547        SavePointWithError savePoint;
     1548        internalSaveState(savePoint);
     1549        savePoint.lexerError = m_lexer->sawError();
     1550        savePoint.lexerErrorMessage = m_lexer->getErrorMessage();
     1551        savePoint.parserErrorMessage = m_errorMessage;
     1552        return savePoint;
    15381553    }
    15391554   
     
    15411556    {
    15421557        ASSERT(!hasError());
    1543         return createSavePointForError();
    1544     }
    1545 
    1546     ALWAYS_INLINE void restoreSavePointWithError(const SavePoint& savePoint, const String& message)
    1547     {
    1548         m_errorMessage = message;
     1558        SavePoint savePoint;
     1559        internalSaveState(savePoint);
     1560        return savePoint;
     1561    }
     1562
     1563    ALWAYS_INLINE void internalRestoreState(const SavePoint& savePoint)
     1564    {
    15491565        restoreLexerState(savePoint.lexerState);
    15501566        restoreParserState(savePoint.parserState);
    15511567    }
    15521568
     1569    ALWAYS_INLINE void restoreSavePointWithError(const SavePointWithError& savePoint)
     1570    {
     1571        internalRestoreState(savePoint);
     1572        m_lexer->setSawError(savePoint.lexerError);
     1573        m_lexer->setErrorMessage(savePoint.lexerErrorMessage);
     1574        m_errorMessage = savePoint.parserErrorMessage;
     1575    }
     1576
    15531577    ALWAYS_INLINE void restoreSavePoint(const SavePoint& savePoint)
    15541578    {
    1555         restoreSavePointWithError(savePoint, String());
     1579        internalRestoreState(savePoint);
     1580        m_errorMessage = String();
    15561581    }
    15571582
Note: See TracChangeset for help on using the changeset viewer.