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

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

Issue 2156303002: Implement new Function.prototype.toString and fix CreateDynamicFunction parsing (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
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 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 scanner_(info->unicode_cache()), 509 scanner_(info->unicode_cache()),
510 reusable_preparser_(nullptr), 510 reusable_preparser_(nullptr),
511 original_scope_(nullptr), 511 original_scope_(nullptr),
512 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. 512 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly.
513 target_stack_(nullptr), 513 target_stack_(nullptr),
514 compile_options_(info->compile_options()), 514 compile_options_(info->compile_options()),
515 cached_parse_data_(nullptr), 515 cached_parse_data_(nullptr),
516 total_preparse_skipped_(0), 516 total_preparse_skipped_(0),
517 temp_zoned_(false), 517 temp_zoned_(false),
518 log_(nullptr), 518 log_(nullptr),
519 preparsed_scope_data_(info->preparsed_scope_data()) { 519 preparsed_scope_data_(info->preparsed_scope_data()),
520 parameters_end_pos_(info->parameters_end_pos()) {
520 // Even though we were passed ParseInfo, we should not store it in 521 // Even though we were passed ParseInfo, we should not store it in
521 // Parser - this makes sure that Isolate is not accidentally accessed via 522 // Parser - this makes sure that Isolate is not accidentally accessed via
522 // ParseInfo during background parsing. 523 // ParseInfo during background parsing.
523 DCHECK(!info->script().is_null() || info->source_stream() != nullptr || 524 DCHECK(!info->script().is_null() || info->source_stream() != nullptr ||
524 info->character_stream() != nullptr); 525 info->character_stream() != nullptr);
525 // Determine if functions can be lazily compiled. This is necessary to 526 // Determine if functions can be lazily compiled. This is necessary to
526 // allow some of our builtin JS files to be lazily compiled. These 527 // allow some of our builtin JS files to be lazily compiled. These
527 // builtins cannot be handled lazily by the parser, since we have to know 528 // builtins cannot be handled lazily by the parser, since we have to know
528 // if a function uses the special natives syntax, which is something the 529 // if a function uses the special natives syntax, which is something the
529 // parser records. 530 // parser records.
(...skipping 2212 matching lines...) Expand 10 before | Expand all | Expand 10 after
2742 } 2743 }
2743 return function_literal; 2744 return function_literal;
2744 } 2745 }
2745 2746
2746 Parser::LazyParsingResult Parser::SkipFunction( 2747 Parser::LazyParsingResult Parser::SkipFunction(
2747 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters, 2748 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters,
2748 int* function_length, bool* has_duplicate_parameters, 2749 int* function_length, bool* has_duplicate_parameters,
2749 int* expected_property_count, bool is_inner_function, bool may_abort, 2750 int* expected_property_count, bool is_inner_function, bool may_abort,
2750 bool* ok) { 2751 bool* ok) {
2751 DCHECK_NE(kNoSourcePosition, function_scope->start_position()); 2752 DCHECK_NE(kNoSourcePosition, function_scope->start_position());
2753 DCHECK_EQ(kNoSourcePosition, parameters_end_pos_);
2752 if (produce_cached_parse_data()) CHECK(log_); 2754 if (produce_cached_parse_data()) CHECK(log_);
2753 2755
2754 DCHECK_IMPLIES(IsArrowFunction(kind), 2756 DCHECK_IMPLIES(IsArrowFunction(kind),
2755 scanner()->current_token() == Token::ARROW); 2757 scanner()->current_token() == Token::ARROW);
2756 2758
2757 // Inner functions are not part of the cached data. 2759 // Inner functions are not part of the cached data.
2758 if (!is_inner_function && consume_cached_parse_data() && 2760 if (!is_inner_function && consume_cached_parse_data() &&
2759 !cached_parse_data_->rejected()) { 2761 !cached_parse_data_->rejected()) {
2760 // If we have cached data, we use it to skip parsing the function. The data 2762 // If we have cached data, we use it to skip parsing the function. The data
2761 // contains the information we need to construct the lazy function. 2763 // contains the information we need to construct the lazy function.
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
3120 bool* has_duplicate_parameters, int* expected_property_count, bool* ok) { 3122 bool* has_duplicate_parameters, int* expected_property_count, bool* ok) {
3121 ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY); 3123 ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY);
3122 3124
3123 FunctionState function_state(&function_state_, &scope_state_, function_scope); 3125 FunctionState function_state(&function_state_, &scope_state_, function_scope);
3124 3126
3125 DuplicateFinder duplicate_finder; 3127 DuplicateFinder duplicate_finder;
3126 ExpressionClassifier formals_classifier(this, &duplicate_finder); 3128 ExpressionClassifier formals_classifier(this, &duplicate_finder);
3127 3129
3128 if (IsResumableFunction(kind)) PrepareGeneratorVariables(); 3130 if (IsResumableFunction(kind)) PrepareGeneratorVariables();
3129 3131
3132 int expected_parameters_end_pos = parameters_end_pos_;
3133 if (expected_parameters_end_pos != kNoSourcePosition) {
3134 // This is the first function encountered in a CreateDynamicFunction eval.
3135 parameters_end_pos_ = kNoSourcePosition;
3136 // The function name should have been ignored, giving us the empty string
3137 // here.
3138 DCHECK_EQ(function_name, ast_value_factory()->empty_string());
3139 }
3140
3130 ParserFormalParameters formals(function_scope); 3141 ParserFormalParameters formals(function_scope);
3131 ParseFormalParameterList(&formals, CHECK_OK); 3142 ParseFormalParameterList(&formals, CHECK_OK);
3143 if (expected_parameters_end_pos != kNoSourcePosition) {
3144 // Check for '(' or ')' shenanigans in the parameter string for dynamic
3145 // functions.
3146 int position = peek_position();
3147 if (position < expected_parameters_end_pos) {
3148 ReportMessageAt(Scanner::Location(position, position + 1),
3149 MessageTemplate::kArgStringTerminatesParametersEarly);
3150 *ok = false;
3151 return nullptr;
3152 } else if (position > expected_parameters_end_pos) {
3153 ReportMessageAt(Scanner::Location(expected_parameters_end_pos - 2,
3154 expected_parameters_end_pos),
3155 MessageTemplate::kUnexpectedEndOfArgString);
3156 *ok = false;
3157 return nullptr;
3158 }
3159 }
3132 Expect(Token::RPAREN, CHECK_OK); 3160 Expect(Token::RPAREN, CHECK_OK);
3133 int formals_end_position = scanner()->location().end_pos; 3161 int formals_end_position = scanner()->location().end_pos;
3134 *num_parameters = formals.num_parameters(); 3162 *num_parameters = formals.num_parameters();
3135 *function_length = formals.function_length; 3163 *function_length = formals.function_length;
3136 3164
3137 CheckArityRestrictions(formals.arity, kind, formals.has_rest, 3165 CheckArityRestrictions(formals.arity, kind, formals.has_rest,
3138 function_scope->start_position(), formals_end_position, 3166 function_scope->start_position(), formals_end_position,
3139 CHECK_OK); 3167 CHECK_OK);
3140 Expect(Token::LBRACE, CHECK_OK); 3168 Expect(Token::LBRACE, CHECK_OK);
3141 3169
(...skipping 1894 matching lines...) Expand 10 before | Expand all | Expand 10 after
5036 5064
5037 return final_loop; 5065 return final_loop;
5038 } 5066 }
5039 5067
5040 #undef CHECK_OK 5068 #undef CHECK_OK
5041 #undef CHECK_OK_VOID 5069 #undef CHECK_OK_VOID
5042 #undef CHECK_FAILED 5070 #undef CHECK_FAILED
5043 5071
5044 } // namespace internal 5072 } // namespace internal
5045 } // namespace v8 5073 } // 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