Bug 1319416 - Convert Parser::{cond,or}Expr1 to plain old Parser::{cond,or}Expr. r=arai

--HG--
extra : rebase_source : 57e5cbc300a1ee6e36d27169e90fc239954e11d7
This commit is contained in:
Jeff Walden 2017-10-30 01:01:21 -07:00
parent 0f07840ce6
commit 5a8c6c51c8
2 changed files with 34 additions and 29 deletions

View File

@ -8041,10 +8041,10 @@ Precedence(ParseNodeKind pnk) {
template <class ParseHandler, typename CharT> template <class ParseHandler, typename CharT>
MOZ_ALWAYS_INLINE typename ParseHandler::Node MOZ_ALWAYS_INLINE typename ParseHandler::Node
Parser<ParseHandler, CharT>::orExpr1(InHandling inHandling, YieldHandling yieldHandling, Parser<ParseHandler, CharT>::orExpr(InHandling inHandling, YieldHandling yieldHandling,
TripledotHandling tripledotHandling, TripledotHandling tripledotHandling,
PossibleError* possibleError, PossibleError* possibleError,
InvokedPrediction invoked /* = PredictUninvoked */) InvokedPrediction invoked /* = PredictUninvoked */)
{ {
// Shift-reduce parser for the binary operator part of the JS expression // Shift-reduce parser for the binary operator part of the JS expression
// syntax. // syntax.
@ -8058,7 +8058,7 @@ Parser<ParseHandler, CharT>::orExpr1(InHandling inHandling, YieldHandling yieldH
for (;;) { for (;;) {
pn = unaryExpr(yieldHandling, tripledotHandling, possibleError, invoked); pn = unaryExpr(yieldHandling, tripledotHandling, possibleError, invoked);
if (!pn) if (!pn)
return pn; return null();
// If a binary operator follows, consume it and compute the // If a binary operator follows, consume it and compute the
// corresponding operator. // corresponding operator.
@ -8098,7 +8098,7 @@ Parser<ParseHandler, CharT>::orExpr1(InHandling inHandling, YieldHandling yieldH
ParseNodeKind combiningPnk = kindStack[depth]; ParseNodeKind combiningPnk = kindStack[depth];
pn = handler.appendOrCreateList(combiningPnk, nodeStack[depth], pn, pc); pn = handler.appendOrCreateList(combiningPnk, nodeStack[depth], pn, pc);
if (!pn) if (!pn)
return pn; return null();
} }
if (pnk == PNK_LIMIT) if (pnk == PNK_LIMIT)
@ -8110,20 +8110,27 @@ Parser<ParseHandler, CharT>::orExpr1(InHandling inHandling, YieldHandling yieldH
MOZ_ASSERT(depth <= PRECEDENCE_CLASSES); MOZ_ASSERT(depth <= PRECEDENCE_CLASSES);
} }
tokenStream.ungetToken();
MOZ_ASSERT(depth == 0); MOZ_ASSERT(depth == 0);
return pn; return pn;
} }
template <class ParseHandler, typename CharT> template <class ParseHandler, typename CharT>
MOZ_ALWAYS_INLINE typename ParseHandler::Node MOZ_ALWAYS_INLINE typename ParseHandler::Node
Parser<ParseHandler, CharT>::condExpr1(InHandling inHandling, YieldHandling yieldHandling, Parser<ParseHandler, CharT>::condExpr(InHandling inHandling, YieldHandling yieldHandling,
TripledotHandling tripledotHandling, TripledotHandling tripledotHandling,
PossibleError* possibleError, PossibleError* possibleError,
InvokedPrediction invoked /* = PredictUninvoked */) InvokedPrediction invoked /* = PredictUninvoked */)
{ {
Node condition = orExpr1(inHandling, yieldHandling, tripledotHandling, possibleError, invoked); Node condition = orExpr(inHandling, yieldHandling, tripledotHandling, possibleError, invoked);
if (!condition)
return null();
if (!condition || !tokenStream.isCurrentTokenType(TOK_HOOK)) bool matched;
if (!tokenStream.matchToken(&matched, TOK_HOOK))
return null();
if (!matched)
return condition; return condition;
Node thenExpr = assignExpr(InAllowed, yieldHandling, TripledotProhibited); Node thenExpr = assignExpr(InAllowed, yieldHandling, TripledotProhibited);
@ -8136,10 +8143,6 @@ Parser<ParseHandler, CharT>::condExpr1(InHandling inHandling, YieldHandling yiel
if (!elseExpr) if (!elseExpr)
return null(); return null();
// Advance to the next token; the caller is responsible for interpreting it.
TokenKind ignored;
if (!tokenStream.getToken(&ignored))
return null();
return handler.newConditional(condition, thenExpr, elseExpr); return handler.newConditional(condition, thenExpr, elseExpr);
} }
@ -8161,7 +8164,7 @@ Parser<ParseHandler, CharT>::assignExpr(InHandling inHandling, YieldHandling yie
// numeric arrays, such as some Kraken benchmarks, it happens more often.) // numeric arrays, such as some Kraken benchmarks, it happens more often.)
// //
// In such cases, we can avoid the full expression parsing route through // In such cases, we can avoid the full expression parsing route through
// assignExpr(), condExpr1(), orExpr1(), unaryExpr(), memberExpr(), and // assignExpr(), condExpr(), orExpr(), unaryExpr(), memberExpr(), and
// primaryExpr(). // primaryExpr().
TokenKind tt; TokenKind tt;
@ -8244,14 +8247,16 @@ Parser<ParseHandler, CharT>::assignExpr(InHandling inHandling, YieldHandling yie
return null(); return null();
} }
} else { } else {
lhs = condExpr1(inHandling, yieldHandling, tripledotHandling, &possibleErrorInner, invoked); lhs = condExpr(inHandling, yieldHandling, tripledotHandling, &possibleErrorInner, invoked);
if (!lhs) { if (!lhs)
return null();
if (!tokenStream.getToken(&tt))
return null(); return null();
}
} }
ParseNodeKind kind; ParseNodeKind kind;
switch (tokenStream.currentToken().type) { switch (tt) {
case TOK_ASSIGN: kind = PNK_ASSIGN; break; case TOK_ASSIGN: kind = PNK_ASSIGN; break;
case TOK_ADDASSIGN: kind = PNK_ADDASSIGN; break; case TOK_ADDASSIGN: kind = PNK_ADDASSIGN; break;
case TOK_SUBASSIGN: kind = PNK_SUBASSIGN; break; case TOK_SUBASSIGN: kind = PNK_SUBASSIGN; break;

View File

@ -737,14 +737,14 @@ class Parser final : public ParserBase, private JS::AutoGCRooter
InvokedPrediction invoked = PredictUninvoked); InvokedPrediction invoked = PredictUninvoked);
Node assignExprWithoutYieldOrAwait(YieldHandling yieldHandling); Node assignExprWithoutYieldOrAwait(YieldHandling yieldHandling);
Node yieldExpression(InHandling inHandling); Node yieldExpression(InHandling inHandling);
Node condExpr1(InHandling inHandling, YieldHandling yieldHandling, Node condExpr(InHandling inHandling, YieldHandling yieldHandling,
TripledotHandling tripledotHandling, TripledotHandling tripledotHandling,
PossibleError* possibleError, PossibleError* possibleError,
InvokedPrediction invoked = PredictUninvoked); InvokedPrediction invoked = PredictUninvoked);
Node orExpr1(InHandling inHandling, YieldHandling yieldHandling, Node orExpr(InHandling inHandling, YieldHandling yieldHandling,
TripledotHandling tripledotHandling, TripledotHandling tripledotHandling,
PossibleError* possibleError, PossibleError* possibleError,
InvokedPrediction invoked = PredictUninvoked); InvokedPrediction invoked = PredictUninvoked);
Node unaryExpr(YieldHandling yieldHandling, TripledotHandling tripledotHandling, Node unaryExpr(YieldHandling yieldHandling, TripledotHandling tripledotHandling,
PossibleError* possibleError = nullptr, PossibleError* possibleError = nullptr,
InvokedPrediction invoked = PredictUninvoked); InvokedPrediction invoked = PredictUninvoked);