| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/ast/ast-expression-rewriter.h" | 10 #include "src/ast/ast-expression-rewriter.h" |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 | 270 |
| 271 | 271 |
| 272 // ---------------------------------------------------------------------------- | 272 // ---------------------------------------------------------------------------- |
| 273 // The CHECK_OK macro is a convenient macro to enforce error | 273 // The CHECK_OK macro is a convenient macro to enforce error |
| 274 // handling for functions that may fail (by returning !*ok). | 274 // handling for functions that may fail (by returning !*ok). |
| 275 // | 275 // |
| 276 // CAUTION: This macro appends extra statements after a call, | 276 // CAUTION: This macro appends extra statements after a call, |
| 277 // thus it must never be used where only a single statement | 277 // thus it must never be used where only a single statement |
| 278 // is correct (e.g. an if statement branch w/o braces)! | 278 // is correct (e.g. an if statement branch w/o braces)! |
| 279 | 279 |
| 280 #define CHECK_OK ok); \ | 280 #define CHECK_OK_VALUE(x) ok); \ |
| 281 if (!*ok) return nullptr; \ | 281 if (!*ok) return x; \ |
| 282 ((void)0 | 282 ((void)0 |
| 283 #define DUMMY ) // to make indentation work | 283 #define DUMMY ) // to make indentation work |
| 284 #undef DUMMY | 284 #undef DUMMY |
| 285 | 285 |
| 286 #define CHECK_OK_VOID ok); \ | 286 #define CHECK_OK CHECK_OK_VALUE(nullptr) |
| 287 if (!*ok) return; \ | 287 #define CHECK_OK_VOID CHECK_OK_VALUE(this->Void()) |
| 288 ((void)0 | |
| 289 #define DUMMY ) // to make indentation work | |
| 290 #undef DUMMY | |
| 291 | 288 |
| 292 #define CHECK_FAILED /**/); \ | 289 #define CHECK_FAILED /**/); \ |
| 293 if (failed_) return nullptr; \ | 290 if (failed_) return nullptr; \ |
| 294 ((void)0 | 291 ((void)0 |
| 295 #define DUMMY ) // to make indentation work | 292 #define DUMMY ) // to make indentation work |
| 296 #undef DUMMY | 293 #undef DUMMY |
| 297 | 294 |
| 298 // ---------------------------------------------------------------------------- | 295 // ---------------------------------------------------------------------------- |
| 299 // Implementation of Parser | 296 // Implementation of Parser |
| 300 | 297 |
| (...skipping 2947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3248 if (peek() != Token::SEMICOLON) { | 3245 if (peek() != Token::SEMICOLON) { |
| 3249 if (peek() == Token::VAR || peek() == Token::CONST || | 3246 if (peek() == Token::VAR || peek() == Token::CONST || |
| 3250 (peek() == Token::LET && IsNextLetKeyword())) { | 3247 (peek() == Token::LET && IsNextLetKeyword())) { |
| 3251 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, | 3248 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, |
| 3252 CHECK_OK); | 3249 CHECK_OK); |
| 3253 | 3250 |
| 3254 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; | 3251 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; |
| 3255 int each_beg_pos = scanner()->location().beg_pos; | 3252 int each_beg_pos = scanner()->location().beg_pos; |
| 3256 int each_end_pos = scanner()->location().end_pos; | 3253 int each_end_pos = scanner()->location().end_pos; |
| 3257 | 3254 |
| 3258 if (CheckInOrOf(&mode, ok)) { | 3255 if (CheckInOrOf(&mode)) { |
| 3259 if (!*ok) return nullptr; | |
| 3260 if (parsing_result.declarations.length() != 1) { | 3256 if (parsing_result.declarations.length() != 1) { |
| 3261 ReportMessageAt(parsing_result.bindings_loc, | 3257 ReportMessageAt(parsing_result.bindings_loc, |
| 3262 MessageTemplate::kForInOfLoopMultiBindings, | 3258 MessageTemplate::kForInOfLoopMultiBindings, |
| 3263 ForEachStatement::VisitModeString(mode)); | 3259 ForEachStatement::VisitModeString(mode)); |
| 3264 *ok = false; | 3260 *ok = false; |
| 3265 return nullptr; | 3261 return nullptr; |
| 3266 } | 3262 } |
| 3267 DeclarationParsingResult::Declaration& decl = | 3263 DeclarationParsingResult::Declaration& decl = |
| 3268 parsing_result.declarations[0]; | 3264 parsing_result.declarations[0]; |
| 3269 if (parsing_result.first_initializer_loc.IsValid() && | 3265 if (parsing_result.first_initializer_loc.IsValid() && |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3443 &parsing_result, bound_names_are_lexical ? &bound_names : nullptr, | 3439 &parsing_result, bound_names_are_lexical ? &bound_names : nullptr, |
| 3444 CHECK_OK); | 3440 CHECK_OK); |
| 3445 } | 3441 } |
| 3446 } else { | 3442 } else { |
| 3447 int lhs_beg_pos = peek_position(); | 3443 int lhs_beg_pos = peek_position(); |
| 3448 ExpressionClassifier classifier(this); | 3444 ExpressionClassifier classifier(this); |
| 3449 Expression* expression = ParseExpressionCoverGrammar(false, CHECK_OK); | 3445 Expression* expression = ParseExpressionCoverGrammar(false, CHECK_OK); |
| 3450 int lhs_end_pos = scanner()->location().end_pos; | 3446 int lhs_end_pos = scanner()->location().end_pos; |
| 3451 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; | 3447 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; |
| 3452 | 3448 |
| 3453 bool is_for_each = CheckInOrOf(&mode, CHECK_OK); | 3449 bool is_for_each = CheckInOrOf(&mode); |
| 3454 bool is_destructuring = is_for_each && (expression->IsArrayLiteral() || | 3450 bool is_destructuring = is_for_each && (expression->IsArrayLiteral() || |
| 3455 expression->IsObjectLiteral()); | 3451 expression->IsObjectLiteral()); |
| 3456 | 3452 |
| 3457 if (is_destructuring) { | 3453 if (is_destructuring) { |
| 3458 ValidateAssignmentPattern(CHECK_OK); | 3454 ValidateAssignmentPattern(CHECK_OK); |
| 3459 } else { | 3455 } else { |
| 3460 RewriteNonPattern(CHECK_OK); | 3456 RewriteNonPattern(CHECK_OK); |
| 3461 } | 3457 } |
| 3462 | 3458 |
| 3463 if (is_for_each) { | 3459 if (is_for_each) { |
| (...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3957 | 3953 |
| 3958 CheckArityRestrictions(arity, kind, formals.has_rest, start_position, | 3954 CheckArityRestrictions(arity, kind, formals.has_rest, start_position, |
| 3959 formals_end_position, CHECK_OK); | 3955 formals_end_position, CHECK_OK); |
| 3960 Expect(Token::LBRACE, CHECK_OK); | 3956 Expect(Token::LBRACE, CHECK_OK); |
| 3961 // Don't include the rest parameter into the function's formal parameter | 3957 // Don't include the rest parameter into the function's formal parameter |
| 3962 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count, | 3958 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count, |
| 3963 // which says whether we need to create an arguments adaptor frame). | 3959 // which says whether we need to create an arguments adaptor frame). |
| 3964 if (formals.has_rest) arity--; | 3960 if (formals.has_rest) arity--; |
| 3965 | 3961 |
| 3966 // Eager or lazy parse? | 3962 // Eager or lazy parse? |
| 3967 // If is_lazily_parsed, we'll parse lazy. If we can set a bookmark, we'll | 3963 // If is_lazily_parsed, we'll parse lazily. We'll call SkipLazyFunctionBody, |
| 3968 // pass it to SkipLazyFunctionBody, which may use it to abort lazy | 3964 // which may decide to abort lazy parsing if it suspects that wasn't a good |
| 3969 // parsing if it suspect that wasn't a good idea. If so, or if we didn't | 3965 // idea. If so (in which case the parser is expected to have backtracked), |
| 3970 // try to lazy parse in the first place, we'll have to parse eagerly. | 3966 // or if we didn't try to lazy parse in the first place, we'll have to parse |
| 3971 Scanner::BookmarkScope bookmark(scanner()); | 3967 // eagerly. |
| 3972 if (is_lazily_parsed) { | 3968 if (is_lazily_parsed) { |
| 3973 Scanner::BookmarkScope* maybe_bookmark = | 3969 Scanner::BookmarkScope bookmark(scanner()); |
| 3974 bookmark.Set() ? &bookmark : nullptr; | 3970 bool may_abort = bookmark.Set(); |
| 3975 SkipLazyFunctionBody(&materialized_literal_count, | 3971 LazyParsingResult result = |
| 3976 &expected_property_count, /*CHECK_OK*/ ok, | 3972 SkipLazyFunctionBody(&materialized_literal_count, |
| 3977 maybe_bookmark); | 3973 &expected_property_count, may_abort, CHECK_OK); |
| 3978 | 3974 |
| 3979 materialized_literal_count += formals.materialized_literals_count + | 3975 materialized_literal_count += formals.materialized_literals_count + |
| 3980 function_state.materialized_literal_count(); | 3976 function_state.materialized_literal_count(); |
| 3981 | 3977 |
| 3982 if (bookmark.HasBeenReset()) { | 3978 if (result == kLazyParsingAborted) { |
| 3979 bookmark.Reset(); |
| 3983 // Trigger eager (re-)parsing, just below this block. | 3980 // Trigger eager (re-)parsing, just below this block. |
| 3984 is_lazily_parsed = false; | 3981 is_lazily_parsed = false; |
| 3985 | 3982 |
| 3986 // This is probably an initialization function. Inform the compiler it | 3983 // This is probably an initialization function. Inform the compiler it |
| 3987 // should also eager-compile this function, and that we expect it to be | 3984 // should also eager-compile this function, and that we expect it to be |
| 3988 // used once. | 3985 // used once. |
| 3989 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; | 3986 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; |
| 3990 should_be_used_once_hint = true; | 3987 should_be_used_once_hint = true; |
| 3991 } | 3988 } |
| 3992 } | 3989 } |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4072 name = ParseIdentifierOrStrictReservedWord(FunctionKind::kAsyncFunction, | 4069 name = ParseIdentifierOrStrictReservedWord(FunctionKind::kAsyncFunction, |
| 4073 &is_strict_reserved, CHECK_OK); | 4070 &is_strict_reserved, CHECK_OK); |
| 4074 } | 4071 } |
| 4075 return ParseFunctionLiteral(name, scanner()->location(), | 4072 return ParseFunctionLiteral(name, scanner()->location(), |
| 4076 is_strict_reserved ? kFunctionNameIsStrictReserved | 4073 is_strict_reserved ? kFunctionNameIsStrictReserved |
| 4077 : kFunctionNameValidityUnknown, | 4074 : kFunctionNameValidityUnknown, |
| 4078 FunctionKind::kAsyncFunction, pos, type, | 4075 FunctionKind::kAsyncFunction, pos, type, |
| 4079 language_mode(), CHECK_OK); | 4076 language_mode(), CHECK_OK); |
| 4080 } | 4077 } |
| 4081 | 4078 |
| 4082 void Parser::SkipLazyFunctionBody(int* materialized_literal_count, | 4079 Parser::LazyParsingResult Parser::SkipLazyFunctionBody( |
| 4083 int* expected_property_count, bool* ok, | 4080 int* materialized_literal_count, int* expected_property_count, |
| 4084 Scanner::BookmarkScope* bookmark) { | 4081 bool may_abort, bool* ok) { |
| 4085 DCHECK_IMPLIES(bookmark, bookmark->HasBeenSet()); | |
| 4086 if (produce_cached_parse_data()) CHECK(log_); | 4082 if (produce_cached_parse_data()) CHECK(log_); |
| 4087 | 4083 |
| 4088 int function_block_pos = position(); | 4084 int function_block_pos = position(); |
| 4089 DeclarationScope* scope = this->scope()->AsDeclarationScope(); | 4085 DeclarationScope* scope = this->scope()->AsDeclarationScope(); |
| 4090 DCHECK(scope->is_function_scope()); | 4086 DCHECK(scope->is_function_scope()); |
| 4091 if (consume_cached_parse_data() && !cached_parse_data_->rejected()) { | 4087 if (consume_cached_parse_data() && !cached_parse_data_->rejected()) { |
| 4092 // If we have cached data, we use it to skip parsing the function body. The | 4088 // If we have cached data, we use it to skip parsing the function body. The |
| 4093 // data contains the information we need to construct the lazy function. | 4089 // data contains the information we need to construct the lazy function. |
| 4094 FunctionEntry entry = | 4090 FunctionEntry entry = |
| 4095 cached_parse_data_->GetFunctionEntry(function_block_pos); | 4091 cached_parse_data_->GetFunctionEntry(function_block_pos); |
| 4096 // Check that cached data is valid. If not, mark it as invalid (the embedder | 4092 // Check that cached data is valid. If not, mark it as invalid (the embedder |
| 4097 // handles it). Note that end position greater than end of stream is safe, | 4093 // handles it). Note that end position greater than end of stream is safe, |
| 4098 // and hard to check. | 4094 // and hard to check. |
| 4099 if (entry.is_valid() && entry.end_pos() > function_block_pos) { | 4095 if (entry.is_valid() && entry.end_pos() > function_block_pos) { |
| 4100 scanner()->SeekForward(entry.end_pos() - 1); | 4096 scanner()->SeekForward(entry.end_pos() - 1); |
| 4101 | 4097 |
| 4102 scope->set_end_position(entry.end_pos()); | 4098 scope->set_end_position(entry.end_pos()); |
| 4103 Expect(Token::RBRACE, CHECK_OK_VOID); | 4099 Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete)); |
| 4104 total_preparse_skipped_ += scope->end_position() - function_block_pos; | 4100 total_preparse_skipped_ += scope->end_position() - function_block_pos; |
| 4105 *materialized_literal_count = entry.literal_count(); | 4101 *materialized_literal_count = entry.literal_count(); |
| 4106 *expected_property_count = entry.property_count(); | 4102 *expected_property_count = entry.property_count(); |
| 4107 SetLanguageMode(scope, entry.language_mode()); | 4103 SetLanguageMode(scope, entry.language_mode()); |
| 4108 if (entry.uses_super_property()) scope->RecordSuperPropertyUsage(); | 4104 if (entry.uses_super_property()) scope->RecordSuperPropertyUsage(); |
| 4109 if (entry.calls_eval()) scope->RecordEvalCall(); | 4105 if (entry.calls_eval()) scope->RecordEvalCall(); |
| 4110 return; | 4106 return kLazyParsingComplete; |
| 4111 } | 4107 } |
| 4112 cached_parse_data_->Reject(); | 4108 cached_parse_data_->Reject(); |
| 4113 } | 4109 } |
| 4114 // With no cached data, we partially parse the function, without building an | 4110 // With no cached data, we partially parse the function, without building an |
| 4115 // AST. This gathers the data needed to build a lazy function. | 4111 // AST. This gathers the data needed to build a lazy function. |
| 4116 SingletonLogger logger; | 4112 SingletonLogger logger; |
| 4117 PreParser::PreParseResult result = | 4113 PreParser::PreParseResult result = |
| 4118 ParseLazyFunctionBodyWithPreParser(&logger, bookmark); | 4114 ParseLazyFunctionBodyWithPreParser(&logger, may_abort); |
| 4119 if (bookmark && bookmark->HasBeenReset()) { | 4115 // Return immediately if pre-parser decided to abort parsing. |
| 4120 return; // Return immediately if pre-parser devided to abort parsing. | 4116 if (result == PreParser::kPreParseAbort) { |
| 4117 return kLazyParsingAborted; |
| 4121 } | 4118 } |
| 4122 if (result == PreParser::kPreParseStackOverflow) { | 4119 if (result == PreParser::kPreParseStackOverflow) { |
| 4123 // Propagate stack overflow. | 4120 // Propagate stack overflow. |
| 4124 set_stack_overflow(); | 4121 set_stack_overflow(); |
| 4125 *ok = false; | 4122 *ok = false; |
| 4126 return; | 4123 return kLazyParsingComplete; |
| 4127 } | 4124 } |
| 4128 if (logger.has_error()) { | 4125 if (logger.has_error()) { |
| 4129 ReportMessageAt(Scanner::Location(logger.start(), logger.end()), | 4126 ReportMessageAt(Scanner::Location(logger.start(), logger.end()), |
| 4130 logger.message(), logger.argument_opt(), | 4127 logger.message(), logger.argument_opt(), |
| 4131 logger.error_type()); | 4128 logger.error_type()); |
| 4132 *ok = false; | 4129 *ok = false; |
| 4133 return; | 4130 return kLazyParsingComplete; |
| 4134 } | 4131 } |
| 4135 scope->set_end_position(logger.end()); | 4132 scope->set_end_position(logger.end()); |
| 4136 Expect(Token::RBRACE, CHECK_OK_VOID); | 4133 Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete)); |
| 4137 total_preparse_skipped_ += scope->end_position() - function_block_pos; | 4134 total_preparse_skipped_ += scope->end_position() - function_block_pos; |
| 4138 *materialized_literal_count = logger.literals(); | 4135 *materialized_literal_count = logger.literals(); |
| 4139 *expected_property_count = logger.properties(); | 4136 *expected_property_count = logger.properties(); |
| 4140 SetLanguageMode(scope, logger.language_mode()); | 4137 SetLanguageMode(scope, logger.language_mode()); |
| 4141 if (logger.uses_super_property()) scope->RecordSuperPropertyUsage(); | 4138 if (logger.uses_super_property()) scope->RecordSuperPropertyUsage(); |
| 4142 if (logger.calls_eval()) scope->RecordEvalCall(); | 4139 if (logger.calls_eval()) scope->RecordEvalCall(); |
| 4143 if (produce_cached_parse_data()) { | 4140 if (produce_cached_parse_data()) { |
| 4144 DCHECK(log_); | 4141 DCHECK(log_); |
| 4145 // Position right after terminal '}'. | 4142 // Position right after terminal '}'. |
| 4146 int body_end = scanner()->location().end_pos; | 4143 int body_end = scanner()->location().end_pos; |
| 4147 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, | 4144 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, |
| 4148 *expected_property_count, language_mode(), | 4145 *expected_property_count, language_mode(), |
| 4149 scope->uses_super_property(), scope->calls_eval()); | 4146 scope->uses_super_property(), scope->calls_eval()); |
| 4150 } | 4147 } |
| 4148 return kLazyParsingComplete; |
| 4151 } | 4149 } |
| 4152 | 4150 |
| 4153 | 4151 |
| 4154 Statement* Parser::BuildAssertIsCoercible(Variable* var) { | 4152 Statement* Parser::BuildAssertIsCoercible(Variable* var) { |
| 4155 // if (var === null || var === undefined) | 4153 // if (var === null || var === undefined) |
| 4156 // throw /* type error kNonCoercible) */; | 4154 // throw /* type error kNonCoercible) */; |
| 4157 | 4155 |
| 4158 Expression* condition = factory()->NewBinaryOperation( | 4156 Expression* condition = factory()->NewBinaryOperation( |
| 4159 Token::OR, | 4157 Token::OR, |
| 4160 factory()->NewCompareOperation( | 4158 factory()->NewCompareOperation( |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4592 factory()->NewAssignment(Token::INIT, fproxy, | 4590 factory()->NewAssignment(Token::INIT, fproxy, |
| 4593 factory()->NewThisFunction(pos), | 4591 factory()->NewThisFunction(pos), |
| 4594 kNoSourcePosition), | 4592 kNoSourcePosition), |
| 4595 kNoSourcePosition)); | 4593 kNoSourcePosition)); |
| 4596 } | 4594 } |
| 4597 | 4595 |
| 4598 MarkCollectedTailCallExpressions(); | 4596 MarkCollectedTailCallExpressions(); |
| 4599 return result; | 4597 return result; |
| 4600 } | 4598 } |
| 4601 | 4599 |
| 4602 | |
| 4603 PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( | 4600 PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
| 4604 SingletonLogger* logger, Scanner::BookmarkScope* bookmark) { | 4601 SingletonLogger* logger, bool may_abort) { |
| 4605 // This function may be called on a background thread too; record only the | 4602 // This function may be called on a background thread too; record only the |
| 4606 // main thread preparse times. | 4603 // main thread preparse times. |
| 4607 if (pre_parse_timer_ != NULL) { | 4604 if (pre_parse_timer_ != NULL) { |
| 4608 pre_parse_timer_->Start(); | 4605 pre_parse_timer_->Start(); |
| 4609 } | 4606 } |
| 4610 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.PreParse"); | 4607 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.PreParse"); |
| 4611 | 4608 |
| 4612 DCHECK_EQ(Token::LBRACE, scanner()->current_token()); | 4609 DCHECK_EQ(Token::LBRACE, scanner()->current_token()); |
| 4613 | 4610 |
| 4614 if (reusable_preparser_ == NULL) { | 4611 if (reusable_preparser_ == NULL) { |
| 4615 reusable_preparser_ = new PreParser(zone(), &scanner_, ast_value_factory(), | 4612 reusable_preparser_ = new PreParser(zone(), &scanner_, ast_value_factory(), |
| 4616 NULL, stack_limit_); | 4613 NULL, stack_limit_); |
| 4617 reusable_preparser_->set_allow_lazy(true); | 4614 reusable_preparser_->set_allow_lazy(true); |
| 4618 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name()); | 4615 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name()); |
| 4619 SET_ALLOW(natives); | 4616 SET_ALLOW(natives); |
| 4620 SET_ALLOW(harmony_do_expressions); | 4617 SET_ALLOW(harmony_do_expressions); |
| 4621 SET_ALLOW(harmony_for_in); | 4618 SET_ALLOW(harmony_for_in); |
| 4622 SET_ALLOW(harmony_function_sent); | 4619 SET_ALLOW(harmony_function_sent); |
| 4623 SET_ALLOW(harmony_restrictive_declarations); | 4620 SET_ALLOW(harmony_restrictive_declarations); |
| 4624 SET_ALLOW(harmony_async_await); | 4621 SET_ALLOW(harmony_async_await); |
| 4625 SET_ALLOW(harmony_trailing_commas); | 4622 SET_ALLOW(harmony_trailing_commas); |
| 4626 #undef SET_ALLOW | 4623 #undef SET_ALLOW |
| 4627 } | 4624 } |
| 4628 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( | 4625 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
| 4629 language_mode(), function_state_->kind(), | 4626 language_mode(), function_state_->kind(), |
| 4630 scope()->AsDeclarationScope()->has_simple_parameters(), parsing_module_, | 4627 scope()->AsDeclarationScope()->has_simple_parameters(), parsing_module_, |
| 4631 logger, bookmark, use_counts_); | 4628 logger, may_abort, use_counts_); |
| 4632 if (pre_parse_timer_ != NULL) { | 4629 if (pre_parse_timer_ != NULL) { |
| 4633 pre_parse_timer_->Stop(); | 4630 pre_parse_timer_->Stop(); |
| 4634 } | 4631 } |
| 4635 return result; | 4632 return result; |
| 4636 } | 4633 } |
| 4637 | 4634 |
| 4638 Expression* Parser::ParseClassLiteral(const AstRawString* name, | 4635 Expression* Parser::ParseClassLiteral(const AstRawString* name, |
| 4639 Scanner::Location class_name_location, | 4636 Scanner::Location class_name_location, |
| 4640 bool name_is_strict_reserved, int pos, | 4637 bool name_is_strict_reserved, int pos, |
| 4641 bool* ok) { | 4638 bool* ok) { |
| (...skipping 1992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6634 node->Print(Isolate::Current()); | 6631 node->Print(Isolate::Current()); |
| 6635 } | 6632 } |
| 6636 #endif // DEBUG | 6633 #endif // DEBUG |
| 6637 | 6634 |
| 6638 #undef CHECK_OK | 6635 #undef CHECK_OK |
| 6639 #undef CHECK_OK_VOID | 6636 #undef CHECK_OK_VOID |
| 6640 #undef CHECK_FAILED | 6637 #undef CHECK_FAILED |
| 6641 | 6638 |
| 6642 } // namespace internal | 6639 } // namespace internal |
| 6643 } // namespace v8 | 6640 } // namespace v8 |
| OLD | NEW |