Title: [158074] trunk/Source/_javascript_Core
- Revision
- 158074
- Author
- [email protected]
- Date
- 2013-10-25 17:25:08 -0700 (Fri, 25 Oct 2013)
Log Message
Refactor parser rollback logic
https://bugs.webkit.org/show_bug.cgi?id=123372
Reviewed by Brady Eidson.
Add a sane abstraction for rollbacks in the parser.
* parser/Parser.cpp:
(JSC::::parseSourceElements):
(JSC::::parseObjectLiteral):
* parser/Parser.h:
(JSC::Parser::createSavePoint):
(JSC::Parser::restoreSavePoint):
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (158073 => 158074)
--- trunk/Source/_javascript_Core/ChangeLog 2013-10-26 00:02:39 UTC (rev 158073)
+++ trunk/Source/_javascript_Core/ChangeLog 2013-10-26 00:25:08 UTC (rev 158074)
@@ -1,3 +1,19 @@
+2013-10-25 Oliver Hunt <[email protected]>
+
+ Refactor parser rollback logic
+ https://bugs.webkit.org/show_bug.cgi?id=123372
+
+ Reviewed by Brady Eidson.
+
+ Add a sane abstraction for rollbacks in the parser.
+
+ * parser/Parser.cpp:
+ (JSC::::parseSourceElements):
+ (JSC::::parseObjectLiteral):
+ * parser/Parser.h:
+ (JSC::Parser::createSavePoint):
+ (JSC::Parser::restoreSavePoint):
+
2013-10-25 [email protected] <[email protected]>
[Win] _javascript_ crash with DFG JIT enabled.
Modified: trunk/Source/_javascript_Core/parser/Parser.cpp (158073 => 158074)
--- trunk/Source/_javascript_Core/parser/Parser.cpp 2013-10-26 00:02:39 UTC (rev 158073)
+++ trunk/Source/_javascript_Core/parser/Parser.cpp 2013-10-26 00:25:08 UTC (rev 158074)
@@ -199,10 +199,7 @@
bool seenNonDirective = false;
const Identifier* directive = 0;
unsigned directiveLiteralLength = 0;
- unsigned startOffset = m_token.m_location.startOffset;
- unsigned startLineStartOffset = m_token.m_location.lineStartOffset;
- unsigned oldLastLineNumber = m_lexer->lastLineNumber();
- unsigned oldLineNumber = m_lexer->lineNumber();
+ auto savePoint = createSavePoint();
bool hasSetStrict = false;
while (TreeStatement statement = parseStatement(context, directive, &directiveLiteralLength)) {
if (mode == CheckForStrictMode && !seenNonDirective) {
@@ -224,10 +221,7 @@
semanticFail("Cannot declare a variable named 'eval' in strict mode");
semanticFailIfFalse(isValidStrictMode(), "Invalid parameters or function name in strict mode");
}
- m_lexer->setOffset(startOffset, startLineStartOffset);
- next();
- m_lexer->setLastLineNumber(oldLastLineNumber);
- m_lexer->setLineNumber(oldLineNumber);
+ restoreSavePoint(savePoint);
propagateError();
continue;
}
@@ -1598,10 +1592,7 @@
template <typename LexerType>
template <class TreeBuilder> TreeExpression Parser<LexerType>::parseObjectLiteral(TreeBuilder& context)
{
- int startOffset = m_token.m_data.offset;
- unsigned oldLineStartOffset = m_lexer->currentLineStartOffset();
- unsigned oldLastLineNumber = m_lexer->lastLineNumber();
- unsigned oldLineNumber = m_lexer->lineNumber();
+ auto savePoint = createSavePoint();
consumeOrFailWithFlags(OPENBRACE, TreeBuilder::DontBuildStrings, "Expected opening '{' at the start of an object literal");
JSTokenLocation location(tokenLocation());
@@ -1615,10 +1606,7 @@
TreeProperty property = parseProperty<false>(context);
failIfFalse(property, "Cannot parse object literal property");
if (!m_syntaxAlreadyValidated && context.getType(property) != PropertyNode::Constant) {
- m_lexer->setOffset(startOffset, oldLineStartOffset);
- next();
- m_lexer->setLastLineNumber(oldLastLineNumber);
- m_lexer->setLineNumber(oldLineNumber);
+ restoreSavePoint(savePoint);
return parseStrictObjectLiteral(context);
}
TreePropertyList propertyList = context.createPropertyList(location, property);
@@ -1632,10 +1620,7 @@
property = parseProperty<false>(context);
failIfFalse(property, "Cannot parse object literal property");
if (!m_syntaxAlreadyValidated && context.getType(property) != PropertyNode::Constant) {
- m_lexer->setOffset(startOffset, oldLineStartOffset);
- next();
- m_lexer->setLastLineNumber(oldLastLineNumber);
- m_lexer->setLineNumber(oldLineNumber);
+ restoreSavePoint(savePoint);
return parseStrictObjectLiteral(context);
}
tail = context.createPropertyList(propertyLocation, property, tail);
Modified: trunk/Source/_javascript_Core/parser/Parser.h (158073 => 158074)
--- trunk/Source/_javascript_Core/parser/Parser.h 2013-10-26 00:02:39 UTC (rev 158073)
+++ trunk/Source/_javascript_Core/parser/Parser.h 2013-10-26 00:25:08 UTC (rev 158074)
@@ -759,6 +759,32 @@
return !m_errorMessage.isNull();
}
+
+ struct SavePoint {
+ int startOffset;
+ unsigned oldLineStartOffset;
+ unsigned oldLastLineNumber;
+ unsigned oldLineNumber;
+ };
+
+ ALWAYS_INLINE SavePoint createSavePoint()
+ {
+ SavePoint result;
+ result.startOffset = m_token.m_location.startOffset;
+ result.oldLineStartOffset = m_token.m_location.lineStartOffset;
+ result.oldLastLineNumber = m_lexer->lastLineNumber();
+ result.oldLineNumber = m_lexer->lineNumber();
+ return result;
+ }
+
+ ALWAYS_INLINE void restoreSavePoint(const SavePoint& savePoint)
+ {
+ m_lexer->setOffset(savePoint.startOffset, savePoint.oldLineStartOffset);
+ next();
+ m_lexer->setLastLineNumber(savePoint.oldLastLineNumber);
+ m_lexer->setLineNumber(savePoint.oldLineNumber);
+ }
+
VM* m_vm;
const SourceCode* m_source;
ParserArena* m_arena;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes