Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Unified Diff: src/parsing/preparser.cc

Issue 1928203002: [es8] More spec compliant syntactic tail calls implementation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/parsing/preparser.cc
diff --git a/src/parsing/preparser.cc b/src/parsing/preparser.cc
index c0db7ef9dd72c0dd02e41491229bce6fdbf74e4c..fea405c6bc094d5a7b317fed52dd58323366bf7d 100644
--- a/src/parsing/preparser.cc
+++ b/src/parsing/preparser.cc
@@ -701,28 +701,21 @@ PreParser::Statement PreParser::ParseReturnStatement(bool* ok) {
// This is not handled during preparsing.
Token::Value tok = peek();
- int tail_call_position = -1;
- if (FLAG_harmony_explicit_tailcalls && tok == Token::CONTINUE) {
- Consume(Token::CONTINUE);
- tail_call_position = position();
- tok = peek();
- }
if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
tok != Token::SEMICOLON &&
tok != Token::RBRACE &&
tok != Token::EOS) {
+ // Because of the return code rewriting that happens in case of a subclass
+ // constructor we don't want to accept tail calls, therefore we don't set
+ // ReturnExprScope to kInsideValidReturnStatement here.
+ ReturnExprContext return_expr_context =
+ IsSubclassConstructor(function_state_->kind())
+ ? function_state_->return_expr_context()
+ : ReturnExprContext::kInsideValidReturnStatement;
+
+ ReturnExprScope maybe_allow_tail_calls(function_state_,
+ return_expr_context);
ParseExpression(true, CHECK_OK);
- if (tail_call_position >= 0) {
- ReturnExprContext return_expr_context =
- function_state_->return_expr_context();
- if (return_expr_context != ReturnExprContext::kNormal) {
- ReportIllegalTailCallAt(tail_call_position, return_expr_context);
- *ok = false;
- return Statement::Default();
- }
- function_state_->AddExpressionInTailPosition(
- PreParserExpression::Default(), tail_call_position);
- }
}
ExpectSemicolon(CHECK_OK);
return Statement::Jump();
@@ -989,7 +982,7 @@ PreParser::Statement PreParser::ParseTryStatement(bool* ok) {
*ok = false;
return Statement::Default();
}
- List<TailCallExpression> expressions_in_tail_position_in_catch_block;
+ TailCallExpressionList tail_call_expressions_in_catch_block(zone());
bool catch_block_exists = false;
if (tok == Token::CATCH) {
Consume(Token::CATCH);
@@ -1001,8 +994,8 @@ PreParser::Statement PreParser::ParseTryStatement(bool* ok) {
Expect(Token::RPAREN, CHECK_OK);
{
CollectExpressionsInTailPositionToListScope
- collect_expressions_in_tail_position_scope(
- function_state_, &expressions_in_tail_position_in_catch_block);
+ collect_tail_call_expressions_scope(
+ function_state_, &tail_call_expressions_in_catch_block);
BlockState block_state(&scope_, catch_scope);
Scope* block_scope = NewScope(scope_, BLOCK_SCOPE);
{
@@ -1017,12 +1010,11 @@ PreParser::Statement PreParser::ParseTryStatement(bool* ok) {
Consume(Token::FINALLY);
ParseBlock(CHECK_OK);
if (FLAG_harmony_explicit_tailcalls && catch_block_exists &&
- expressions_in_tail_position_in_catch_block.length() > 0) {
+ !tail_call_expressions_in_catch_block.is_empty()) {
// TODO(ishell): update chapter number.
// ES8 XX.YY.ZZ
- int pos = expressions_in_tail_position_in_catch_block[0].pos;
- ReportMessageAt(Scanner::Location(pos, pos + 1),
- MessageTemplate::kTailCallInCatchBlock);
+ ReportMessageAt(tail_call_expressions_in_catch_block.location(),
+ MessageTemplate::kUnexpectedTailCallInCatchBlock);
*ok = false;
return Statement::Default();
}
@@ -1159,7 +1151,7 @@ PreParserExpression PreParser::ParseClassLiteral(
bool has_extends = Check(Token::EXTENDS);
if (has_extends) {
ExpressionClassifier classifier(this);
- ParseLeftHandSideExpression(&classifier, CHECK_OK);
+ ParseLeftHandSideExpression(kDontAcceptTCE, &classifier, CHECK_OK);
ValidateExpression(&classifier, CHECK_OK);
}

Powered by Google App Engine
This is Rietveld 408576698