| 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 #ifndef V8_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
| 7 | 7 |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/base/hashmap.h" | 10 #include "src/base/hashmap.h" |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 return next_materialized_literal_index_; | 383 return next_materialized_literal_index_; |
| 384 } | 384 } |
| 385 | 385 |
| 386 void SkipMaterializedLiterals(int count) { | 386 void SkipMaterializedLiterals(int count) { |
| 387 next_materialized_literal_index_ += count; | 387 next_materialized_literal_index_ += count; |
| 388 } | 388 } |
| 389 | 389 |
| 390 void AddProperty() { expected_property_count_++; } | 390 void AddProperty() { expected_property_count_++; } |
| 391 int expected_property_count() { return expected_property_count_; } | 391 int expected_property_count() { return expected_property_count_; } |
| 392 | 392 |
| 393 Scanner::Location this_location() const { return this_location_; } | |
| 394 Scanner::Location super_location() const { return super_location_; } | |
| 395 Scanner::Location return_location() const { return return_location_; } | |
| 396 void set_this_location(Scanner::Location location) { | |
| 397 this_location_ = location; | |
| 398 } | |
| 399 void set_super_location(Scanner::Location location) { | |
| 400 super_location_ = location; | |
| 401 } | |
| 402 void set_return_location(Scanner::Location location) { | |
| 403 return_location_ = location; | |
| 404 } | |
| 405 | |
| 406 bool is_generator() const { return IsGeneratorFunction(kind_); } | 393 bool is_generator() const { return IsGeneratorFunction(kind_); } |
| 407 bool is_async_function() const { return IsAsyncFunction(kind_); } | 394 bool is_async_function() const { return IsAsyncFunction(kind_); } |
| 408 bool is_resumable() const { return is_generator() || is_async_function(); } | 395 bool is_resumable() const { return is_generator() || is_async_function(); } |
| 409 | 396 |
| 410 FunctionKind kind() const { return kind_; } | 397 FunctionKind kind() const { return kind_; } |
| 411 FunctionState* outer() const { return outer_function_state_; } | 398 FunctionState* outer() const { return outer_function_state_; } |
| 412 | 399 |
| 413 void set_generator_object_variable( | 400 void set_generator_object_variable( |
| 414 typename Traits::Type::GeneratorVariable* variable) { | 401 typename Traits::Type::GeneratorVariable* variable) { |
| 415 DCHECK(variable != NULL); | 402 DCHECK(variable != NULL); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 } | 467 } |
| 481 | 468 |
| 482 // Used to assign an index to each literal that needs materialization in | 469 // Used to assign an index to each literal that needs materialization in |
| 483 // the function. Includes regexp literals, and boilerplate for object and | 470 // the function. Includes regexp literals, and boilerplate for object and |
| 484 // array literals. | 471 // array literals. |
| 485 int next_materialized_literal_index_; | 472 int next_materialized_literal_index_; |
| 486 | 473 |
| 487 // Properties count estimation. | 474 // Properties count estimation. |
| 488 int expected_property_count_; | 475 int expected_property_count_; |
| 489 | 476 |
| 490 // Location of most recent use of 'this' (invalid if none). | |
| 491 Scanner::Location this_location_; | |
| 492 | |
| 493 // Location of most recent 'return' statement (invalid if none). | |
| 494 Scanner::Location return_location_; | |
| 495 | |
| 496 // Location of call to the "super" constructor (invalid if none). | |
| 497 Scanner::Location super_location_; | |
| 498 | |
| 499 FunctionKind kind_; | 477 FunctionKind kind_; |
| 500 // For generators, this variable may hold the generator object. It variable | 478 // For generators, this variable may hold the generator object. It variable |
| 501 // is used by yield expressions and return statements. It is not necessary | 479 // is used by yield expressions and return statements. It is not necessary |
| 502 // for generator functions to have this variable set. | 480 // for generator functions to have this variable set. |
| 503 Variable* generator_object_variable_; | 481 Variable* generator_object_variable_; |
| 504 | 482 |
| 505 FunctionState** function_state_stack_; | 483 FunctionState** function_state_stack_; |
| 506 FunctionState* outer_function_state_; | 484 FunctionState* outer_function_state_; |
| 507 | 485 |
| 508 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; | 486 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; |
| (...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1245 bool allow_harmony_trailing_commas_; | 1223 bool allow_harmony_trailing_commas_; |
| 1246 }; | 1224 }; |
| 1247 | 1225 |
| 1248 template <class Traits> | 1226 template <class Traits> |
| 1249 ParserBase<Traits>::FunctionState::FunctionState( | 1227 ParserBase<Traits>::FunctionState::FunctionState( |
| 1250 FunctionState** function_state_stack, ScopeState** scope_stack, | 1228 FunctionState** function_state_stack, ScopeState** scope_stack, |
| 1251 Scope* scope, FunctionKind kind) | 1229 Scope* scope, FunctionKind kind) |
| 1252 : ScopeState(scope_stack, scope), | 1230 : ScopeState(scope_stack, scope), |
| 1253 next_materialized_literal_index_(0), | 1231 next_materialized_literal_index_(0), |
| 1254 expected_property_count_(0), | 1232 expected_property_count_(0), |
| 1255 this_location_(Scanner::Location::invalid()), | |
| 1256 return_location_(Scanner::Location::invalid()), | |
| 1257 super_location_(Scanner::Location::invalid()), | |
| 1258 kind_(kind), | 1233 kind_(kind), |
| 1259 generator_object_variable_(NULL), | 1234 generator_object_variable_(NULL), |
| 1260 function_state_stack_(function_state_stack), | 1235 function_state_stack_(function_state_stack), |
| 1261 outer_function_state_(*function_state_stack), | 1236 outer_function_state_(*function_state_stack), |
| 1262 destructuring_assignments_to_rewrite_(16, scope->zone()), | 1237 destructuring_assignments_to_rewrite_(16, scope->zone()), |
| 1263 tail_call_expressions_(scope->zone()), | 1238 tail_call_expressions_(scope->zone()), |
| 1264 return_expr_context_(ReturnExprContext::kInsideValidBlock), | 1239 return_expr_context_(ReturnExprContext::kInsideValidBlock), |
| 1265 non_patterns_to_rewrite_(0, scope->zone()), | 1240 non_patterns_to_rewrite_(0, scope->zone()), |
| 1266 reported_errors_(16, scope->zone()), | 1241 reported_errors_(16, scope->zone()), |
| 1267 next_function_is_parenthesized_(false), | 1242 next_function_is_parenthesized_(false), |
| (...skipping 1826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3094 IsClassConstructor(kind)) { | 3069 IsClassConstructor(kind)) { |
| 3095 if (peek() == Token::PERIOD || peek() == Token::LBRACK) { | 3070 if (peek() == Token::PERIOD || peek() == Token::LBRACK) { |
| 3096 scope->RecordSuperPropertyUsage(); | 3071 scope->RecordSuperPropertyUsage(); |
| 3097 return this->NewSuperPropertyReference(this->scope(), factory(), pos); | 3072 return this->NewSuperPropertyReference(this->scope(), factory(), pos); |
| 3098 } | 3073 } |
| 3099 // new super() is never allowed. | 3074 // new super() is never allowed. |
| 3100 // super() is only allowed in derived constructor | 3075 // super() is only allowed in derived constructor |
| 3101 if (!is_new && peek() == Token::LPAREN && IsSubclassConstructor(kind)) { | 3076 if (!is_new && peek() == Token::LPAREN && IsSubclassConstructor(kind)) { |
| 3102 // TODO(rossberg): This might not be the correct FunctionState for the | 3077 // TODO(rossberg): This might not be the correct FunctionState for the |
| 3103 // method here. | 3078 // method here. |
| 3104 function_state_->set_super_location(scanner()->location()); | |
| 3105 return this->NewSuperCallReference(this->scope(), factory(), pos); | 3079 return this->NewSuperCallReference(this->scope(), factory(), pos); |
| 3106 } | 3080 } |
| 3107 } | 3081 } |
| 3108 | 3082 |
| 3109 ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); | 3083 ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); |
| 3110 *ok = false; | 3084 *ok = false; |
| 3111 return this->EmptyExpression(); | 3085 return this->EmptyExpression(); |
| 3112 } | 3086 } |
| 3113 | 3087 |
| 3114 template <class Traits> | 3088 template <class Traits> |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3368 // If next token is not `=>`, it's a syntax error anyways. | 3342 // If next token is not `=>`, it's a syntax error anyways. |
| 3369 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); | 3343 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); |
| 3370 *ok = false; | 3344 *ok = false; |
| 3371 return this->EmptyExpression(); | 3345 return this->EmptyExpression(); |
| 3372 } | 3346 } |
| 3373 | 3347 |
| 3374 typename Traits::Type::StatementList body; | 3348 typename Traits::Type::StatementList body; |
| 3375 int num_parameters = formal_parameters.scope->num_parameters(); | 3349 int num_parameters = formal_parameters.scope->num_parameters(); |
| 3376 int materialized_literal_count = -1; | 3350 int materialized_literal_count = -1; |
| 3377 int expected_property_count = -1; | 3351 int expected_property_count = -1; |
| 3378 Scanner::Location super_loc; | |
| 3379 | 3352 |
| 3380 FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction; | 3353 FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction; |
| 3381 { | 3354 { |
| 3382 FunctionState function_state(&function_state_, &scope_state_, | 3355 FunctionState function_state(&function_state_, &scope_state_, |
| 3383 formal_parameters.scope, arrow_kind); | 3356 formal_parameters.scope, arrow_kind); |
| 3384 | 3357 |
| 3385 function_state.SkipMaterializedLiterals( | 3358 function_state.SkipMaterializedLiterals( |
| 3386 formal_parameters.materialized_literals_count); | 3359 formal_parameters.materialized_literals_count); |
| 3387 | 3360 |
| 3388 this->ReindexLiterals(formal_parameters); | 3361 this->ReindexLiterals(formal_parameters); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3432 body->Add(factory()->NewReturnStatement(expression, pos), zone()); | 3405 body->Add(factory()->NewReturnStatement(expression, pos), zone()); |
| 3433 if (allow_tailcalls() && !is_sloppy(language_mode())) { | 3406 if (allow_tailcalls() && !is_sloppy(language_mode())) { |
| 3434 // ES6 14.6.1 Static Semantics: IsInTailPosition | 3407 // ES6 14.6.1 Static Semantics: IsInTailPosition |
| 3435 this->MarkTailPosition(expression); | 3408 this->MarkTailPosition(expression); |
| 3436 } | 3409 } |
| 3437 } | 3410 } |
| 3438 materialized_literal_count = function_state.materialized_literal_count(); | 3411 materialized_literal_count = function_state.materialized_literal_count(); |
| 3439 expected_property_count = function_state.expected_property_count(); | 3412 expected_property_count = function_state.expected_property_count(); |
| 3440 this->MarkCollectedTailCallExpressions(); | 3413 this->MarkCollectedTailCallExpressions(); |
| 3441 } | 3414 } |
| 3442 super_loc = function_state.super_location(); | |
| 3443 | 3415 |
| 3444 formal_parameters.scope->set_end_position(scanner()->location().end_pos); | 3416 formal_parameters.scope->set_end_position(scanner()->location().end_pos); |
| 3445 | 3417 |
| 3446 // Arrow function formal parameters are parsed as StrictFormalParameterList, | 3418 // Arrow function formal parameters are parsed as StrictFormalParameterList, |
| 3447 // which is not the same as "parameters of a strict function"; it only means | 3419 // which is not the same as "parameters of a strict function"; it only means |
| 3448 // that duplicates are not allowed. Of course, the arrow function may | 3420 // that duplicates are not allowed. Of course, the arrow function may |
| 3449 // itself be strict as well. | 3421 // itself be strict as well. |
| 3450 const bool allow_duplicate_parameters = false; | 3422 const bool allow_duplicate_parameters = false; |
| 3451 this->ValidateFormalParameters(&formals_classifier, language_mode(), | 3423 this->ValidateFormalParameters(&formals_classifier, language_mode(), |
| 3452 allow_duplicate_parameters, CHECK_OK); | 3424 allow_duplicate_parameters, CHECK_OK); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3464 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( | 3436 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( |
| 3465 this->EmptyIdentifierString(), formal_parameters.scope, body, | 3437 this->EmptyIdentifierString(), formal_parameters.scope, body, |
| 3466 materialized_literal_count, expected_property_count, num_parameters, | 3438 materialized_literal_count, expected_property_count, num_parameters, |
| 3467 FunctionLiteral::kNoDuplicateParameters, | 3439 FunctionLiteral::kNoDuplicateParameters, |
| 3468 FunctionLiteral::kAnonymousExpression, | 3440 FunctionLiteral::kAnonymousExpression, |
| 3469 FunctionLiteral::kShouldLazyCompile, arrow_kind, | 3441 FunctionLiteral::kShouldLazyCompile, arrow_kind, |
| 3470 formal_parameters.scope->start_position()); | 3442 formal_parameters.scope->start_position()); |
| 3471 | 3443 |
| 3472 function_literal->set_function_token_position( | 3444 function_literal->set_function_token_position( |
| 3473 formal_parameters.scope->start_position()); | 3445 formal_parameters.scope->start_position()); |
| 3474 if (super_loc.IsValid()) function_state_->set_super_location(super_loc); | |
| 3475 | 3446 |
| 3476 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); | 3447 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); |
| 3477 | 3448 |
| 3478 return function_literal; | 3449 return function_literal; |
| 3479 } | 3450 } |
| 3480 | 3451 |
| 3481 | 3452 |
| 3482 template <typename Traits> | 3453 template <typename Traits> |
| 3483 typename ParserBase<Traits>::ExpressionT | 3454 typename ParserBase<Traits>::ExpressionT |
| 3484 ParserBase<Traits>::ParseTemplateLiteral(ExpressionT tag, int start, | 3455 ParserBase<Traits>::ParseTemplateLiteral(ExpressionT tag, int start, |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3689 has_seen_constructor_ = true; | 3660 has_seen_constructor_ = true; |
| 3690 return; | 3661 return; |
| 3691 } | 3662 } |
| 3692 } | 3663 } |
| 3693 | 3664 |
| 3694 | 3665 |
| 3695 } // namespace internal | 3666 } // namespace internal |
| 3696 } // namespace v8 | 3667 } // namespace v8 |
| 3697 | 3668 |
| 3698 #endif // V8_PARSING_PARSER_BASE_H | 3669 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |