| 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 4390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4401 language_mode(), CHECK_OK); | 4401 language_mode(), CHECK_OK); |
| 4402 } | 4402 } |
| 4403 | 4403 |
| 4404 void Parser::SkipLazyFunctionBody(int* materialized_literal_count, | 4404 void Parser::SkipLazyFunctionBody(int* materialized_literal_count, |
| 4405 int* expected_property_count, bool* ok, | 4405 int* expected_property_count, bool* ok, |
| 4406 Scanner::BookmarkScope* bookmark) { | 4406 Scanner::BookmarkScope* bookmark) { |
| 4407 DCHECK_IMPLIES(bookmark, bookmark->HasBeenSet()); | 4407 DCHECK_IMPLIES(bookmark, bookmark->HasBeenSet()); |
| 4408 if (produce_cached_parse_data()) CHECK(log_); | 4408 if (produce_cached_parse_data()) CHECK(log_); |
| 4409 | 4409 |
| 4410 int function_block_pos = position(); | 4410 int function_block_pos = position(); |
| 4411 DeclarationScope* scope = this->scope()->AsDeclarationScope(); |
| 4412 DCHECK(scope->is_function_scope()); |
| 4411 if (consume_cached_parse_data() && !cached_parse_data_->rejected()) { | 4413 if (consume_cached_parse_data() && !cached_parse_data_->rejected()) { |
| 4412 // If we have cached data, we use it to skip parsing the function body. The | 4414 // If we have cached data, we use it to skip parsing the function body. The |
| 4413 // data contains the information we need to construct the lazy function. | 4415 // data contains the information we need to construct the lazy function. |
| 4414 FunctionEntry entry = | 4416 FunctionEntry entry = |
| 4415 cached_parse_data_->GetFunctionEntry(function_block_pos); | 4417 cached_parse_data_->GetFunctionEntry(function_block_pos); |
| 4416 // Check that cached data is valid. If not, mark it as invalid (the embedder | 4418 // Check that cached data is valid. If not, mark it as invalid (the embedder |
| 4417 // handles it). Note that end position greater than end of stream is safe, | 4419 // handles it). Note that end position greater than end of stream is safe, |
| 4418 // and hard to check. | 4420 // and hard to check. |
| 4419 if (entry.is_valid() && entry.end_pos() > function_block_pos) { | 4421 if (entry.is_valid() && entry.end_pos() > function_block_pos) { |
| 4420 scanner()->SeekForward(entry.end_pos() - 1); | 4422 scanner()->SeekForward(entry.end_pos() - 1); |
| 4421 | 4423 |
| 4422 scope()->set_end_position(entry.end_pos()); | 4424 scope->set_end_position(entry.end_pos()); |
| 4423 Expect(Token::RBRACE, CHECK_OK_VOID); | 4425 Expect(Token::RBRACE, CHECK_OK_VOID); |
| 4424 total_preparse_skipped_ += scope()->end_position() - function_block_pos; | 4426 total_preparse_skipped_ += scope->end_position() - function_block_pos; |
| 4425 *materialized_literal_count = entry.literal_count(); | 4427 *materialized_literal_count = entry.literal_count(); |
| 4426 *expected_property_count = entry.property_count(); | 4428 *expected_property_count = entry.property_count(); |
| 4427 SetLanguageMode(scope(), entry.language_mode()); | 4429 SetLanguageMode(scope, entry.language_mode()); |
| 4428 if (entry.uses_super_property()) scope()->RecordSuperPropertyUsage(); | 4430 if (entry.uses_super_property()) scope->RecordSuperPropertyUsage(); |
| 4429 if (entry.calls_eval()) scope()->RecordEvalCall(); | 4431 if (entry.calls_eval()) scope->RecordEvalCall(); |
| 4430 return; | 4432 return; |
| 4431 } | 4433 } |
| 4432 cached_parse_data_->Reject(); | 4434 cached_parse_data_->Reject(); |
| 4433 } | 4435 } |
| 4434 // With no cached data, we partially parse the function, without building an | 4436 // With no cached data, we partially parse the function, without building an |
| 4435 // AST. This gathers the data needed to build a lazy function. | 4437 // AST. This gathers the data needed to build a lazy function. |
| 4436 SingletonLogger logger; | 4438 SingletonLogger logger; |
| 4437 PreParser::PreParseResult result = | 4439 PreParser::PreParseResult result = |
| 4438 ParseLazyFunctionBodyWithPreParser(&logger, bookmark); | 4440 ParseLazyFunctionBodyWithPreParser(&logger, bookmark); |
| 4439 if (bookmark && bookmark->HasBeenReset()) { | 4441 if (bookmark && bookmark->HasBeenReset()) { |
| 4440 return; // Return immediately if pre-parser devided to abort parsing. | 4442 return; // Return immediately if pre-parser devided to abort parsing. |
| 4441 } | 4443 } |
| 4442 if (result == PreParser::kPreParseStackOverflow) { | 4444 if (result == PreParser::kPreParseStackOverflow) { |
| 4443 // Propagate stack overflow. | 4445 // Propagate stack overflow. |
| 4444 set_stack_overflow(); | 4446 set_stack_overflow(); |
| 4445 *ok = false; | 4447 *ok = false; |
| 4446 return; | 4448 return; |
| 4447 } | 4449 } |
| 4448 if (logger.has_error()) { | 4450 if (logger.has_error()) { |
| 4449 ReportMessageAt(Scanner::Location(logger.start(), logger.end()), | 4451 ReportMessageAt(Scanner::Location(logger.start(), logger.end()), |
| 4450 logger.message(), logger.argument_opt(), | 4452 logger.message(), logger.argument_opt(), |
| 4451 logger.error_type()); | 4453 logger.error_type()); |
| 4452 *ok = false; | 4454 *ok = false; |
| 4453 return; | 4455 return; |
| 4454 } | 4456 } |
| 4455 scope()->set_end_position(logger.end()); | 4457 scope->set_end_position(logger.end()); |
| 4456 Expect(Token::RBRACE, CHECK_OK_VOID); | 4458 Expect(Token::RBRACE, CHECK_OK_VOID); |
| 4457 total_preparse_skipped_ += scope()->end_position() - function_block_pos; | 4459 total_preparse_skipped_ += scope->end_position() - function_block_pos; |
| 4458 *materialized_literal_count = logger.literals(); | 4460 *materialized_literal_count = logger.literals(); |
| 4459 *expected_property_count = logger.properties(); | 4461 *expected_property_count = logger.properties(); |
| 4460 SetLanguageMode(scope(), logger.language_mode()); | 4462 SetLanguageMode(scope, logger.language_mode()); |
| 4461 if (logger.uses_super_property()) { | 4463 if (logger.uses_super_property()) scope->RecordSuperPropertyUsage(); |
| 4462 scope()->RecordSuperPropertyUsage(); | 4464 if (logger.calls_eval()) scope->RecordEvalCall(); |
| 4463 } | |
| 4464 if (logger.calls_eval()) { | |
| 4465 scope()->RecordEvalCall(); | |
| 4466 } | |
| 4467 if (produce_cached_parse_data()) { | 4465 if (produce_cached_parse_data()) { |
| 4468 DCHECK(log_); | 4466 DCHECK(log_); |
| 4469 // Position right after terminal '}'. | 4467 // Position right after terminal '}'. |
| 4470 int body_end = scanner()->location().end_pos; | 4468 int body_end = scanner()->location().end_pos; |
| 4471 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, | 4469 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, |
| 4472 *expected_property_count, language_mode(), | 4470 *expected_property_count, language_mode(), |
| 4473 scope()->uses_super_property(), scope()->calls_eval()); | 4471 scope->uses_super_property(), scope->calls_eval()); |
| 4474 } | 4472 } |
| 4475 } | 4473 } |
| 4476 | 4474 |
| 4477 | 4475 |
| 4478 Statement* Parser::BuildAssertIsCoercible(Variable* var) { | 4476 Statement* Parser::BuildAssertIsCoercible(Variable* var) { |
| 4479 // if (var === null || var === undefined) | 4477 // if (var === null || var === undefined) |
| 4480 // throw /* type error kNonCoercible) */; | 4478 // throw /* type error kNonCoercible) */; |
| 4481 | 4479 |
| 4482 Expression* condition = factory()->NewBinaryOperation( | 4480 Expression* condition = factory()->NewBinaryOperation( |
| 4483 Token::OR, | 4481 Token::OR, |
| (...skipping 2434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6918 node->Print(Isolate::Current()); | 6916 node->Print(Isolate::Current()); |
| 6919 } | 6917 } |
| 6920 #endif // DEBUG | 6918 #endif // DEBUG |
| 6921 | 6919 |
| 6922 #undef CHECK_OK | 6920 #undef CHECK_OK |
| 6923 #undef CHECK_OK_VOID | 6921 #undef CHECK_OK_VOID |
| 6924 #undef CHECK_FAILED | 6922 #undef CHECK_FAILED |
| 6925 | 6923 |
| 6926 } // namespace internal | 6924 } // namespace internal |
| 6927 } // namespace v8 | 6925 } // namespace v8 |
| OLD | NEW |