Changeset 200293 in webkit
- Timestamp:
- Apr 30, 2016 1:05:13 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r200288 r200293 1 2016-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 1 29 2016-04-28 Darin Adler <darin@apple.com> 2 30 -
trunk/Source/JavaScriptCore/parser/Parser.cpp
r200038 r200293 422 422 semanticFailIfFalse(isValidStrictMode(), "Invalid parameters or function name in strict mode"); 423 423 } 424 // Since strict mode is changed, restoring lexer state by calling next() may cause errors. 424 425 restoreSavePoint(savePoint); 425 426 propagateError(); … … 955 956 failIfFalse(innerPattern, "Cannot parse this destructuring pattern"); 956 957 TreeExpression defaultValue = parseDefaultValueForDestructuringPattern(context); 958 propagateError(); 957 959 context.appendArrayPatternEntry(arrayPattern, location, innerPattern, defaultValue); 958 960 } while (consume(COMMA)); … … 1038 1040 failIfFalse(innerPattern, "Cannot parse this destructuring pattern"); 1039 1041 TreeExpression defaultValue = parseDefaultValueForDestructuringPattern(context); 1042 propagateError(); 1040 1043 if (propertyExpression) 1041 1044 context.appendObjectPatternEntry(objectPattern, location, propertyExpression, innerPattern, defaultValue); … … 3079 3082 bool isArrowFunctionToken = match(ARROWFUNCTION); 3080 3083 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(); 3085 3085 restoreSavePoint(savePoint); 3086 3086 if (isArrowFunctionParameters()) { … … 3089 3089 return parseArrowFunctionExpression(context); 3090 3090 } 3091 restoreSavePointWithError(errorRestorationSavePoint, oldErrorMessage); 3092 m_lexer->setErrorMessage(oldLexerErrorMessage); 3093 m_lexer->setSawError(hasLexerError); 3091 restoreSavePointWithError(errorRestorationSavePoint); 3094 3092 if (isArrowFunctionToken) 3095 3093 failDueToUnexpectedToken(); … … 3103 3101 3104 3102 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(); 3109 3104 restoreSavePoint(savePoint); 3110 3105 auto pattern = tryParseDestructuringPatternExpression(context, AssignmentContext::AssignmentExpression); 3111 3106 if (classifier.indicatesPossiblePattern() && (!pattern || !match(EQUAL))) { 3112 restoreSavePointWithError(expressionErrorLocation, expressionError); 3113 m_lexer->setErrorMessage(oldLexerErrorMessage); 3114 m_lexer->setSawError(hasLexerError); 3107 restoreSavePointWithError(expressionErrorLocation); 3115 3108 return 0; 3116 3109 } -
trunk/Source/JavaScriptCore/parser/Parser.h
r200038 r200293 1519 1519 ALWAYS_INLINE void restoreLexerState(const LexerState& lexerState) 1520 1520 { 1521 // setOffset clears lexer errors. 1521 1522 m_lexer->setOffset(lexerState.startOffset, lexerState.oldLineStartOffset); 1522 1523 next(); … … 1529 1530 LexerState lexerState; 1530 1531 }; 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; 1538 1553 } 1539 1554 … … 1541 1556 { 1542 1557 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 { 1549 1565 restoreLexerState(savePoint.lexerState); 1550 1566 restoreParserState(savePoint.parserState); 1551 1567 } 1552 1568 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 1553 1577 ALWAYS_INLINE void restoreSavePoint(const SavePoint& savePoint) 1554 1578 { 1555 restoreSavePointWithError(savePoint, String()); 1579 internalRestoreState(savePoint); 1580 m_errorMessage = String(); 1556 1581 } 1557 1582
Note: See TracChangeset
for help on using the changeset viewer.