| 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 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 // of functions without an outer context when setting a breakpoint through | 608 // of functions without an outer context when setting a breakpoint through |
| 609 // Debug::FindSharedFunctionInfoInScript | 609 // Debug::FindSharedFunctionInfoInScript |
| 610 bool can_compile_lazily = FLAG_lazy && !info->is_debug(); | 610 bool can_compile_lazily = FLAG_lazy && !info->is_debug(); |
| 611 | 611 |
| 612 // Consider compiling eagerly when targeting the code cache. | 612 // Consider compiling eagerly when targeting the code cache. |
| 613 can_compile_lazily &= !(FLAG_serialize_eager && info->will_serialize()); | 613 can_compile_lazily &= !(FLAG_serialize_eager && info->will_serialize()); |
| 614 | 614 |
| 615 set_default_eager_compile_hint(can_compile_lazily | 615 set_default_eager_compile_hint(can_compile_lazily |
| 616 ? FunctionLiteral::kShouldLazyCompile | 616 ? FunctionLiteral::kShouldLazyCompile |
| 617 : FunctionLiteral::kShouldEagerCompile); | 617 : FunctionLiteral::kShouldEagerCompile); |
| 618 set_allow_lazy(FLAG_lazy && info->allow_lazy_parsing() && | 618 allow_lazy_ = FLAG_lazy && info->allow_lazy_parsing() && !info->is_native() && |
| 619 !info->is_native() && info->extension() == nullptr && | 619 info->extension() == nullptr && can_compile_lazily; |
| 620 can_compile_lazily); | |
| 621 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); | 620 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); |
| 622 set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() && | 621 set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() && |
| 623 info->isolate()->is_tail_call_elimination_enabled()); | 622 info->isolate()->is_tail_call_elimination_enabled()); |
| 624 set_allow_harmony_do_expressions(FLAG_harmony_do_expressions); | 623 set_allow_harmony_do_expressions(FLAG_harmony_do_expressions); |
| 625 set_allow_harmony_function_sent(FLAG_harmony_function_sent); | 624 set_allow_harmony_function_sent(FLAG_harmony_function_sent); |
| 626 set_allow_harmony_async_await(FLAG_harmony_async_await); | 625 set_allow_harmony_async_await(FLAG_harmony_async_await); |
| 627 set_allow_harmony_restrictive_generators(FLAG_harmony_restrictive_generators); | 626 set_allow_harmony_restrictive_generators(FLAG_harmony_restrictive_generators); |
| 628 set_allow_harmony_trailing_commas(FLAG_harmony_trailing_commas); | 627 set_allow_harmony_trailing_commas(FLAG_harmony_trailing_commas); |
| 629 set_allow_harmony_class_fields(FLAG_harmony_class_fields); | 628 set_allow_harmony_class_fields(FLAG_harmony_class_fields); |
| 630 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; | 629 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 } | 722 } |
| 724 | 723 |
| 725 | 724 |
| 726 FunctionLiteral* Parser::DoParseProgram(ParseInfo* info) { | 725 FunctionLiteral* Parser::DoParseProgram(ParseInfo* info) { |
| 727 // Note that this function can be called from the main thread or from a | 726 // Note that this function can be called from the main thread or from a |
| 728 // background thread. We should not access anything Isolate / heap dependent | 727 // background thread. We should not access anything Isolate / heap dependent |
| 729 // via ParseInfo, and also not pass it forward. | 728 // via ParseInfo, and also not pass it forward. |
| 730 DCHECK_NULL(scope_state_); | 729 DCHECK_NULL(scope_state_); |
| 731 DCHECK_NULL(target_stack_); | 730 DCHECK_NULL(target_stack_); |
| 732 | 731 |
| 733 ParsingModeScope mode(this, allow_lazy() ? PARSE_LAZILY : PARSE_EAGERLY); | 732 ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY); |
| 734 | 733 |
| 735 FunctionLiteral* result = NULL; | 734 FunctionLiteral* result = NULL; |
| 736 { | 735 { |
| 737 Scope* outer = original_scope_; | 736 Scope* outer = original_scope_; |
| 738 DCHECK_NOT_NULL(outer); | 737 DCHECK_NOT_NULL(outer); |
| 739 parsing_module_ = info->is_module(); | 738 parsing_module_ = info->is_module(); |
| 740 if (info->is_eval()) { | 739 if (info->is_eval()) { |
| 741 outer = NewEvalScope(outer); | 740 outer = NewEvalScope(outer); |
| 742 } else if (parsing_module_) { | 741 } else if (parsing_module_) { |
| 743 DCHECK_EQ(outer, info->script_scope()); | 742 DCHECK_EQ(outer, info->script_scope()); |
| (...skipping 1818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2562 // (function foo() { | 2561 // (function foo() { |
| 2563 // var a = 1; | 2562 // var a = 1; |
| 2564 // bar = function() { return a; } | 2563 // bar = function() { return a; } |
| 2565 // })(); | 2564 // })(); |
| 2566 | 2565 |
| 2567 // Now foo will be parsed eagerly and compiled eagerly (optimization: assume | 2566 // Now foo will be parsed eagerly and compiled eagerly (optimization: assume |
| 2568 // parenthesis before the function means that it will be called | 2567 // parenthesis before the function means that it will be called |
| 2569 // immediately). bar can be parsed lazily, but we need to parse it in a mode | 2568 // immediately). bar can be parsed lazily, but we need to parse it in a mode |
| 2570 // that tracks unresolved variables. | 2569 // that tracks unresolved variables. |
| 2571 DCHECK_IMPLIES(parse_lazily(), FLAG_lazy); | 2570 DCHECK_IMPLIES(parse_lazily(), FLAG_lazy); |
| 2572 DCHECK_IMPLIES(parse_lazily(), allow_lazy()); | 2571 DCHECK_IMPLIES(parse_lazily(), allow_lazy_); |
| 2573 DCHECK_IMPLIES(parse_lazily(), extension_ == nullptr); | 2572 DCHECK_IMPLIES(parse_lazily(), extension_ == nullptr); |
| 2574 | 2573 |
| 2575 bool can_preparse = parse_lazily() && | 2574 bool can_preparse = parse_lazily() && |
| 2576 eager_compile_hint == FunctionLiteral::kShouldLazyCompile; | 2575 eager_compile_hint == FunctionLiteral::kShouldLazyCompile; |
| 2577 | 2576 |
| 2578 bool is_lazy_top_level_function = | 2577 bool is_lazy_top_level_function = |
| 2579 can_preparse && impl()->AllowsLazyParsingWithoutUnresolvedVariables(); | 2578 can_preparse && impl()->AllowsLazyParsingWithoutUnresolvedVariables(); |
| 2580 | 2579 |
| 2581 RuntimeCallTimerScope runtime_timer(runtime_call_stats_, | 2580 RuntimeCallTimerScope runtime_timer(runtime_call_stats_, |
| 2582 &RuntimeCallStats::ParseFunctionLiteral); | 2581 &RuntimeCallStats::ParseFunctionLiteral); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2597 // - For asm.js functions the body needs to be available when module | 2596 // - For asm.js functions the body needs to be available when module |
| 2598 // validation is active, because we examine the entire module at once. | 2597 // validation is active, because we examine the entire module at once. |
| 2599 | 2598 |
| 2600 // Inner functions will be parsed using a temporary Zone. After parsing, we | 2599 // Inner functions will be parsed using a temporary Zone. After parsing, we |
| 2601 // will migrate unresolved variable into a Scope in the main Zone. | 2600 // will migrate unresolved variable into a Scope in the main Zone. |
| 2602 // TODO(marja): Refactor parsing modes: simplify this. | 2601 // TODO(marja): Refactor parsing modes: simplify this. |
| 2603 bool use_temp_zone = | 2602 bool use_temp_zone = |
| 2604 (FLAG_lazy_inner_functions | 2603 (FLAG_lazy_inner_functions |
| 2605 ? can_preparse | 2604 ? can_preparse |
| 2606 : (is_lazy_top_level_function || | 2605 : (is_lazy_top_level_function || |
| 2607 (allow_lazy() && function_type == FunctionLiteral::kDeclaration && | 2606 (allow_lazy_ && function_type == FunctionLiteral::kDeclaration && |
| 2608 eager_compile_hint == FunctionLiteral::kShouldLazyCompile))) && | 2607 eager_compile_hint == FunctionLiteral::kShouldLazyCompile))) && |
| 2609 !(FLAG_validate_asm && scope()->IsAsmModule()); | 2608 !(FLAG_validate_asm && scope()->IsAsmModule()); |
| 2610 bool is_lazy_inner_function = | 2609 bool is_lazy_inner_function = |
| 2611 use_temp_zone && FLAG_lazy_inner_functions && !is_lazy_top_level_function; | 2610 use_temp_zone && FLAG_lazy_inner_functions && !is_lazy_top_level_function; |
| 2612 | 2611 |
| 2613 // This Scope lives in the main zone. We'll migrate data into that zone later. | 2612 // This Scope lives in the main zone. We'll migrate data into that zone later. |
| 2614 DeclarationScope* scope = NewFunctionScope(kind); | 2613 DeclarationScope* scope = NewFunctionScope(kind); |
| 2615 SetLanguageMode(scope, language_mode); | 2614 SetLanguageMode(scope, language_mode); |
| 2616 #ifdef DEBUG | 2615 #ifdef DEBUG |
| 2617 scope->SetScopeName(function_name); | 2616 scope->SetScopeName(function_name); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2784 } | 2783 } |
| 2785 | 2784 |
| 2786 // With no cached data, we partially parse the function, without building an | 2785 // With no cached data, we partially parse the function, without building an |
| 2787 // AST. This gathers the data needed to build a lazy function. | 2786 // AST. This gathers the data needed to build a lazy function. |
| 2788 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.PreParse"); | 2787 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.PreParse"); |
| 2789 | 2788 |
| 2790 if (reusable_preparser_ == NULL) { | 2789 if (reusable_preparser_ == NULL) { |
| 2791 reusable_preparser_ = new PreParser(zone(), &scanner_, ast_value_factory(), | 2790 reusable_preparser_ = new PreParser(zone(), &scanner_, ast_value_factory(), |
| 2792 &pending_error_handler_, | 2791 &pending_error_handler_, |
| 2793 runtime_call_stats_, stack_limit_); | 2792 runtime_call_stats_, stack_limit_); |
| 2794 reusable_preparser_->set_allow_lazy(true); | |
| 2795 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name()); | 2793 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name()); |
| 2796 SET_ALLOW(natives); | 2794 SET_ALLOW(natives); |
| 2797 SET_ALLOW(harmony_do_expressions); | 2795 SET_ALLOW(harmony_do_expressions); |
| 2798 SET_ALLOW(harmony_function_sent); | 2796 SET_ALLOW(harmony_function_sent); |
| 2799 SET_ALLOW(harmony_async_await); | 2797 SET_ALLOW(harmony_async_await); |
| 2800 SET_ALLOW(harmony_trailing_commas); | 2798 SET_ALLOW(harmony_trailing_commas); |
| 2801 SET_ALLOW(harmony_class_fields); | 2799 SET_ALLOW(harmony_class_fields); |
| 2802 #undef SET_ALLOW | 2800 #undef SET_ALLOW |
| 2803 } | 2801 } |
| 2804 // Aborting inner function preparsing would leave scopes in an inconsistent | 2802 // Aborting inner function preparsing would leave scopes in an inconsistent |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3153 | 3151 |
| 3154 *materialized_literal_count = function_state.materialized_literal_count(); | 3152 *materialized_literal_count = function_state.materialized_literal_count(); |
| 3155 *expected_property_count = function_state.expected_property_count(); | 3153 *expected_property_count = function_state.expected_property_count(); |
| 3156 return body; | 3154 return body; |
| 3157 } | 3155 } |
| 3158 | 3156 |
| 3159 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( | 3157 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( |
| 3160 const AstRawString* function_name, int pos, | 3158 const AstRawString* function_name, int pos, |
| 3161 const ParserFormalParameters& parameters, FunctionKind kind, | 3159 const ParserFormalParameters& parameters, FunctionKind kind, |
| 3162 FunctionLiteral::FunctionType function_type, bool* ok) { | 3160 FunctionLiteral::FunctionType function_type, bool* ok) { |
| 3163 ParsingModeScope mode(this, allow_lazy() ? PARSE_LAZILY : PARSE_EAGERLY); | 3161 ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY); |
| 3164 ZoneList<Statement*>* result = new(zone()) ZoneList<Statement*>(8, zone()); | 3162 ZoneList<Statement*>* result = new(zone()) ZoneList<Statement*>(8, zone()); |
| 3165 | 3163 |
| 3166 static const int kFunctionNameAssignmentIndex = 0; | 3164 static const int kFunctionNameAssignmentIndex = 0; |
| 3167 if (function_type == FunctionLiteral::kNamedExpression) { | 3165 if (function_type == FunctionLiteral::kNamedExpression) { |
| 3168 DCHECK(function_name != NULL); | 3166 DCHECK(function_name != NULL); |
| 3169 // If we have a named function expression, we add a local variable | 3167 // If we have a named function expression, we add a local variable |
| 3170 // declaration to the body of the function with the name of the | 3168 // declaration to the body of the function with the name of the |
| 3171 // function and let it refer to the function itself (closure). | 3169 // function and let it refer to the function itself (closure). |
| 3172 // Not having parsed the function body, the language mode may still change, | 3170 // Not having parsed the function body, the language mode may still change, |
| 3173 // so we reserve a spot and create the actual const assignment later. | 3171 // so we reserve a spot and create the actual const assignment later. |
| (...skipping 2263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5437 | 5435 |
| 5438 return final_loop; | 5436 return final_loop; |
| 5439 } | 5437 } |
| 5440 | 5438 |
| 5441 #undef CHECK_OK | 5439 #undef CHECK_OK |
| 5442 #undef CHECK_OK_VOID | 5440 #undef CHECK_OK_VOID |
| 5443 #undef CHECK_FAILED | 5441 #undef CHECK_FAILED |
| 5444 | 5442 |
| 5445 } // namespace internal | 5443 } // namespace internal |
| 5446 } // namespace v8 | 5444 } // namespace v8 |
| OLD | NEW |