Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: src/parsing/parser.cc

Issue 2657413002: No need to collect literal counts.
Patch Set: Rebase. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 cached_parse_data_ = ParseData::FromCachedData(*info->cached_data()); 160 cached_parse_data_ = ParseData::FromCachedData(*info->cached_data());
161 if (cached_parse_data_ != nullptr) return; 161 if (cached_parse_data_ != nullptr) return;
162 } 162 }
163 compile_options_ = ScriptCompiler::kNoCompileOptions; 163 compile_options_ = ScriptCompiler::kNoCompileOptions;
164 } 164 }
165 } 165 }
166 166
167 FunctionLiteral* Parser::DefaultConstructor(const AstRawString* name, 167 FunctionLiteral* Parser::DefaultConstructor(const AstRawString* name,
168 bool call_super, int pos, 168 bool call_super, int pos,
169 int end_pos) { 169 int end_pos) {
170 int materialized_literal_count = -1;
171 int expected_property_count = -1; 170 int expected_property_count = -1;
172 const int parameter_count = 0; 171 const int parameter_count = 0;
173 if (name == nullptr) name = ast_value_factory()->empty_string(); 172 if (name == nullptr) name = ast_value_factory()->empty_string();
174 173
175 FunctionKind kind = call_super ? FunctionKind::kDefaultDerivedConstructor 174 FunctionKind kind = call_super ? FunctionKind::kDefaultDerivedConstructor
176 : FunctionKind::kDefaultBaseConstructor; 175 : FunctionKind::kDefaultBaseConstructor;
177 DeclarationScope* function_scope = NewFunctionScope(kind); 176 DeclarationScope* function_scope = NewFunctionScope(kind);
178 SetLanguageMode(function_scope, STRICT); 177 SetLanguageMode(function_scope, STRICT);
179 // Set start and end position to the same value 178 // Set start and end position to the same value
180 function_scope->set_start_position(pos); 179 function_scope->set_start_position(pos);
(...skipping 19 matching lines...) Expand all
200 new (zone()) ZoneList<Expression*>(1, zone()); 199 new (zone()) ZoneList<Expression*>(1, zone());
201 Spread* spread_args = factory()->NewSpread( 200 Spread* spread_args = factory()->NewSpread(
202 factory()->NewVariableProxy(constructor_args), pos, pos); 201 factory()->NewVariableProxy(constructor_args), pos, pos);
203 202
204 args->Add(spread_args, zone()); 203 args->Add(spread_args, zone());
205 Expression* super_call_ref = NewSuperCallReference(pos); 204 Expression* super_call_ref = NewSuperCallReference(pos);
206 Expression* call = factory()->NewCall(super_call_ref, args, pos); 205 Expression* call = factory()->NewCall(super_call_ref, args, pos);
207 body->Add(factory()->NewReturnStatement(call, pos), zone()); 206 body->Add(factory()->NewReturnStatement(call, pos), zone());
208 } 207 }
209 208
210 materialized_literal_count = function_state.materialized_literal_count();
211 expected_property_count = function_state.expected_property_count(); 209 expected_property_count = function_state.expected_property_count();
212 } 210 }
213 211
214 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( 212 FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
215 name, function_scope, body, materialized_literal_count, 213 name, function_scope, body, expected_property_count, parameter_count,
216 expected_property_count, parameter_count, parameter_count, 214 parameter_count, FunctionLiteral::kNoDuplicateParameters,
217 FunctionLiteral::kNoDuplicateParameters,
218 FunctionLiteral::kAnonymousExpression, default_eager_compile_hint(), pos, 215 FunctionLiteral::kAnonymousExpression, default_eager_compile_hint(), pos,
219 true, GetNextFunctionLiteralId()); 216 true, GetNextFunctionLiteralId());
220 217
221 return function_literal; 218 return function_literal;
222 } 219 }
223 220
224 // ---------------------------------------------------------------------------- 221 // ----------------------------------------------------------------------------
225 // The CHECK_OK macro is a convenient macro to enforce error 222 // The CHECK_OK macro is a convenient macro to enforce error
226 // handling for functions that may fail (by returning !*ok). 223 // handling for functions that may fail (by returning !*ok).
227 // 224 //
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 expression()->IsFunctionLiteral()) { 738 expression()->IsFunctionLiteral()) {
742 ReportMessage(MessageTemplate::kSingleFunctionLiteral); 739 ReportMessage(MessageTemplate::kSingleFunctionLiteral);
743 ok = false; 740 ok = false;
744 } 741 }
745 } 742 }
746 743
747 if (ok) { 744 if (ok) {
748 RewriteDestructuringAssignments(); 745 RewriteDestructuringAssignments();
749 int parameter_count = parsing_module_ ? 1 : 0; 746 int parameter_count = parsing_module_ ? 1 : 0;
750 result = factory()->NewScriptOrEvalFunctionLiteral( 747 result = factory()->NewScriptOrEvalFunctionLiteral(
751 scope, body, function_state.materialized_literal_count(), 748 scope, body, function_state.expected_property_count(),
752 function_state.expected_property_count(), parameter_count); 749 parameter_count);
753 } 750 }
754 } 751 }
755 752
756 info->set_max_function_literal_id(GetLastFunctionLiteralId()); 753 info->set_max_function_literal_id(GetLastFunctionLiteralId());
757 754
758 // Make sure the target stack is empty. 755 // Make sure the target stack is empty.
759 DCHECK(target_stack_ == NULL); 756 DCHECK(target_stack_ == NULL);
760 757
761 return result; 758 return result;
762 } 759 }
(...skipping 1823 matching lines...) Expand 10 before | Expand all | Expand 10 after
2586 2583
2587 DCHECK_IMPLIES( 2584 DCHECK_IMPLIES(
2588 (is_lazy_top_level_function || 2585 (is_lazy_top_level_function ||
2589 (parse_lazily() && function_type == FunctionLiteral::kDeclaration && 2586 (parse_lazily() && function_type == FunctionLiteral::kDeclaration &&
2590 eager_compile_hint == FunctionLiteral::kShouldLazyCompile)), 2587 eager_compile_hint == FunctionLiteral::kShouldLazyCompile)),
2591 can_preparse); 2588 can_preparse);
2592 bool is_lazy_inner_function = 2589 bool is_lazy_inner_function =
2593 use_temp_zone && FLAG_lazy_inner_functions && !is_lazy_top_level_function; 2590 use_temp_zone && FLAG_lazy_inner_functions && !is_lazy_top_level_function;
2594 2591
2595 ZoneList<Statement*>* body = nullptr; 2592 ZoneList<Statement*>* body = nullptr;
2596 int materialized_literal_count = -1;
2597 int expected_property_count = -1; 2593 int expected_property_count = -1;
2598 bool should_be_used_once_hint = false; 2594 bool should_be_used_once_hint = false;
2599 int num_parameters = -1; 2595 int num_parameters = -1;
2600 int function_length = -1; 2596 int function_length = -1;
2601 bool has_duplicate_parameters = false; 2597 bool has_duplicate_parameters = false;
2602 int function_literal_id = GetNextFunctionLiteralId(); 2598 int function_literal_id = GetNextFunctionLiteralId();
2603 2599
2604 Zone* outer_zone = zone(); 2600 Zone* outer_zone = zone();
2605 DeclarationScope* scope; 2601 DeclarationScope* scope;
2606 2602
(...skipping 24 matching lines...) Expand all
2631 scope->set_start_position(scanner()->location().beg_pos); 2627 scope->set_start_position(scanner()->location().beg_pos);
2632 2628
2633 // Eager or lazy parse? If is_lazy_top_level_function, we'll parse 2629 // Eager or lazy parse? If is_lazy_top_level_function, we'll parse
2634 // lazily. We'll call SkipFunction, which may decide to 2630 // lazily. We'll call SkipFunction, which may decide to
2635 // abort lazy parsing if it suspects that wasn't a good idea. If so (in 2631 // abort lazy parsing if it suspects that wasn't a good idea. If so (in
2636 // which case the parser is expected to have backtracked), or if we didn't 2632 // which case the parser is expected to have backtracked), or if we didn't
2637 // try to lazy parse in the first place, we'll have to parse eagerly. 2633 // try to lazy parse in the first place, we'll have to parse eagerly.
2638 if (is_lazy_top_level_function || is_lazy_inner_function) { 2634 if (is_lazy_top_level_function || is_lazy_inner_function) {
2639 Scanner::BookmarkScope bookmark(scanner()); 2635 Scanner::BookmarkScope bookmark(scanner());
2640 bookmark.Set(); 2636 bookmark.Set();
2641 LazyParsingResult result = 2637 LazyParsingResult result = SkipFunction(
2642 SkipFunction(kind, scope, &num_parameters, &function_length, 2638 kind, scope, &num_parameters, &function_length,
2643 &has_duplicate_parameters, &materialized_literal_count, 2639 &has_duplicate_parameters, &expected_property_count,
2644 &expected_property_count, is_lazy_inner_function, 2640 is_lazy_inner_function, is_lazy_top_level_function, CHECK_OK);
2645 is_lazy_top_level_function, CHECK_OK);
2646 2641
2647 if (result == kLazyParsingAborted) { 2642 if (result == kLazyParsingAborted) {
2648 DCHECK(is_lazy_top_level_function); 2643 DCHECK(is_lazy_top_level_function);
2649 bookmark.Apply(); 2644 bookmark.Apply();
2650 // Trigger eager (re-)parsing, just below this block. 2645 // Trigger eager (re-)parsing, just below this block.
2651 is_lazy_top_level_function = false; 2646 is_lazy_top_level_function = false;
2652 2647
2653 // This is probably an initialization function. Inform the compiler it 2648 // This is probably an initialization function. Inform the compiler it
2654 // should also eager-compile this function, and that we expect it to be 2649 // should also eager-compile this function, and that we expect it to be
2655 // used once. 2650 // used once.
2656 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; 2651 eager_compile_hint = FunctionLiteral::kShouldEagerCompile;
2657 should_be_used_once_hint = true; 2652 should_be_used_once_hint = true;
2658 scope->ResetAfterPreparsing(ast_value_factory(), true); 2653 scope->ResetAfterPreparsing(ast_value_factory(), true);
2659 zone_scope.Reset(); 2654 zone_scope.Reset();
2660 use_temp_zone = false; 2655 use_temp_zone = false;
2661 } 2656 }
2662 } 2657 }
2663 2658
2664 if (!is_lazy_top_level_function && !is_lazy_inner_function) { 2659 if (!is_lazy_top_level_function && !is_lazy_inner_function) {
2665 body = ParseFunction( 2660 body = ParseFunction(function_name, pos, kind, function_type, scope,
2666 function_name, pos, kind, function_type, scope, &num_parameters, 2661 &num_parameters, &function_length,
2667 &function_length, &has_duplicate_parameters, 2662 &has_duplicate_parameters, &expected_property_count,
2668 &materialized_literal_count, &expected_property_count, CHECK_OK); 2663 CHECK_OK);
2669 } 2664 }
2670 2665
2671 DCHECK(use_temp_zone || !is_lazy_top_level_function); 2666 DCHECK(use_temp_zone || !is_lazy_top_level_function);
2672 if (use_temp_zone) { 2667 if (use_temp_zone) {
2673 // If the preconditions are correct the function body should never be 2668 // If the preconditions are correct the function body should never be
2674 // accessed, but do this anyway for better behaviour if they're wrong. 2669 // accessed, but do this anyway for better behaviour if they're wrong.
2675 body = nullptr; 2670 body = nullptr;
2676 scope->AnalyzePartially(&previous_zone_ast_node_factory, 2671 scope->AnalyzePartially(&previous_zone_ast_node_factory,
2677 preparsed_scope_data_); 2672 preparsed_scope_data_);
2678 } 2673 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2714 } 2709 }
2715 CheckConflictingVarDeclarations(scope, CHECK_OK); 2710 CheckConflictingVarDeclarations(scope, CHECK_OK);
2716 } // DiscardableZoneScope goes out of scope. 2711 } // DiscardableZoneScope goes out of scope.
2717 2712
2718 FunctionLiteral::ParameterFlag duplicate_parameters = 2713 FunctionLiteral::ParameterFlag duplicate_parameters =
2719 has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters 2714 has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters
2720 : FunctionLiteral::kNoDuplicateParameters; 2715 : FunctionLiteral::kNoDuplicateParameters;
2721 2716
2722 // Note that the FunctionLiteral needs to be created in the main Zone again. 2717 // Note that the FunctionLiteral needs to be created in the main Zone again.
2723 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( 2718 FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
2724 function_name, scope, body, materialized_literal_count, 2719 function_name, scope, body, expected_property_count, num_parameters,
2725 expected_property_count, num_parameters, function_length, 2720 function_length, duplicate_parameters, function_type, eager_compile_hint,
2726 duplicate_parameters, function_type, eager_compile_hint, pos, true, 2721 pos, true, function_literal_id);
2727 function_literal_id);
2728 function_literal->set_function_token_position(function_token_pos); 2722 function_literal->set_function_token_position(function_token_pos);
2729 if (should_be_used_once_hint) 2723 if (should_be_used_once_hint)
2730 function_literal->set_should_be_used_once_hint(); 2724 function_literal->set_should_be_used_once_hint();
2731 2725
2732 if (should_infer_name) { 2726 if (should_infer_name) {
2733 DCHECK_NOT_NULL(fni_); 2727 DCHECK_NOT_NULL(fni_);
2734 fni_->AddFunction(function_literal); 2728 fni_->AddFunction(function_literal);
2735 } 2729 }
2736 return function_literal; 2730 return function_literal;
2737 } 2731 }
2738 2732
2739 Parser::LazyParsingResult Parser::SkipFunction( 2733 Parser::LazyParsingResult Parser::SkipFunction(
2740 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters, 2734 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters,
2741 int* function_length, bool* has_duplicate_parameters, 2735 int* function_length, bool* has_duplicate_parameters,
2742 int* materialized_literal_count, int* expected_property_count, 2736 int* expected_property_count, bool is_inner_function, bool may_abort,
2743 bool is_inner_function, bool may_abort, bool* ok) { 2737 bool* ok) {
2744 DCHECK_NE(kNoSourcePosition, function_scope->start_position()); 2738 DCHECK_NE(kNoSourcePosition, function_scope->start_position());
2745 if (produce_cached_parse_data()) CHECK(log_); 2739 if (produce_cached_parse_data()) CHECK(log_);
2746 2740
2747 DCHECK_IMPLIES(IsArrowFunction(kind), 2741 DCHECK_IMPLIES(IsArrowFunction(kind),
2748 scanner()->current_token() == Token::ARROW); 2742 scanner()->current_token() == Token::ARROW);
2749 2743
2750 // Inner functions are not part of the cached data. 2744 // Inner functions are not part of the cached data.
2751 if (!is_inner_function && consume_cached_parse_data() && 2745 if (!is_inner_function && consume_cached_parse_data() &&
2752 !cached_parse_data_->rejected()) { 2746 !cached_parse_data_->rejected()) {
2753 // If we have cached data, we use it to skip parsing the function. The data 2747 // If we have cached data, we use it to skip parsing the function. The data
2754 // contains the information we need to construct the lazy function. 2748 // contains the information we need to construct the lazy function.
2755 FunctionEntry entry = 2749 FunctionEntry entry =
2756 cached_parse_data_->GetFunctionEntry(function_scope->start_position()); 2750 cached_parse_data_->GetFunctionEntry(function_scope->start_position());
2757 // Check that cached data is valid. If not, mark it as invalid (the embedder 2751 // Check that cached data is valid. If not, mark it as invalid (the embedder
2758 // handles it). Note that end position greater than end of stream is safe, 2752 // handles it). Note that end position greater than end of stream is safe,
2759 // and hard to check. 2753 // and hard to check.
2760 if (entry.is_valid() && 2754 if (entry.is_valid() &&
2761 entry.end_pos() > function_scope->start_position()) { 2755 entry.end_pos() > function_scope->start_position()) {
2762 total_preparse_skipped_ += entry.end_pos() - position(); 2756 total_preparse_skipped_ += entry.end_pos() - position();
2763 function_scope->set_end_position(entry.end_pos()); 2757 function_scope->set_end_position(entry.end_pos());
2764 scanner()->SeekForward(entry.end_pos() - 1); 2758 scanner()->SeekForward(entry.end_pos() - 1);
2765 Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete)); 2759 Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete));
2766 *num_parameters = entry.num_parameters(); 2760 *num_parameters = entry.num_parameters();
2767 *function_length = entry.function_length(); 2761 *function_length = entry.function_length();
2768 *has_duplicate_parameters = entry.has_duplicate_parameters(); 2762 *has_duplicate_parameters = entry.has_duplicate_parameters();
2769 *materialized_literal_count = entry.literal_count();
2770 *expected_property_count = entry.property_count(); 2763 *expected_property_count = entry.property_count();
2771 SetLanguageMode(function_scope, entry.language_mode()); 2764 SetLanguageMode(function_scope, entry.language_mode());
2772 if (entry.uses_super_property()) 2765 if (entry.uses_super_property())
2773 function_scope->RecordSuperPropertyUsage(); 2766 function_scope->RecordSuperPropertyUsage();
2774 if (entry.calls_eval()) function_scope->RecordEvalCall(); 2767 if (entry.calls_eval()) function_scope->RecordEvalCall();
2775 SkipFunctionLiterals(entry.num_inner_functions()); 2768 SkipFunctionLiterals(entry.num_inner_functions());
2776 return kLazyParsingComplete; 2769 return kLazyParsingComplete;
2777 } 2770 }
2778 cached_parse_data_->Reject(); 2771 cached_parse_data_->Reject();
2779 } 2772 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 return kLazyParsingComplete; 2810 return kLazyParsingComplete;
2818 } 2811 }
2819 PreParserLogger* logger = reusable_preparser_->logger(); 2812 PreParserLogger* logger = reusable_preparser_->logger();
2820 function_scope->set_end_position(logger->end()); 2813 function_scope->set_end_position(logger->end());
2821 Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete)); 2814 Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete));
2822 total_preparse_skipped_ += 2815 total_preparse_skipped_ +=
2823 function_scope->end_position() - function_scope->start_position(); 2816 function_scope->end_position() - function_scope->start_position();
2824 *num_parameters = logger->num_parameters(); 2817 *num_parameters = logger->num_parameters();
2825 *function_length = logger->function_length(); 2818 *function_length = logger->function_length();
2826 *has_duplicate_parameters = logger->has_duplicate_parameters(); 2819 *has_duplicate_parameters = logger->has_duplicate_parameters();
2827 *materialized_literal_count = logger->literals();
2828 *expected_property_count = logger->properties(); 2820 *expected_property_count = logger->properties();
2829 SkipFunctionLiterals(logger->num_inner_functions()); 2821 SkipFunctionLiterals(logger->num_inner_functions());
2830 if (!is_inner_function && produce_cached_parse_data()) { 2822 if (!is_inner_function && produce_cached_parse_data()) {
2831 DCHECK(log_); 2823 DCHECK(log_);
2832 log_->LogFunction( 2824 log_->LogFunction(
2833 function_scope->start_position(), function_scope->end_position(), 2825 function_scope->start_position(), function_scope->end_position(),
2834 *num_parameters, *function_length, *has_duplicate_parameters, 2826 *num_parameters, *function_length, *has_duplicate_parameters,
2835 *materialized_literal_count, *expected_property_count, language_mode(), 2827 *expected_property_count, language_mode(),
2836 function_scope->uses_super_property(), function_scope->calls_eval(), 2828 function_scope->uses_super_property(), function_scope->calls_eval(),
2837 logger->num_inner_functions()); 2829 logger->num_inner_functions());
2838 } 2830 }
2839 return kLazyParsingComplete; 2831 return kLazyParsingComplete;
2840 } 2832 }
2841 2833
2842 2834
2843 Statement* Parser::BuildAssertIsCoercible(Variable* var) { 2835 Statement* Parser::BuildAssertIsCoercible(Variable* var) {
2844 // if (var === null || var === undefined) 2836 // if (var === null || var === undefined)
2845 // throw /* type error kNonCoercible) */; 2837 // throw /* type error kNonCoercible) */;
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
3104 // caused by calling the .throw method on a generator suspended at the 3096 // caused by calling the .throw method on a generator suspended at the
3105 // initial yield (i.e. right after generator instantiation). 3097 // initial yield (i.e. right after generator instantiation).
3106 return factory()->NewYield(generator, assignment, scope()->start_position(), 3098 return factory()->NewYield(generator, assignment, scope()->start_position(),
3107 Yield::kOnExceptionThrow); 3099 Yield::kOnExceptionThrow);
3108 } 3100 }
3109 3101
3110 ZoneList<Statement*>* Parser::ParseFunction( 3102 ZoneList<Statement*>* Parser::ParseFunction(
3111 const AstRawString* function_name, int pos, FunctionKind kind, 3103 const AstRawString* function_name, int pos, FunctionKind kind,
3112 FunctionLiteral::FunctionType function_type, 3104 FunctionLiteral::FunctionType function_type,
3113 DeclarationScope* function_scope, int* num_parameters, int* function_length, 3105 DeclarationScope* function_scope, int* num_parameters, int* function_length,
3114 bool* has_duplicate_parameters, int* materialized_literal_count, 3106 bool* has_duplicate_parameters, int* expected_property_count, bool* ok) {
3115 int* expected_property_count, bool* ok) {
3116 ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY); 3107 ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY);
3117 3108
3118 FunctionState function_state(&function_state_, &scope_state_, function_scope); 3109 FunctionState function_state(&function_state_, &scope_state_, function_scope);
3119 3110
3120 DuplicateFinder duplicate_finder; 3111 DuplicateFinder duplicate_finder;
3121 ExpressionClassifier formals_classifier(this, &duplicate_finder); 3112 ExpressionClassifier formals_classifier(this, &duplicate_finder);
3122 3113
3123 if (IsResumableFunction(kind)) PrepareGeneratorVariables(); 3114 if (IsResumableFunction(kind)) PrepareGeneratorVariables();
3124 3115
3125 ParserFormalParameters formals(function_scope); 3116 ParserFormalParameters formals(function_scope);
(...skipping 17 matching lines...) Expand all
3143 is_sloppy(function_scope->language_mode()) && formals.is_simple && 3134 is_sloppy(function_scope->language_mode()) && formals.is_simple &&
3144 !IsConciseMethod(kind); 3135 !IsConciseMethod(kind);
3145 ValidateFormalParameters(function_scope->language_mode(), 3136 ValidateFormalParameters(function_scope->language_mode(),
3146 allow_duplicate_parameters, CHECK_OK); 3137 allow_duplicate_parameters, CHECK_OK);
3147 3138
3148 RewriteDestructuringAssignments(); 3139 RewriteDestructuringAssignments();
3149 3140
3150 *has_duplicate_parameters = 3141 *has_duplicate_parameters =
3151 !classifier()->is_valid_formal_parameter_list_without_duplicates(); 3142 !classifier()->is_valid_formal_parameter_list_without_duplicates();
3152 3143
3153 *materialized_literal_count = function_state.materialized_literal_count();
3154 *expected_property_count = function_state.expected_property_count(); 3144 *expected_property_count = function_state.expected_property_count();
3155 return body; 3145 return body;
3156 } 3146 }
3157 3147
3158 void Parser::DeclareClassVariable(const AstRawString* name, 3148 void Parser::DeclareClassVariable(const AstRawString* name,
3159 ClassInfo* class_info, int class_token_pos, 3149 ClassInfo* class_info, int class_token_pos,
3160 bool* ok) { 3150 bool* ok) {
3161 #ifdef DEBUG 3151 #ifdef DEBUG
3162 scope()->SetScopeName(name); 3152 scope()->SetScopeName(name);
3163 #endif 3153 #endif
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
3509 3499
3510 expr = factory()->NewBinaryOperation( 3500 expr = factory()->NewBinaryOperation(
3511 Token::ADD, factory()->NewBinaryOperation( 3501 Token::ADD, factory()->NewBinaryOperation(
3512 Token::ADD, expr, middle, expr->position()), 3502 Token::ADD, expr, middle, expr->position()),
3513 cooked_str, sub->position()); 3503 cooked_str, sub->position());
3514 } 3504 }
3515 return expr; 3505 return expr;
3516 } else { 3506 } else {
3517 uint32_t hash = ComputeTemplateLiteralHash(lit); 3507 uint32_t hash = ComputeTemplateLiteralHash(lit);
3518 3508
3519 // cooked and raw indexes.
3520 function_state_->NextMaterializedLiteralIndex();
3521 function_state_->NextMaterializedLiteralIndex();
3522
3523 // $getTemplateCallSite 3509 // $getTemplateCallSite
3524 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(4, zone()); 3510 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(4, zone());
3525 args->Add(factory()->NewArrayLiteral( 3511 args->Add(factory()->NewArrayLiteral(
3526 const_cast<ZoneList<Expression*>*>(cooked_strings), pos), 3512 const_cast<ZoneList<Expression*>*>(cooked_strings), pos),
3527 zone()); 3513 zone());
3528 args->Add(factory()->NewArrayLiteral( 3514 args->Add(factory()->NewArrayLiteral(
3529 const_cast<ZoneList<Expression*>*>(raw_strings), pos), 3515 const_cast<ZoneList<Expression*>*>(raw_strings), pos),
3530 zone()); 3516 zone());
3531 3517
3532 // Truncate hash to Smi-range. 3518 // Truncate hash to Smi-range.
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
3617 int n = list->length(); 3603 int n = list->length();
3618 while (i < n) { 3604 while (i < n) {
3619 if (!list->at(i)->IsSpread()) { 3605 if (!list->at(i)->IsSpread()) {
3620 ZoneList<Expression*>* unspread = 3606 ZoneList<Expression*>* unspread =
3621 new (zone()) ZoneList<Expression*>(1, zone()); 3607 new (zone()) ZoneList<Expression*>(1, zone());
3622 3608
3623 // Push array of unspread parameters 3609 // Push array of unspread parameters
3624 while (i < n && !list->at(i)->IsSpread()) { 3610 while (i < n && !list->at(i)->IsSpread()) {
3625 unspread->Add(list->at(i++), zone()); 3611 unspread->Add(list->at(i++), zone());
3626 } 3612 }
3627 function_state_->NextMaterializedLiteralIndex();
3628 args->Add(factory()->NewArrayLiteral(unspread, kNoSourcePosition), 3613 args->Add(factory()->NewArrayLiteral(unspread, kNoSourcePosition),
3629 zone()); 3614 zone());
3630 3615
3631 if (i == n) break; 3616 if (i == n) break;
3632 } 3617 }
3633 3618
3634 // Push eagerly spread argument 3619 // Push eagerly spread argument
3635 ZoneList<Expression*>* spread_list = 3620 ZoneList<Expression*>* spread_list =
3636 new (zone()) ZoneList<Expression*>(1, zone()); 3621 new (zone()) ZoneList<Expression*>(1, zone());
3637 spread_list->Add(list->at(i++)->AsSpread()->expression(), zone()); 3622 spread_list->Add(list->at(i++)->AsSpread()->expression(), zone());
(...skipping 1380 matching lines...) Expand 10 before | Expand all | Expand 10 after
5018 5003
5019 return final_loop; 5004 return final_loop;
5020 } 5005 }
5021 5006
5022 #undef CHECK_OK 5007 #undef CHECK_OK
5023 #undef CHECK_OK_VOID 5008 #undef CHECK_OK_VOID
5024 #undef CHECK_FAILED 5009 #undef CHECK_FAILED
5025 5010
5026 } // namespace internal 5011 } // namespace internal
5027 } // namespace v8 5012 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698