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

Side by Side Diff: src/parsing/parser.cc

Issue 2297733002: [parser] Refactor bookmark in SkipLazyFunctionBody (Closed)
Patch Set: Fix error with UNREACHABLE Created 4 years, 3 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 unified diff | Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698