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

Unified Diff: src/parsing/preparser.cc

Issue 2297733002: [parser] Refactor bookmark in SkipLazyFunctionBody (Closed)
Patch Set: Created 4 years, 4 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
« src/parsing/preparser.h ('K') | « src/parsing/preparser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parsing/preparser.cc
diff --git a/src/parsing/preparser.cc b/src/parsing/preparser.cc
index 0ca7e3dd66df8241e98e1fb2e87929190cb6f92c..1037a95bcc5c526d97da8fec0b5044978ed917e3 100644
--- a/src/parsing/preparser.cc
+++ b/src/parsing/preparser.cc
@@ -75,8 +75,7 @@ PreParserIdentifier PreParser::GetSymbol() const {
PreParser::PreParseResult PreParser::PreParseLazyFunction(
LanguageMode language_mode, FunctionKind kind, bool has_simple_parameters,
- bool parsing_module, ParserRecorder* log, Scanner::BookmarkScope* bookmark,
- int* use_counts) {
+ bool parsing_module, ParserRecorder* log, bool may_abort, int* use_counts) {
parsing_module_ = parsing_module;
log_ = log;
use_counts_ = use_counts;
@@ -93,10 +92,10 @@ PreParser::PreParseResult PreParser::PreParseLazyFunction(
DCHECK_EQ(Token::LBRACE, scanner()->current_token());
bool ok = true;
int start_position = peek_position();
- ParseLazyFunctionLiteralBody(&ok, bookmark);
+ bool aborted = ParseLazyFunctionLiteralBody(may_abort, &ok);
use_counts_ = nullptr;
- if (bookmark && bookmark->HasBeenReset()) {
- // Do nothing, as we've just aborted scanning this function.
+ if (aborted) {
+ return kPreParseAbort;
} else if (stack_overflow()) {
return kPreParseStackOverflow;
} else if (!ok) {
@@ -171,15 +170,10 @@ PreParser::Statement PreParser::ParseStatementListItem(bool* ok) {
return ParseStatement(kAllowLabelledFunctionStatement, ok);
}
-
-void PreParser::ParseStatementList(int end_token, bool* ok,
- Scanner::BookmarkScope* bookmark) {
+bool PreParser::ParseStatementList(int end_token, bool may_abort, bool* ok) {
// SourceElements ::
// (Statement)* <end_token>
- // Bookkeeping for trial parse if bookmark is set:
- DCHECK_IMPLIES(bookmark, bookmark->HasBeenSet());
- bool maybe_reset = bookmark != nullptr;
int count_statements = 0;
bool directive_prologue = true;
@@ -189,7 +183,8 @@ void PreParser::ParseStatementList(int end_token, bool* ok,
}
bool starts_with_identifier = peek() == Token::IDENTIFIER;
Scanner::Location token_loc = scanner()->peek_location();
- Statement statement = ParseStatementListItem(CHECK_OK_CUSTOM(Void));
+ Statement statement = ParseStatementListItem(ok);
+ if (!*ok) return false;
if (directive_prologue) {
bool use_strict_found = statement.IsUseStrictLiteral();
@@ -209,7 +204,7 @@ void PreParser::ParseStatementList(int end_token, bool* ok,
MessageTemplate::kIllegalLanguageModeDirective,
"use strict");
*ok = false;
- return;
+ return false;
}
}
@@ -218,15 +213,14 @@ void PreParser::ParseStatementList(int end_token, bool* ok,
// Our current definition of 'long and trivial' is:
// - over 200 statements
// - all starting with an identifier (i.e., no if, for, while, etc.)
- if (maybe_reset && (!starts_with_identifier ||
- ++count_statements > kLazyParseTrialLimit)) {
- if (count_statements > kLazyParseTrialLimit) {
- bookmark->Reset();
- return;
- }
- maybe_reset = false;
+ if (may_abort) {
+ if (!starts_with_identifier)
adamk 2016/08/30 22:13:14 Please add curly braces around the if/else stateme
nickie 2016/08/31 13:23:36 Done.
+ may_abort = false;
+ else if (++count_statements > kLazyParseTrialLimit)
+ return true;
}
}
+ return false;
}
@@ -1062,7 +1056,7 @@ PreParser::Expression PreParser::ParseFunctionLiteral(
Expect(Token::LBRACE, CHECK_OK);
if (is_lazily_parsed) {
- ParseLazyFunctionLiteralBody(CHECK_OK);
+ ParseLazyFunctionLiteralBody(false, CHECK_OK);
} else {
ParseStatementList(Token::RBRACE, CHECK_OK);
}
@@ -1116,12 +1110,11 @@ PreParser::Expression PreParser::ParseAsyncFunctionExpression(bool* ok) {
return Expression::Default();
}
-void PreParser::ParseLazyFunctionLiteralBody(bool* ok,
- Scanner::BookmarkScope* bookmark) {
+bool PreParser::ParseLazyFunctionLiteralBody(bool may_abort, bool* ok) {
int body_start = position();
- ParseStatementList(Token::RBRACE, ok, bookmark);
- if (!*ok) return;
- if (bookmark && bookmark->HasBeenReset()) return;
+ bool aborted = ParseStatementList(Token::RBRACE, may_abort, ok);
+ if (!*ok) return false;
+ if (aborted) return true;
adamk 2016/08/30 22:13:14 And having gotten this far I also think it would b
nickie 2016/08/31 13:23:36 Done.
// Position right after terminal '}'.
DCHECK_EQ(Token::RBRACE, scanner()->peek());
@@ -1132,6 +1125,7 @@ void PreParser::ParseLazyFunctionLiteralBody(bool* ok,
function_state_->materialized_literal_count(),
function_state_->expected_property_count(), language_mode(),
scope->uses_super_property(), scope->calls_eval());
+ return false;
}
PreParserExpression PreParser::ParseClassLiteral(
« src/parsing/preparser.h ('K') | « src/parsing/preparser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698