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 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
512 scanner_(info->unicode_cache()), | 512 scanner_(info->unicode_cache()), |
513 reusable_preparser_(nullptr), | 513 reusable_preparser_(nullptr), |
514 original_scope_(nullptr), | 514 original_scope_(nullptr), |
515 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. | 515 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. |
516 target_stack_(nullptr), | 516 target_stack_(nullptr), |
517 compile_options_(info->compile_options()), | 517 compile_options_(info->compile_options()), |
518 cached_parse_data_(nullptr), | 518 cached_parse_data_(nullptr), |
519 total_preparse_skipped_(0), | 519 total_preparse_skipped_(0), |
520 temp_zoned_(false), | 520 temp_zoned_(false), |
521 log_(nullptr), | 521 log_(nullptr), |
522 preparsed_scope_data_(info->preparsed_scope_data()) { | 522 preparsed_scope_data_(info->preparsed_scope_data()), |
523 parameters_end_pos_(info->parameters_end_pos()) { | |
523 // Even though we were passed ParseInfo, we should not store it in | 524 // Even though we were passed ParseInfo, we should not store it in |
524 // Parser - this makes sure that Isolate is not accidentally accessed via | 525 // Parser - this makes sure that Isolate is not accidentally accessed via |
525 // ParseInfo during background parsing. | 526 // ParseInfo during background parsing. |
526 DCHECK(!info->script().is_null() || info->source_stream() != nullptr || | 527 DCHECK(!info->script().is_null() || info->source_stream() != nullptr || |
527 info->character_stream() != nullptr); | 528 info->character_stream() != nullptr); |
528 // Determine if functions can be lazily compiled. This is necessary to | 529 // Determine if functions can be lazily compiled. This is necessary to |
529 // allow some of our builtin JS files to be lazily compiled. These | 530 // allow some of our builtin JS files to be lazily compiled. These |
530 // builtins cannot be handled lazily by the parser, since we have to know | 531 // builtins cannot be handled lazily by the parser, since we have to know |
531 // if a function uses the special natives syntax, which is something the | 532 // if a function uses the special natives syntax, which is something the |
532 // parser records. | 533 // parser records. |
(...skipping 2202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2735 } | 2736 } |
2736 return function_literal; | 2737 return function_literal; |
2737 } | 2738 } |
2738 | 2739 |
2739 Parser::LazyParsingResult Parser::SkipFunction( | 2740 Parser::LazyParsingResult Parser::SkipFunction( |
2740 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters, | 2741 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters, |
2741 int* function_length, bool* has_duplicate_parameters, | 2742 int* function_length, bool* has_duplicate_parameters, |
2742 int* materialized_literal_count, int* expected_property_count, | 2743 int* materialized_literal_count, int* expected_property_count, |
2743 bool is_inner_function, bool may_abort, bool* ok) { | 2744 bool is_inner_function, bool may_abort, bool* ok) { |
2744 DCHECK_NE(kNoSourcePosition, function_scope->start_position()); | 2745 DCHECK_NE(kNoSourcePosition, function_scope->start_position()); |
2746 DCHECK_EQ(kNoSourcePosition, parameters_end_pos_); | |
2745 if (produce_cached_parse_data()) CHECK(log_); | 2747 if (produce_cached_parse_data()) CHECK(log_); |
2746 | 2748 |
2747 DCHECK_IMPLIES(IsArrowFunction(kind), | 2749 DCHECK_IMPLIES(IsArrowFunction(kind), |
2748 scanner()->current_token() == Token::ARROW); | 2750 scanner()->current_token() == Token::ARROW); |
2749 | 2751 |
2750 // Inner functions are not part of the cached data. | 2752 // Inner functions are not part of the cached data. |
2751 if (!is_inner_function && consume_cached_parse_data() && | 2753 if (!is_inner_function && consume_cached_parse_data() && |
2752 !cached_parse_data_->rejected()) { | 2754 !cached_parse_data_->rejected()) { |
2753 // If we have cached data, we use it to skip parsing the function. The data | 2755 // 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. | 2756 // contains the information we need to construct the lazy function. |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3115 int* expected_property_count, bool* ok) { | 3117 int* expected_property_count, bool* ok) { |
3116 ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY); | 3118 ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY); |
3117 | 3119 |
3118 FunctionState function_state(&function_state_, &scope_state_, function_scope); | 3120 FunctionState function_state(&function_state_, &scope_state_, function_scope); |
3119 | 3121 |
3120 DuplicateFinder duplicate_finder; | 3122 DuplicateFinder duplicate_finder; |
3121 ExpressionClassifier formals_classifier(this, &duplicate_finder); | 3123 ExpressionClassifier formals_classifier(this, &duplicate_finder); |
3122 | 3124 |
3123 if (IsResumableFunction(kind)) PrepareGeneratorVariables(); | 3125 if (IsResumableFunction(kind)) PrepareGeneratorVariables(); |
3124 | 3126 |
3127 int expected_parameters_end_pos = parameters_end_pos_; | |
3128 if (expected_parameters_end_pos != kNoSourcePosition) { | |
3129 // This is the first function encountered in a CreateDynamicFunction eval. | |
3130 parameters_end_pos_ = kNoSourcePosition; | |
3131 // The function name should have been ignored, giving us the empty string | |
3132 // here. | |
3133 DCHECK_EQ(function_name, ast_value_factory()->empty_string()); | |
3134 } | |
3135 | |
3125 ParserFormalParameters formals(function_scope); | 3136 ParserFormalParameters formals(function_scope); |
3126 ParseFormalParameterList(&formals, CHECK_OK); | 3137 ParseFormalParameterList(&formals, CHECK_OK); |
3138 if (expected_parameters_end_pos != kNoSourcePosition) { | |
3139 // Check for '(' or ')' shenanigans in the parameter string for dynamic | |
3140 // functions. | |
3141 int position = peek_position(); | |
3142 if (position < expected_parameters_end_pos) { | |
3143 ReportMessageAt(Scanner::Location(position, position + 1), | |
3144 MessageTemplate::kArgStringTerminatesParametersEarly); | |
3145 *ok = false; | |
3146 return nullptr; | |
3147 } else if (position > expected_parameters_end_pos) { | |
Dan Ehrenberg
2017/02/13 17:32:32
Optional: This branch will always be taken if we r
jwolfe
2017/02/13 21:31:05
The case where position == expected_parameters_end
| |
3148 ReportMessageAt(Scanner::Location(expected_parameters_end_pos - 2, | |
3149 expected_parameters_end_pos), | |
3150 MessageTemplate::kUnexpectedEndOfArgString); | |
3151 *ok = false; | |
3152 return nullptr; | |
3153 } | |
3154 } | |
3127 Expect(Token::RPAREN, CHECK_OK); | 3155 Expect(Token::RPAREN, CHECK_OK); |
3128 int formals_end_position = scanner()->location().end_pos; | 3156 int formals_end_position = scanner()->location().end_pos; |
3129 *num_parameters = formals.num_parameters(); | 3157 *num_parameters = formals.num_parameters(); |
3130 *function_length = formals.function_length; | 3158 *function_length = formals.function_length; |
3131 | 3159 |
3132 CheckArityRestrictions(formals.arity, kind, formals.has_rest, | 3160 CheckArityRestrictions(formals.arity, kind, formals.has_rest, |
3133 function_scope->start_position(), formals_end_position, | 3161 function_scope->start_position(), formals_end_position, |
3134 CHECK_OK); | 3162 CHECK_OK); |
3135 Expect(Token::LBRACE, CHECK_OK); | 3163 Expect(Token::LBRACE, CHECK_OK); |
3136 | 3164 |
(...skipping 1881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5018 | 5046 |
5019 return final_loop; | 5047 return final_loop; |
5020 } | 5048 } |
5021 | 5049 |
5022 #undef CHECK_OK | 5050 #undef CHECK_OK |
5023 #undef CHECK_OK_VOID | 5051 #undef CHECK_OK_VOID |
5024 #undef CHECK_FAILED | 5052 #undef CHECK_FAILED |
5025 | 5053 |
5026 } // namespace internal | 5054 } // namespace internal |
5027 } // namespace v8 | 5055 } // namespace v8 |
OLD | NEW |