| 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 2765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2776 SkipFunctionLiterals(entry.num_inner_functions()); | 2776 SkipFunctionLiterals(entry.num_inner_functions()); |
| 2777 return kLazyParsingComplete; | 2777 return kLazyParsingComplete; |
| 2778 } | 2778 } |
| 2779 cached_parse_data_->Reject(); | 2779 cached_parse_data_->Reject(); |
| 2780 } | 2780 } |
| 2781 | 2781 |
| 2782 // With no cached data, we partially parse the function, without building an | 2782 // With no cached data, we partially parse the function, without building an |
| 2783 // AST. This gathers the data needed to build a lazy function. | 2783 // AST. This gathers the data needed to build a lazy function. |
| 2784 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.PreParse"); | 2784 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.PreParse"); |
| 2785 | 2785 |
| 2786 if (reusable_preparser_ == NULL) { | |
| 2787 reusable_preparser_ = new PreParser( | |
| 2788 zone(), &scanner_, stack_limit_, ast_value_factory(), | |
| 2789 &pending_error_handler_, runtime_call_stats_, parsing_on_main_thread_); | |
| 2790 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name()); | |
| 2791 SET_ALLOW(natives); | |
| 2792 SET_ALLOW(harmony_do_expressions); | |
| 2793 SET_ALLOW(harmony_function_sent); | |
| 2794 SET_ALLOW(harmony_trailing_commas); | |
| 2795 SET_ALLOW(harmony_class_fields); | |
| 2796 SET_ALLOW(harmony_object_rest_spread); | |
| 2797 SET_ALLOW(harmony_dynamic_import); | |
| 2798 SET_ALLOW(harmony_async_iteration); | |
| 2799 #undef SET_ALLOW | |
| 2800 } | |
| 2801 // Aborting inner function preparsing would leave scopes in an inconsistent | 2786 // Aborting inner function preparsing would leave scopes in an inconsistent |
| 2802 // state; we don't parse inner functions in the abortable mode anyway. | 2787 // state; we don't parse inner functions in the abortable mode anyway. |
| 2803 DCHECK(!is_inner_function || !may_abort); | 2788 DCHECK(!is_inner_function || !may_abort); |
| 2804 | 2789 |
| 2805 PreParser::PreParseResult result = reusable_preparser_->PreParseFunction( | 2790 PreParser::PreParseResult result = reusable_preparser()->PreParseFunction( |
| 2806 kind, function_scope, parsing_module_, is_inner_function, may_abort, | 2791 kind, function_scope, parsing_module_, is_inner_function, may_abort, |
| 2807 use_counts_); | 2792 use_counts_); |
| 2808 | 2793 |
| 2809 // Return immediately if pre-parser decided to abort parsing. | 2794 // Return immediately if pre-parser decided to abort parsing. |
| 2810 if (result == PreParser::kPreParseAbort) return kLazyParsingAborted; | 2795 if (result == PreParser::kPreParseAbort) return kLazyParsingAborted; |
| 2811 if (result == PreParser::kPreParseStackOverflow) { | 2796 if (result == PreParser::kPreParseStackOverflow) { |
| 2812 // Propagate stack overflow. | 2797 // Propagate stack overflow. |
| 2813 set_stack_overflow(); | 2798 set_stack_overflow(); |
| 2814 *ok = false; | 2799 *ok = false; |
| 2815 return kLazyParsingComplete; | 2800 return kLazyParsingComplete; |
| 2816 } | 2801 } |
| 2817 if (pending_error_handler_.has_pending_error()) { | 2802 if (pending_error_handler_.has_pending_error()) { |
| 2818 *ok = false; | 2803 *ok = false; |
| 2819 return kLazyParsingComplete; | 2804 return kLazyParsingComplete; |
| 2820 } | 2805 } |
| 2821 PreParserLogger* logger = reusable_preparser_->logger(); | 2806 PreParserLogger* logger = reusable_preparser()->logger(); |
| 2822 function_scope->set_end_position(logger->end()); | 2807 function_scope->set_end_position(logger->end()); |
| 2823 Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete)); | 2808 Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete)); |
| 2824 total_preparse_skipped_ += | 2809 total_preparse_skipped_ += |
| 2825 function_scope->end_position() - function_scope->start_position(); | 2810 function_scope->end_position() - function_scope->start_position(); |
| 2826 *num_parameters = logger->num_parameters(); | 2811 *num_parameters = logger->num_parameters(); |
| 2827 *function_length = logger->function_length(); | 2812 *function_length = logger->function_length(); |
| 2828 *has_duplicate_parameters = logger->has_duplicate_parameters(); | 2813 *has_duplicate_parameters = logger->has_duplicate_parameters(); |
| 2829 *expected_property_count = logger->properties(); | 2814 *expected_property_count = logger->properties(); |
| 2830 SkipFunctionLiterals(logger->num_inner_functions()); | 2815 SkipFunctionLiterals(logger->num_inner_functions()); |
| 2831 if (!is_inner_function && produce_cached_parse_data()) { | 2816 if (!is_inner_function && produce_cached_parse_data()) { |
| (...skipping 2216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5048 | 5033 |
| 5049 return final_loop; | 5034 return final_loop; |
| 5050 } | 5035 } |
| 5051 | 5036 |
| 5052 #undef CHECK_OK | 5037 #undef CHECK_OK |
| 5053 #undef CHECK_OK_VOID | 5038 #undef CHECK_OK_VOID |
| 5054 #undef CHECK_FAILED | 5039 #undef CHECK_FAILED |
| 5055 | 5040 |
| 5056 } // namespace internal | 5041 } // namespace internal |
| 5057 } // namespace v8 | 5042 } // namespace v8 |
| OLD | NEW |