Commit 792383e3 authored by Toon Verwaest's avatar Toon Verwaest Committed by Commit Bot

[parser] Outline handling of postfix ops

This saves some binary size.

Change-Id: I64d20be63922ba0aab0b664fb30c3e2e023bb860
Reviewed-on: https://chromium-review.googlesource.com/c/1485841
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59826}
parent 75629d5f
...@@ -1054,6 +1054,8 @@ class ParserBase { ...@@ -1054,6 +1054,8 @@ class ParserBase {
ExpressionT ParseAwaitExpression(); ExpressionT ParseAwaitExpression();
V8_INLINE ExpressionT ParseUnaryExpression(); V8_INLINE ExpressionT ParseUnaryExpression();
V8_INLINE ExpressionT ParsePostfixExpression(); V8_INLINE ExpressionT ParsePostfixExpression();
V8_NOINLINE ExpressionT ParsePostfixContinuation(ExpressionT expression,
int lhs_beg_pos);
V8_INLINE ExpressionT ParseLeftHandSideExpression(); V8_INLINE ExpressionT ParseLeftHandSideExpression();
ExpressionT ParseLeftHandSideContinuation(ExpressionT expression); ExpressionT ParseLeftHandSideContinuation(ExpressionT expression);
ExpressionT ParseMemberWithPresentNewPrefixesExpression(); ExpressionT ParseMemberWithPresentNewPrefixesExpression();
...@@ -2993,24 +2995,29 @@ ParserBase<Impl>::ParsePostfixExpression() { ...@@ -2993,24 +2995,29 @@ ParserBase<Impl>::ParsePostfixExpression() {
int lhs_beg_pos = peek_position(); int lhs_beg_pos = peek_position();
ExpressionT expression = ParseLeftHandSideExpression(); ExpressionT expression = ParseLeftHandSideExpression();
if (!scanner()->HasLineTerminatorBeforeNext() && Token::IsCountOp(peek())) { if (V8_LIKELY(!Token::IsCountOp(peek()) ||
if (V8_UNLIKELY(!IsValidReferenceExpression(expression))) { scanner()->HasLineTerminatorBeforeNext())) {
expression = RewriteInvalidReferenceExpression( return expression;
expression, lhs_beg_pos, end_position(), }
MessageTemplate::kInvalidLhsInPostfixOp); return ParsePostfixContinuation(expression, lhs_beg_pos);
} }
if (impl()->IsIdentifier(expression)) {
expression_scope()->MarkIdentifierAsAssigned();
}
Token::Value next = Next(); template <typename Impl>
expression = typename ParserBase<Impl>::ExpressionT
factory()->NewCountOperation(next, ParserBase<Impl>::ParsePostfixContinuation(ExpressionT expression,
false /* postfix */, int lhs_beg_pos) {
expression, if (V8_UNLIKELY(!IsValidReferenceExpression(expression))) {
position()); expression = RewriteInvalidReferenceExpression(
expression, lhs_beg_pos, end_position(),
MessageTemplate::kInvalidLhsInPostfixOp);
} }
return expression; if (impl()->IsIdentifier(expression)) {
expression_scope()->MarkIdentifierAsAssigned();
}
Token::Value next = Next();
return factory()->NewCountOperation(next, false /* postfix */, expression,
position());
} }
template <typename Impl> template <typename Impl>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment