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 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
277 } | 277 } |
278 | 278 |
279 materialized_literal_count = function_state.materialized_literal_count(); | 279 materialized_literal_count = function_state.materialized_literal_count(); |
280 expected_property_count = function_state.expected_property_count(); | 280 expected_property_count = function_state.expected_property_count(); |
281 } | 281 } |
282 | 282 |
283 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( | 283 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
284 name, function_scope, body, materialized_literal_count, | 284 name, function_scope, body, materialized_literal_count, |
285 expected_property_count, parameter_count, | 285 expected_property_count, parameter_count, |
286 FunctionLiteral::kNoDuplicateParameters, | 286 FunctionLiteral::kNoDuplicateParameters, |
287 FunctionLiteral::kAnonymousExpression, | 287 FunctionLiteral::kAnonymousExpression, default_eager_compile_hint(), pos); |
288 FunctionLiteral::kShouldLazyCompile, pos); | |
289 | 288 |
290 function_literal->set_requires_class_field_init(requires_class_field_init); | 289 function_literal->set_requires_class_field_init(requires_class_field_init); |
291 | 290 |
292 return function_literal; | 291 return function_literal; |
293 } | 292 } |
294 | 293 |
295 | 294 |
296 // ---------------------------------------------------------------------------- | 295 // ---------------------------------------------------------------------------- |
297 // Target is a support class to facilitate manipulation of the | 296 // Target is a support class to facilitate manipulation of the |
298 // Parser's target_stack_ (the stack of potential 'break' and | 297 // Parser's target_stack_ (the stack of potential 'break' and |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
639 compile_options_(info->compile_options()), | 638 compile_options_(info->compile_options()), |
640 cached_parse_data_(NULL), | 639 cached_parse_data_(NULL), |
641 total_preparse_skipped_(0), | 640 total_preparse_skipped_(0), |
642 pre_parse_timer_(NULL), | 641 pre_parse_timer_(NULL), |
643 parsing_on_main_thread_(true) { | 642 parsing_on_main_thread_(true) { |
644 // Even though we were passed ParseInfo, we should not store it in | 643 // Even though we were passed ParseInfo, we should not store it in |
645 // Parser - this makes sure that Isolate is not accidentally accessed via | 644 // Parser - this makes sure that Isolate is not accidentally accessed via |
646 // ParseInfo during background parsing. | 645 // ParseInfo during background parsing. |
647 DCHECK(!info->script().is_null() || info->source_stream() != nullptr || | 646 DCHECK(!info->script().is_null() || info->source_stream() != nullptr || |
648 info->character_stream() != nullptr); | 647 info->character_stream() != nullptr); |
648 // Determine if functions can be lazily compiled. This is necessary to | |
649 // allow some of our builtin JS files to be lazily compiled. These | |
650 // builtins cannot be handled lazily by the parser, since we have to know | |
651 // if a function uses the special natives syntax, which is something the | |
652 // parser records. | |
653 // If the debugger requests compilation for break points, we cannot be | |
654 // aggressive about lazy compilation, because it might trigger compilation | |
655 // of functions without an outer context when setting a breakpoint through | |
656 // Debug::FindSharedFunctionInfoInScript | |
657 bool can_compile_lazily = FLAG_lazy && !info->is_debug(); | |
658 | |
659 // Consider compiling eagerly when targeting the code cache. | |
660 can_compile_lazily &= !(FLAG_serialize_eager && info->will_serialize()); | |
661 | |
662 // Consider compiling eagerly when compiling bytecode for Ignition. | |
663 can_compile_lazily &= !(FLAG_ignition && FLAG_ignition_eager && | |
664 info->isolate()->serializer_enabled()); | |
665 | |
666 set_default_eager_compile_hint(can_compile_lazily | |
667 ? FunctionLiteral::kShouldLazyCompile | |
668 : FunctionLiteral::kShouldEagerCompile); | |
649 set_allow_lazy(FLAG_lazy && info->allow_lazy_parsing() && | 669 set_allow_lazy(FLAG_lazy && info->allow_lazy_parsing() && |
650 !info->is_native() && info->extension() == nullptr); | 670 !info->is_native() && info->extension() == nullptr); |
651 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); | 671 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); |
652 set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() && | 672 set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() && |
653 info->isolate()->is_tail_call_elimination_enabled()); | 673 info->isolate()->is_tail_call_elimination_enabled()); |
654 set_allow_harmony_do_expressions(FLAG_harmony_do_expressions); | 674 set_allow_harmony_do_expressions(FLAG_harmony_do_expressions); |
655 set_allow_harmony_for_in(FLAG_harmony_for_in); | 675 set_allow_harmony_for_in(FLAG_harmony_for_in); |
656 set_allow_harmony_function_sent(FLAG_harmony_function_sent); | 676 set_allow_harmony_function_sent(FLAG_harmony_function_sent); |
657 set_allow_harmony_restrictive_declarations( | 677 set_allow_harmony_restrictive_declarations( |
658 FLAG_harmony_restrictive_declarations); | 678 FLAG_harmony_restrictive_declarations); |
(...skipping 1900 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2559 bool should_infer_name = function_name == NULL; | 2579 bool should_infer_name = function_name == NULL; |
2560 | 2580 |
2561 // We want a non-null handle as the function name. | 2581 // We want a non-null handle as the function name. |
2562 if (should_infer_name) { | 2582 if (should_infer_name) { |
2563 function_name = ast_value_factory()->empty_string(); | 2583 function_name = ast_value_factory()->empty_string(); |
2564 } | 2584 } |
2565 | 2585 |
2566 FunctionLiteral::EagerCompileHint eager_compile_hint = | 2586 FunctionLiteral::EagerCompileHint eager_compile_hint = |
2567 function_state_->next_function_is_parenthesized() | 2587 function_state_->next_function_is_parenthesized() |
2568 ? FunctionLiteral::kShouldEagerCompile | 2588 ? FunctionLiteral::kShouldEagerCompile |
2569 : FunctionLiteral::kShouldLazyCompile; | 2589 : default_eager_compile_hint(); |
2570 | 2590 |
2571 // Determine if the function can be parsed lazily. Lazy parsing is | 2591 // Determine if the function can be parsed lazily. Lazy parsing is |
2572 // different from lazy compilation; we need to parse more eagerly than we | 2592 // different from lazy compilation; we need to parse more eagerly than we |
2573 // compile. | 2593 // compile. |
2574 | 2594 |
2575 // We can only parse lazily if we also compile lazily. The heuristics for lazy | 2595 // We can only parse lazily if we also compile lazily. The heuristics for lazy |
2576 // compilation are: | 2596 // compilation are: |
2577 // - It must not have been prohibited by the caller to Parse (some callers | 2597 // - It must not have been prohibited by the caller to Parse (some callers |
2578 // need a full AST). | 2598 // need a full AST). |
2579 // - The outer scope must allow lazy compilation of inner functions. | 2599 // - The outer scope must allow lazy compilation of inner functions. |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2775 expected_property_count, arity, duplicate_parameters, function_type, | 2795 expected_property_count, arity, duplicate_parameters, function_type, |
2776 eager_compile_hint, pos); | 2796 eager_compile_hint, pos); |
2777 function_literal->set_function_token_position(function_token_pos); | 2797 function_literal->set_function_token_position(function_token_pos); |
2778 if (should_be_used_once_hint) | 2798 if (should_be_used_once_hint) |
2779 function_literal->set_should_be_used_once_hint(); | 2799 function_literal->set_should_be_used_once_hint(); |
2780 | 2800 |
2781 if (should_infer_name) { | 2801 if (should_infer_name) { |
2782 DCHECK_NOT_NULL(fni_); | 2802 DCHECK_NOT_NULL(fni_); |
2783 fni_->AddFunction(function_literal); | 2803 fni_->AddFunction(function_literal); |
2784 } | 2804 } |
2805 | |
marja
2016/10/07 08:25:59
Do you feel strongly about adding this line? :)
(
jochen (gone - plz use gerrit)
2016/10/07 08:34:37
haha.
| |
2785 return function_literal; | 2806 return function_literal; |
2786 } | 2807 } |
2787 | 2808 |
2788 Parser::LazyParsingResult Parser::SkipLazyFunctionBody( | 2809 Parser::LazyParsingResult Parser::SkipLazyFunctionBody( |
2789 int* materialized_literal_count, int* expected_property_count, | 2810 int* materialized_literal_count, int* expected_property_count, |
2790 bool is_inner_function, bool may_abort, bool* ok) { | 2811 bool is_inner_function, bool may_abort, bool* ok) { |
2791 if (produce_cached_parse_data()) CHECK(log_); | 2812 if (produce_cached_parse_data()) CHECK(log_); |
2792 | 2813 |
2793 int function_block_pos = position(); | 2814 int function_block_pos = position(); |
2794 DeclarationScope* scope = function_state_->scope(); | 2815 DeclarationScope* scope = function_state_->scope(); |
(...skipping 2647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5442 | 5463 |
5443 return final_loop; | 5464 return final_loop; |
5444 } | 5465 } |
5445 | 5466 |
5446 #undef CHECK_OK | 5467 #undef CHECK_OK |
5447 #undef CHECK_OK_VOID | 5468 #undef CHECK_OK_VOID |
5448 #undef CHECK_FAILED | 5469 #undef CHECK_FAILED |
5449 | 5470 |
5450 } // namespace internal | 5471 } // namespace internal |
5451 } // namespace v8 | 5472 } // namespace v8 |
OLD | NEW |