OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 4344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4355 expected_property_count = entry.property_count(); | 4355 expected_property_count = entry.property_count(); |
4356 top_scope_->SetLanguageMode(entry.language_mode()); | 4356 top_scope_->SetLanguageMode(entry.language_mode()); |
4357 } else { | 4357 } else { |
4358 is_lazily_compiled = false; | 4358 is_lazily_compiled = false; |
4359 } | 4359 } |
4360 } else { | 4360 } else { |
4361 // With no preparser data, we partially parse the function, without | 4361 // With no preparser data, we partially parse the function, without |
4362 // building an AST. This gathers the data needed to build a lazy | 4362 // building an AST. This gathers the data needed to build a lazy |
4363 // function. | 4363 // function. |
4364 SingletonLogger logger; | 4364 SingletonLogger logger; |
4365 preparser::PreParser::PreParseResult result = | 4365 PreParser::PreParseResult result = LazyParseFunctionLiteral(&logger); |
4366 LazyParseFunctionLiteral(&logger); | 4366 if (result == PreParser::kPreParseStackOverflow) { |
4367 if (result == preparser::PreParser::kPreParseStackOverflow) { | |
4368 // Propagate stack overflow. | 4367 // Propagate stack overflow. |
4369 stack_overflow_ = true; | 4368 stack_overflow_ = true; |
4370 *ok = false; | 4369 *ok = false; |
4371 return NULL; | 4370 return NULL; |
4372 } | 4371 } |
4373 if (logger.has_error()) { | 4372 if (logger.has_error()) { |
4374 const char* arg = logger.argument_opt(); | 4373 const char* arg = logger.argument_opt(); |
4375 Vector<const char*> args; | 4374 Vector<const char*> args; |
4376 if (arg != NULL) { | 4375 if (arg != NULL) { |
4377 args = Vector<const char*>(&arg, 1); | 4376 args = Vector<const char*>(&arg, 1); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4514 generator); | 4513 generator); |
4515 function_literal->set_function_token_position(function_token_position); | 4514 function_literal->set_function_token_position(function_token_position); |
4516 function_literal->set_ast_properties(&ast_properties); | 4515 function_literal->set_ast_properties(&ast_properties); |
4517 function_literal->set_dont_optimize_reason(dont_optimize_reason); | 4516 function_literal->set_dont_optimize_reason(dont_optimize_reason); |
4518 | 4517 |
4519 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); | 4518 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); |
4520 return function_literal; | 4519 return function_literal; |
4521 } | 4520 } |
4522 | 4521 |
4523 | 4522 |
4524 preparser::PreParser::PreParseResult Parser::LazyParseFunctionLiteral( | 4523 PreParser::PreParseResult Parser::LazyParseFunctionLiteral( |
4525 SingletonLogger* logger) { | 4524 SingletonLogger* logger) { |
4526 HistogramTimerScope preparse_scope(isolate()->counters()->pre_parse()); | 4525 HistogramTimerScope preparse_scope(isolate()->counters()->pre_parse()); |
4527 ASSERT_EQ(Token::LBRACE, scanner().current_token()); | 4526 ASSERT_EQ(Token::LBRACE, scanner().current_token()); |
4528 | 4527 |
4529 if (reusable_preparser_ == NULL) { | 4528 if (reusable_preparser_ == NULL) { |
4530 intptr_t stack_limit = isolate()->stack_guard()->real_climit(); | 4529 intptr_t stack_limit = isolate()->stack_guard()->real_climit(); |
4531 reusable_preparser_ = new preparser::PreParser(&scanner_, | 4530 reusable_preparser_ = new PreParser(&scanner_, NULL, stack_limit); |
4532 NULL, | |
4533 stack_limit); | |
4534 reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping()); | 4531 reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping()); |
4535 reusable_preparser_->set_allow_modules(allow_modules()); | 4532 reusable_preparser_->set_allow_modules(allow_modules()); |
4536 reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax()); | 4533 reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax()); |
4537 reusable_preparser_->set_allow_lazy(true); | 4534 reusable_preparser_->set_allow_lazy(true); |
4538 reusable_preparser_->set_allow_generators(allow_generators()); | 4535 reusable_preparser_->set_allow_generators(allow_generators()); |
4539 reusable_preparser_->set_allow_for_of(allow_for_of()); | 4536 reusable_preparser_->set_allow_for_of(allow_for_of()); |
4540 reusable_preparser_->set_allow_harmony_numeric_literals( | 4537 reusable_preparser_->set_allow_harmony_numeric_literals( |
4541 allow_harmony_numeric_literals()); | 4538 allow_harmony_numeric_literals()); |
4542 } | 4539 } |
4543 preparser::PreParser::PreParseResult result = | 4540 PreParser::PreParseResult result = |
4544 reusable_preparser_->PreParseLazyFunction(top_scope_->language_mode(), | 4541 reusable_preparser_->PreParseLazyFunction(top_scope_->language_mode(), |
4545 is_generator(), | 4542 is_generator(), |
4546 logger); | 4543 logger); |
4547 return result; | 4544 return result; |
4548 } | 4545 } |
4549 | 4546 |
4550 | 4547 |
4551 Expression* Parser::ParseV8Intrinsic(bool* ok) { | 4548 Expression* Parser::ParseV8Intrinsic(bool* ok) { |
4552 // CallRuntime :: | 4549 // CallRuntime :: |
4553 // '%' Identifier Arguments | 4550 // '%' Identifier Arguments |
(...skipping 1242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5796 } | 5793 } |
5797 | 5794 |
5798 | 5795 |
5799 // Create a Scanner for the preparser to use as input, and preparse the source. | 5796 // Create a Scanner for the preparser to use as input, and preparse the source. |
5800 ScriptDataImpl* PreParserApi::PreParse(Isolate* isolate, | 5797 ScriptDataImpl* PreParserApi::PreParse(Isolate* isolate, |
5801 Utf16CharacterStream* source) { | 5798 Utf16CharacterStream* source) { |
5802 CompleteParserRecorder recorder; | 5799 CompleteParserRecorder recorder; |
5803 HistogramTimerScope timer(isolate->counters()->pre_parse()); | 5800 HistogramTimerScope timer(isolate->counters()->pre_parse()); |
5804 Scanner scanner(isolate->unicode_cache()); | 5801 Scanner scanner(isolate->unicode_cache()); |
5805 intptr_t stack_limit = isolate->stack_guard()->real_climit(); | 5802 intptr_t stack_limit = isolate->stack_guard()->real_climit(); |
5806 preparser::PreParser preparser(&scanner, &recorder, stack_limit); | 5803 PreParser preparser(&scanner, &recorder, stack_limit); |
5807 preparser.set_allow_lazy(true); | 5804 preparser.set_allow_lazy(true); |
5808 preparser.set_allow_generators(FLAG_harmony_generators); | 5805 preparser.set_allow_generators(FLAG_harmony_generators); |
5809 preparser.set_allow_for_of(FLAG_harmony_iteration); | 5806 preparser.set_allow_for_of(FLAG_harmony_iteration); |
5810 preparser.set_allow_harmony_scoping(FLAG_harmony_scoping); | 5807 preparser.set_allow_harmony_scoping(FLAG_harmony_scoping); |
5811 preparser.set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); | 5808 preparser.set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); |
5812 scanner.Initialize(source); | 5809 scanner.Initialize(source); |
5813 preparser::PreParser::PreParseResult result = preparser.PreParseProgram(); | 5810 PreParser::PreParseResult result = preparser.PreParseProgram(); |
5814 if (result == preparser::PreParser::kPreParseStackOverflow) { | 5811 if (result == PreParser::kPreParseStackOverflow) { |
5815 isolate->StackOverflow(); | 5812 isolate->StackOverflow(); |
5816 return NULL; | 5813 return NULL; |
5817 } | 5814 } |
5818 | 5815 |
5819 // Extract the accumulated data from the recorder as a single | 5816 // Extract the accumulated data from the recorder as a single |
5820 // contiguous vector that we are responsible for disposing. | 5817 // contiguous vector that we are responsible for disposing. |
5821 Vector<unsigned> store = recorder.ExtractData(); | 5818 Vector<unsigned> store = recorder.ExtractData(); |
5822 return new ScriptDataImpl(store); | 5819 return new ScriptDataImpl(store); |
5823 } | 5820 } |
5824 | 5821 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5872 ASSERT(info()->isolate()->has_pending_exception()); | 5869 ASSERT(info()->isolate()->has_pending_exception()); |
5873 } else { | 5870 } else { |
5874 result = ParseProgram(); | 5871 result = ParseProgram(); |
5875 } | 5872 } |
5876 } | 5873 } |
5877 info()->SetFunction(result); | 5874 info()->SetFunction(result); |
5878 return (result != NULL); | 5875 return (result != NULL); |
5879 } | 5876 } |
5880 | 5877 |
5881 } } // namespace v8::internal | 5878 } } // namespace v8::internal |
OLD | NEW |