| Index: src/parsing/preparser.cc
|
| diff --git a/src/parsing/preparser.cc b/src/parsing/preparser.cc
|
| index 777cb1d041ab0138da6ddcad06fa7c812160eada..aa0d27ad1d58f614c86526c39a592b719dd0d875 100644
|
| --- a/src/parsing/preparser.cc
|
| +++ b/src/parsing/preparser.cc
|
| @@ -29,18 +29,14 @@ namespace internal {
|
| // thus it must never be used where only a single statement
|
| // is correct (e.g. an if statement branch w/o braces)!
|
|
|
| -#define CHECK_OK ok); \
|
| - if (!*ok) return Statement::Default(); \
|
| +#define CHECK_OK_VALUE(x) ok); \
|
| + if (!*ok) return x; \
|
| ((void)0
|
| #define DUMMY ) // to make indentation work
|
| #undef DUMMY
|
|
|
| -// Used in functions where the return type is not ExpressionT.
|
| -#define CHECK_OK_CUSTOM(x) ok); \
|
| - if (!*ok) return this->x(); \
|
| - ((void)0
|
| -#define DUMMY ) // to make indentation work
|
| -#undef DUMMY
|
| +#define CHECK_OK CHECK_OK_VALUE(Statement::Default())
|
| +#define CHECK_OK_VOID CHECK_OK_VALUE(this->Void())
|
|
|
| PreParserIdentifier PreParser::GetSymbol() const {
|
| switch (scanner()->current_token()) {
|
| @@ -75,8 +71,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 +88,10 @@ PreParser::PreParseResult PreParser::PreParseLazyFunction(
|
| DCHECK_EQ(Token::LBRACE, scanner()->current_token());
|
| bool ok = true;
|
| int start_position = peek_position();
|
| - ParseLazyFunctionLiteralBody(&ok, bookmark);
|
| + LazyParsingResult result = ParseLazyFunctionLiteralBody(may_abort, &ok);
|
| use_counts_ = nullptr;
|
| - if (bookmark && bookmark->HasBeenReset()) {
|
| - // Do nothing, as we've just aborted scanning this function.
|
| + if (result == kLazyParsingAborted) {
|
| + return kPreParseAbort;
|
| } else if (stack_overflow()) {
|
| return kPreParseStackOverflow;
|
| } else if (!ok) {
|
| @@ -107,7 +102,6 @@ PreParser::PreParseResult PreParser::PreParseLazyFunction(
|
| int end_pos = scanner()->location().end_pos;
|
| CheckStrictOctalLiteral(start_position, end_pos, &ok);
|
| CheckDecimalLiteralWithLeadingZero(use_counts, start_position, end_pos);
|
| - if (!ok) return kPreParseSuccess;
|
| }
|
| }
|
| return kPreParseSuccess;
|
| @@ -171,15 +165,12 @@ PreParser::Statement PreParser::ParseStatementListItem(bool* ok) {
|
| return ParseStatement(kAllowLabelledFunctionStatement, ok);
|
| }
|
|
|
| -
|
| -void PreParser::ParseStatementList(int end_token, bool* ok,
|
| - Scanner::BookmarkScope* bookmark) {
|
| +PreParser::LazyParsingResult 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 +180,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(CHECK_OK_VALUE(kLazyParsingComplete));
|
|
|
| if (directive_prologue) {
|
| bool use_strict_found = statement.IsUseStrictLiteral();
|
| @@ -209,7 +201,7 @@ void PreParser::ParseStatementList(int end_token, bool* ok,
|
| MessageTemplate::kIllegalLanguageModeDirective,
|
| "use strict");
|
| *ok = false;
|
| - return;
|
| + return kLazyParsingComplete;
|
| }
|
| }
|
|
|
| @@ -218,15 +210,15 @@ 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;
|
| + if (may_abort) {
|
| + if (!starts_with_identifier) {
|
| + may_abort = false;
|
| + } else if (++count_statements > kLazyParseTrialLimit) {
|
| + return kLazyParsingAborted;
|
| }
|
| - maybe_reset = false;
|
| }
|
| }
|
| + return kLazyParsingComplete;
|
| }
|
|
|
|
|
| @@ -815,8 +807,7 @@ PreParser::Statement PreParser::ParseForStatement(bool* ok) {
|
| &is_binding_pattern, &first_initializer_loc,
|
| &bindings_loc, CHECK_OK);
|
| if (is_lexical) has_lexical = true;
|
| - if (CheckInOrOf(&mode, ok)) {
|
| - if (!*ok) return Statement::Default();
|
| + if (CheckInOrOf(&mode)) {
|
| if (decl_count != 1) {
|
| ReportMessageAt(bindings_loc,
|
| MessageTemplate::kForInOfLoopMultiBindings,
|
| @@ -860,7 +851,7 @@ PreParser::Statement PreParser::ParseForStatement(bool* ok) {
|
| ExpressionClassifier classifier(this);
|
| Expression lhs = ParseExpressionCoverGrammar(false, CHECK_OK);
|
| int lhs_end_pos = scanner()->location().end_pos;
|
| - bool is_for_each = CheckInOrOf(&mode, CHECK_OK);
|
| + bool is_for_each = CheckInOrOf(&mode);
|
| bool is_destructuring = is_for_each &&
|
| (lhs->IsArrayLiteral() || lhs->IsObjectLiteral());
|
|
|
| @@ -1020,12 +1011,7 @@ PreParser::Statement PreParser::ParseDebuggerStatement(bool* ok) {
|
|
|
| // Redefinition of CHECK_OK for parsing expressions.
|
| #undef CHECK_OK
|
| -#define CHECK_OK ok); \
|
| - if (!*ok) return Expression::Default(); \
|
| - ((void)0
|
| -#define DUMMY ) // to make indentation work
|
| -#undef DUMMY
|
| -
|
| +#define CHECK_OK CHECK_OK_VALUE(Expression::Default())
|
|
|
| PreParser::Expression PreParser::ParseFunctionLiteral(
|
| Identifier function_name, Scanner::Location function_name_location,
|
| @@ -1062,7 +1048,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 +1102,12 @@ PreParser::Expression PreParser::ParseAsyncFunctionExpression(bool* ok) {
|
| return Expression::Default();
|
| }
|
|
|
| -void PreParser::ParseLazyFunctionLiteralBody(bool* ok,
|
| - Scanner::BookmarkScope* bookmark) {
|
| +PreParser::LazyParsingResult PreParser::ParseLazyFunctionLiteralBody(
|
| + bool may_abort, bool* ok) {
|
| int body_start = position();
|
| - ParseStatementList(Token::RBRACE, ok, bookmark);
|
| - if (!*ok) return;
|
| - if (bookmark && bookmark->HasBeenReset()) return;
|
| + LazyParsingResult result = ParseStatementList(
|
| + Token::RBRACE, may_abort, CHECK_OK_VALUE(kLazyParsingComplete));
|
| + if (result == kLazyParsingAborted) return result;
|
|
|
| // Position right after terminal '}'.
|
| DCHECK_EQ(Token::RBRACE, scanner()->peek());
|
| @@ -1132,6 +1118,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 kLazyParsingComplete;
|
| }
|
|
|
| PreParserExpression PreParser::ParseClassLiteral(
|
| @@ -1228,7 +1215,7 @@ void PreParser::ParseAsyncArrowSingleExpressionBody(PreParserStatementList body,
|
| scope()->ForceContextAllocation();
|
|
|
| PreParserExpression return_value =
|
| - ParseAssignmentExpression(accept_IN, CHECK_OK_CUSTOM(Void));
|
| + ParseAssignmentExpression(accept_IN, CHECK_OK_VOID);
|
|
|
| body->Add(PreParserStatement::ExpressionStatement(return_value), zone());
|
| }
|
|
|