| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 <cmath> | 5 #include <cmath> |
| 6 | 6 |
| 7 #include "src/allocation.h" | 7 #include "src/allocation.h" |
| 8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
| 9 #include "src/conversions-inl.h" | 9 #include "src/conversions-inl.h" |
| 10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 | 94 |
| 95 // The caller passes the function_scope which is not yet inserted into the | 95 // The caller passes the function_scope which is not yet inserted into the |
| 96 // scope_state_. All scopes above the function_scope are ignored by the | 96 // scope_state_. All scopes above the function_scope are ignored by the |
| 97 // PreParser. | 97 // PreParser. |
| 98 DCHECK_NULL(scope_state_); | 98 DCHECK_NULL(scope_state_); |
| 99 FunctionState function_state(&function_state_, &scope_state_, function_scope); | 99 FunctionState function_state(&function_state_, &scope_state_, function_scope); |
| 100 // This indirection is needed so that we can use the CHECK_OK macros. | 100 // This indirection is needed so that we can use the CHECK_OK macros. |
| 101 bool ok_holder = true; | 101 bool ok_holder = true; |
| 102 bool* ok = &ok_holder; | 102 bool* ok = &ok_holder; |
| 103 | 103 |
| 104 PreParserFormalParameters formals(function_scope); | 104 PreParserFormalParameters* formals = |
| 105 new (zone()) PreParserFormalParameters(function_scope); |
| 105 bool has_duplicate_parameters = false; | 106 bool has_duplicate_parameters = false; |
| 106 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); | 107 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
| 107 std::unique_ptr<ExpressionClassifier> formals_classifier; | 108 std::unique_ptr<ExpressionClassifier> formals_classifier; |
| 108 | 109 |
| 109 // Parse non-arrow function parameters. For arrow functions, the parameters | 110 // Parse non-arrow function parameters. For arrow functions, the parameters |
| 110 // have already been parsed. | 111 // have already been parsed. |
| 111 if (!IsArrowFunction(kind)) { | 112 if (!IsArrowFunction(kind)) { |
| 112 formals_classifier.reset(new ExpressionClassifier(this, &duplicate_finder)); | 113 formals_classifier.reset(new ExpressionClassifier(this, &duplicate_finder)); |
| 113 // We return kPreParseSuccess in failure cases too - errors are retrieved | 114 // We return kPreParseSuccess in failure cases too - errors are retrieved |
| 114 // separately by Parser::SkipLazyFunctionBody. | 115 // separately by Parser::SkipLazyFunctionBody. |
| 115 ParseFormalParameterList(&formals, CHECK_OK_VALUE(kPreParseSuccess)); | 116 ParseFormalParameterList(formals, CHECK_OK_VALUE(kPreParseSuccess)); |
| 116 Expect(Token::RPAREN, CHECK_OK_VALUE(kPreParseSuccess)); | 117 Expect(Token::RPAREN, CHECK_OK_VALUE(kPreParseSuccess)); |
| 117 int formals_end_position = scanner()->location().end_pos; | 118 int formals_end_position = scanner()->location().end_pos; |
| 118 | 119 |
| 119 CheckArityRestrictions( | 120 CheckArityRestrictions(formals->arity, kind, formals->has_rest, |
| 120 formals.arity, kind, formals.has_rest, function_scope->start_position(), | 121 function_scope->start_position(), |
| 121 formals_end_position, CHECK_OK_VALUE(kPreParseSuccess)); | 122 formals_end_position, |
| 123 CHECK_OK_VALUE(kPreParseSuccess)); |
| 122 has_duplicate_parameters = | 124 has_duplicate_parameters = |
| 123 !classifier()->is_valid_formal_parameter_list_without_duplicates(); | 125 !classifier()->is_valid_formal_parameter_list_without_duplicates(); |
| 124 } | 126 } |
| 125 | 127 |
| 126 Expect(Token::LBRACE, CHECK_OK_VALUE(kPreParseSuccess)); | 128 Expect(Token::LBRACE, CHECK_OK_VALUE(kPreParseSuccess)); |
| 127 LazyParsingResult result = ParseStatementListAndLogFunction( | 129 LazyParsingResult result = ParseStatementListAndLogFunction( |
| 128 &formals, has_duplicate_parameters, may_abort, ok); | 130 formals, has_duplicate_parameters, may_abort, ok); |
| 129 use_counts_ = nullptr; | 131 use_counts_ = nullptr; |
| 130 track_unresolved_variables_ = false; | 132 track_unresolved_variables_ = false; |
| 131 if (result == kLazyParsingAborted) { | 133 if (result == kLazyParsingAborted) { |
| 132 return kPreParseAbort; | 134 return kPreParseAbort; |
| 133 } else if (stack_overflow()) { | 135 } else if (stack_overflow()) { |
| 134 return kPreParseStackOverflow; | 136 return kPreParseStackOverflow; |
| 135 } else if (!*ok) { | 137 } else if (!*ok) { |
| 136 DCHECK(pending_error_handler_->has_pending_error()); | 138 DCHECK(pending_error_handler_->has_pending_error()); |
| 137 } else { | 139 } else { |
| 138 DCHECK_EQ(Token::RBRACE, scanner()->peek()); | 140 DCHECK_EQ(Token::RBRACE, scanner()->peek()); |
| 139 | 141 |
| 140 if (!IsArrowFunction(kind)) { | 142 if (!IsArrowFunction(kind)) { |
| 141 // Validate parameter names. We can do this only after parsing the | 143 // Validate parameter names. We can do this only after parsing the |
| 142 // function, since the function can declare itself strict. | 144 // function, since the function can declare itself strict. |
| 143 const bool allow_duplicate_parameters = | 145 const bool allow_duplicate_parameters = |
| 144 is_sloppy(function_scope->language_mode()) && formals.is_simple && | 146 is_sloppy(function_scope->language_mode()) && formals->is_simple && |
| 145 !IsConciseMethod(kind); | 147 !IsConciseMethod(kind); |
| 146 ValidateFormalParameters(function_scope->language_mode(), | 148 ValidateFormalParameters(function_scope->language_mode(), |
| 147 allow_duplicate_parameters, | 149 allow_duplicate_parameters, |
| 148 CHECK_OK_VALUE(kPreParseSuccess)); | 150 CHECK_OK_VALUE(kPreParseSuccess)); |
| 149 } | 151 } |
| 150 | 152 |
| 151 if (is_strict(function_scope->language_mode())) { | 153 if (is_strict(function_scope->language_mode())) { |
| 152 int end_pos = scanner()->location().end_pos; | 154 int end_pos = scanner()->location().end_pos; |
| 153 CheckStrictOctalLiteral(function_scope->start_position(), end_pos, ok); | 155 CheckStrictOctalLiteral(function_scope->start_position(), end_pos, ok); |
| 154 CheckDecimalLiteralWithLeadingZero(function_scope->start_position(), | 156 CheckDecimalLiteralWithLeadingZero(function_scope->start_position(), |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 PreParserStatementList body; | 194 PreParserStatementList body; |
| 193 DeclarationScope* function_scope = NewFunctionScope(kind); | 195 DeclarationScope* function_scope = NewFunctionScope(kind); |
| 194 function_scope->SetLanguageMode(language_mode); | 196 function_scope->SetLanguageMode(language_mode); |
| 195 FunctionState function_state(&function_state_, &scope_state_, function_scope); | 197 FunctionState function_state(&function_state_, &scope_state_, function_scope); |
| 196 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); | 198 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
| 197 ExpressionClassifier formals_classifier(this, &duplicate_finder); | 199 ExpressionClassifier formals_classifier(this, &duplicate_finder); |
| 198 | 200 |
| 199 Expect(Token::LPAREN, CHECK_OK); | 201 Expect(Token::LPAREN, CHECK_OK); |
| 200 int start_position = scanner()->location().beg_pos; | 202 int start_position = scanner()->location().beg_pos; |
| 201 function_scope->set_start_position(start_position); | 203 function_scope->set_start_position(start_position); |
| 202 PreParserFormalParameters formals(function_scope); | 204 PreParserFormalParameters* formals = |
| 203 ParseFormalParameterList(&formals, CHECK_OK); | 205 new (zone()) PreParserFormalParameters(function_scope); |
| 206 ParseFormalParameterList(formals, CHECK_OK); |
| 204 Expect(Token::RPAREN, CHECK_OK); | 207 Expect(Token::RPAREN, CHECK_OK); |
| 205 int formals_end_position = scanner()->location().end_pos; | 208 int formals_end_position = scanner()->location().end_pos; |
| 206 | 209 |
| 207 CheckArityRestrictions(formals.arity, kind, formals.has_rest, start_position, | 210 CheckArityRestrictions(formals->arity, kind, formals->has_rest, |
| 208 formals_end_position, CHECK_OK); | 211 start_position, formals_end_position, CHECK_OK); |
| 209 | 212 |
| 210 Expect(Token::LBRACE, CHECK_OK); | 213 Expect(Token::LBRACE, CHECK_OK); |
| 211 ParseStatementList(body, Token::RBRACE, CHECK_OK); | 214 ParseStatementList(body, Token::RBRACE, CHECK_OK); |
| 212 Expect(Token::RBRACE, CHECK_OK); | 215 Expect(Token::RBRACE, CHECK_OK); |
| 213 | 216 |
| 214 // Parsing the body may change the language mode in our scope. | 217 // Parsing the body may change the language mode in our scope. |
| 215 language_mode = function_scope->language_mode(); | 218 language_mode = function_scope->language_mode(); |
| 216 | 219 |
| 217 // Validate name and parameter names. We can do this only after parsing the | 220 // Validate name and parameter names. We can do this only after parsing the |
| 218 // function, since the function can declare itself strict. | 221 // function, since the function can declare itself strict. |
| 219 CheckFunctionName(language_mode, function_name, function_name_validity, | 222 CheckFunctionName(language_mode, function_name, function_name_validity, |
| 220 function_name_location, CHECK_OK); | 223 function_name_location, CHECK_OK); |
| 221 const bool allow_duplicate_parameters = | 224 const bool allow_duplicate_parameters = |
| 222 is_sloppy(language_mode) && formals.is_simple && !IsConciseMethod(kind); | 225 is_sloppy(language_mode) && formals->is_simple && !IsConciseMethod(kind); |
| 223 ValidateFormalParameters(language_mode, allow_duplicate_parameters, CHECK_OK); | 226 ValidateFormalParameters(language_mode, allow_duplicate_parameters, CHECK_OK); |
| 224 | 227 |
| 225 int end_position = scanner()->location().end_pos; | 228 int end_position = scanner()->location().end_pos; |
| 226 if (is_strict(language_mode)) { | 229 if (is_strict(language_mode)) { |
| 227 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); | 230 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); |
| 228 CheckDecimalLiteralWithLeadingZero(start_position, end_position); | 231 CheckDecimalLiteralWithLeadingZero(start_position, end_position); |
| 229 } | 232 } |
| 230 function_scope->set_end_position(end_position); | 233 function_scope->set_end_position(end_position); |
| 231 | 234 |
| 232 if (FLAG_trace_preparse) { | 235 if (FLAG_trace_preparse) { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 } | 303 } |
| 301 } | 304 } |
| 302 } | 305 } |
| 303 | 306 |
| 304 #undef CHECK_OK | 307 #undef CHECK_OK |
| 305 #undef CHECK_OK_CUSTOM | 308 #undef CHECK_OK_CUSTOM |
| 306 | 309 |
| 307 | 310 |
| 308 } // namespace internal | 311 } // namespace internal |
| 309 } // namespace v8 | 312 } // namespace v8 |
| OLD | NEW |