| 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_PREPARSER_H | 5 #ifndef V8_PARSING_PREPARSER_H |
| 6 #define V8_PARSING_PREPARSER_H | 6 #define V8_PARSING_PREPARSER_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/hashmap.h" | 10 #include "src/hashmap.h" |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 | 429 |
| 430 | 430 |
| 431 class PreParserFormalParameter { | 431 class PreParserFormalParameter { |
| 432 public: | 432 public: |
| 433 static PreParserFormalParameter Named() { | 433 static PreParserFormalParameter Named() { |
| 434 return PreParserFormalParameter(false, false); | 434 return PreParserFormalParameter(false, false); |
| 435 } | 435 } |
| 436 V8_INLINE static PreParserFormalParameter Unnamed(const PreParserType& type); | 436 V8_INLINE static PreParserFormalParameter Unnamed(const PreParserType& type); |
| 437 | 437 |
| 438 bool IsValidType() const { return valid_type_; } | 438 bool IsValidType() const { return valid_type_; } |
| 439 bool IsSimpleIdentifier() const { return simple_identifier_; } | 439 bool IsValidBindingIdentifierOrPattern() const { return valid_binder_; } |
| 440 | 440 |
| 441 private: | 441 private: |
| 442 PreParserFormalParameter(bool valid, bool simple) | 442 PreParserFormalParameter(bool valid_type, bool valid_binder) |
| 443 : valid_type_(valid), simple_identifier_(simple) {} | 443 : valid_type_(valid_type), valid_binder_(valid_binder) {} |
| 444 | 444 |
| 445 bool valid_type_; | 445 bool valid_type_; |
| 446 bool simple_identifier_; | 446 bool valid_binder_; |
| 447 }; | 447 }; |
| 448 | 448 |
| 449 | 449 |
| 450 typedef PreParserList<PreParserTypeParameter> PreParserTypeParameters; | 450 typedef PreParserList<PreParserTypeParameter> PreParserTypeParameters; |
| 451 | 451 |
| 452 | 452 |
| 453 class PreParserFormalParameters | 453 class PreParserFormalParameters |
| 454 : public PreParserList<PreParserFormalParameter> { | 454 : public PreParserList<PreParserFormalParameter> { |
| 455 public: | 455 public: |
| 456 explicit PreParserFormalParameters(bool valid = false, int arity = 0) | 456 explicit PreParserFormalParameters(bool valid = false, int arity = 0) |
| 457 : PreParserList<PreParserFormalParameter>(arity), valid_type_(valid) {} | 457 : PreParserList<PreParserFormalParameter>(arity), valid_type_(valid) {} |
| 458 | 458 |
| 459 PreParserFormalParameters* operator->() { return this; } | 459 PreParserFormalParameters* operator->() { return this; } |
| 460 | 460 |
| 461 void Add(const PreParserFormalParameter& param, void* dummy) { | 461 void Add(const PreParserFormalParameter& param, void* dummy) { |
| 462 PreParserList<PreParserFormalParameter>::Add(param, dummy); | 462 PreParserList<PreParserFormalParameter>::Add(param, dummy); |
| 463 valid_type_ = length() == 1 && param.IsValidType(); | 463 valid_type_ = length() == 1 && param.IsValidType(); |
| 464 } | 464 } |
| 465 | 465 |
| 466 bool IsValidType() const { return valid_type_; } | 466 bool IsValidType() const { return valid_type_; } |
| 467 | 467 |
| 468 private: | 468 private: |
| 469 bool valid_type_; | 469 bool valid_type_; |
| 470 }; | 470 }; |
| 471 | 471 |
| 472 | 472 |
| 473 class PreParserType { | 473 class PreParserType { |
| 474 public: | 474 public: |
| 475 static PreParserType Default(bool valid = true) { | 475 static PreParserType Default(bool valid_type = true, |
| 476 return PreParserType(valid, false, false); | 476 bool valid_binder = false) { |
| 477 return PreParserType(valid_type, valid_binder, false); |
| 477 } | 478 } |
| 478 static PreParserType Reference(bool simple) { | 479 static PreParserType Reference(bool simple) { |
| 479 return PreParserType(true, simple, false); | 480 return PreParserType(true, simple, false); |
| 480 } | 481 } |
| 481 static PreParserType Parenthesized(bool valid, int arity) { | 482 static PreParserType Parenthesized(bool valid_type, int arity) { |
| 482 return PreParserType(valid, false, false, arity); | 483 return PreParserType(valid_type, false, false, arity); |
| 483 } | 484 } |
| 484 static PreParserType StringLiteral() { | 485 static PreParserType StringLiteral() { |
| 485 return PreParserType(true, false, true); | 486 return PreParserType(true, false, true); |
| 486 } | 487 } |
| 487 | 488 |
| 488 // Dummy implementation for making type->somefunc() work in both Parser | 489 // Dummy implementation for making type->somefunc() work in both Parser |
| 489 // and PreParser. | 490 // and PreParser. |
| 490 PreParserType* operator->() { return this; } | 491 PreParserType* operator->() { return this; } |
| 491 | 492 |
| 492 PreParserType Uncover(bool* ok) { | 493 PreParserType Uncover(bool* ok) { |
| 493 *ok = valid_type_; | 494 *ok = valid_type_; |
| 494 return *this; | 495 return *this; |
| 495 } | 496 } |
| 496 | 497 |
| 497 PreParserFormalParameters AsValidParameterList(Zone* zone, bool* ok) const { | 498 PreParserFormalParameters AsValidParameterList(Zone* zone, bool* ok) const { |
| 498 if (arity_ >= 0) return PreParserFormalParameters(arity_); | 499 if (arity_ >= 0) return PreParserFormalParameters(arity_); |
| 499 *ok = false; | 500 *ok = false; |
| 500 return PreParserFormalParameters(); | 501 return PreParserFormalParameters(); |
| 501 } | 502 } |
| 502 | 503 |
| 503 bool IsValidType() const { return valid_type_; } | 504 bool IsValidType() const { return valid_type_; } |
| 504 bool IsSimpleIdentifier() const { return simple_identifier_; } | 505 bool IsValidBindingIdentifierOrPattern() const { return valid_binder_; } |
| 505 bool IsStringLiteralType() const { return string_; } | 506 bool IsStringLiteralType() const { return string_; } |
| 506 | 507 |
| 507 PreParserIdentifier AsSimpleIdentifier() const { | |
| 508 DCHECK(simple_identifier_); | |
| 509 return PreParserIdentifier::Default(); | |
| 510 } | |
| 511 | |
| 512 private: | 508 private: |
| 513 PreParserType(bool valid, bool simple, bool string, int arity = -1) | 509 PreParserType(bool valid_type, bool valid_binder, bool string, int arity = -1) |
| 514 : valid_type_(valid), | 510 : valid_type_(valid_type), |
| 515 simple_identifier_(simple), | 511 valid_binder_(valid_binder), |
| 516 string_(string), | 512 string_(string), |
| 517 arity_(arity) {} | 513 arity_(arity) {} |
| 518 | 514 |
| 519 bool valid_type_; | 515 bool valid_type_; |
| 520 bool simple_identifier_; | 516 bool valid_binder_; |
| 521 bool string_; | 517 bool string_; |
| 522 int arity_; | 518 int arity_; |
| 523 }; | 519 }; |
| 524 | 520 |
| 525 | 521 |
| 526 typedef PreParserList<PreParserType> PreParserTypeArguments; | 522 typedef PreParserList<PreParserType> PreParserTypeList; |
| 527 | 523 |
| 528 V8_INLINE PreParserFormalParameter | 524 V8_INLINE PreParserFormalParameter |
| 529 PreParserFormalParameter::Unnamed(const PreParserType& type) { | 525 PreParserFormalParameter::Unnamed(const PreParserType& type) { |
| 530 return PreParserFormalParameter(type.IsValidType(), | 526 return PreParserFormalParameter(type.IsValidType(), |
| 531 type.IsSimpleIdentifier()); | 527 type.IsValidBindingIdentifierOrPattern()); |
| 532 } | 528 } |
| 533 | 529 |
| 534 | 530 |
| 535 } // namespace typesystem | 531 } // namespace typesystem |
| 536 | 532 |
| 537 | 533 |
| 538 class PreParserFactory { | 534 class PreParserFactory { |
| 539 public: | 535 public: |
| 540 explicit PreParserFactory(void* unused_value_factory) {} | 536 explicit PreParserFactory(void* unused_value_factory) {} |
| 541 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, | 537 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 int expr_pos) { | 663 int expr_pos) { |
| 668 return PreParserExpression::Spread(expression); | 664 return PreParserExpression::Spread(expression); |
| 669 } | 665 } |
| 670 | 666 |
| 671 PreParserExpression NewEmptyParentheses(int pos) { | 667 PreParserExpression NewEmptyParentheses(int pos) { |
| 672 return PreParserExpression::Default(); | 668 return PreParserExpression::Default(); |
| 673 } | 669 } |
| 674 | 670 |
| 675 typesystem::PreParserType NewPredefinedType( | 671 typesystem::PreParserType NewPredefinedType( |
| 676 typesystem::PredefinedType::Kind kind, int pos) { | 672 typesystem::PredefinedType::Kind kind, int pos) { |
| 677 return typesystem::PreParserType::Default(); | 673 return typesystem::PreParserType::Default( |
| 674 true, kind != typesystem::PredefinedType::kVoidType); |
| 678 } | 675 } |
| 679 | 676 |
| 680 typesystem::PreParserType NewThisType(int pos) { | 677 typesystem::PreParserType NewThisType(int pos) { |
| 681 return typesystem::PreParserType::Default(); | 678 return typesystem::PreParserType::Default(); |
| 682 } | 679 } |
| 683 | 680 |
| 684 typesystem::PreParserType NewUnionType(const typesystem::PreParserType& left, | 681 typesystem::PreParserType NewUnionType(const typesystem::PreParserType& left, |
| 685 const typesystem::PreParserType& right, | 682 const typesystem::PreParserType& right, |
| 686 int pos) { | 683 int pos) { |
| 687 return typesystem::PreParserType::Default(); | 684 return typesystem::PreParserType::Default(); |
| 688 } | 685 } |
| 689 | 686 |
| 690 typesystem::PreParserType NewIntersectionType( | 687 typesystem::PreParserType NewIntersectionType( |
| 691 const typesystem::PreParserType& left, | 688 const typesystem::PreParserType& left, |
| 692 const typesystem::PreParserType& right, int pos) { | 689 const typesystem::PreParserType& right, int pos) { |
| 693 return typesystem::PreParserType::Default(); | 690 return typesystem::PreParserType::Default(); |
| 694 } | 691 } |
| 695 | 692 |
| 696 typesystem::PreParserType NewArrayType(const typesystem::PreParserType& base, | 693 typesystem::PreParserType NewArrayType(const typesystem::PreParserType& base, |
| 697 int pos) { | 694 int pos) { |
| 698 return typesystem::PreParserType::Default(); | 695 return typesystem::PreParserType::Default(); |
| 699 } | 696 } |
| 700 | 697 |
| 698 typesystem::PreParserType NewTupleType( |
| 699 const typesystem::PreParserTypeList& elements, bool valid_type, |
| 700 bool valid_binder, bool spread, int pos) { |
| 701 return typesystem::PreParserType::Default(valid_type, valid_binder); |
| 702 } |
| 703 |
| 701 typesystem::PreParserType NewFunctionType( | 704 typesystem::PreParserType NewFunctionType( |
| 702 const typesystem::PreParserTypeParameters& type_parameters, | 705 const typesystem::PreParserTypeParameters& type_parameters, |
| 703 const typesystem::PreParserFormalParameters& parameters, | 706 const typesystem::PreParserFormalParameters& parameters, |
| 704 typesystem::PreParserType result_type, int pos, | 707 typesystem::PreParserType result_type, int pos, |
| 705 bool constructor = false) { | 708 bool constructor = false) { |
| 706 return typesystem::PreParserType::Default(); | 709 return typesystem::PreParserType::Default(); |
| 707 } | 710 } |
| 708 | 711 |
| 709 typesystem::PreParserType NewStringLiteralType( | 712 typesystem::PreParserType NewStringLiteralType( |
| 710 const PreParserIdentifier& string, int pos) { | 713 const PreParserIdentifier& string, int pos) { |
| 711 return typesystem::PreParserType::StringLiteral(); | 714 return typesystem::PreParserType::StringLiteral(); |
| 712 } | 715 } |
| 713 | 716 |
| 714 typesystem::PreParserType NewTypeReference( | 717 typesystem::PreParserType NewTypeReference( |
| 715 const PreParserIdentifier& name, | 718 const PreParserIdentifier& name, |
| 716 const typesystem::PreParserTypeArguments& type_arguments, int pos) { | 719 const typesystem::PreParserTypeList& type_arguments, int pos) { |
| 717 return typesystem::PreParserType::Reference(type_arguments.length() == 0); | 720 return typesystem::PreParserType::Reference(type_arguments.length() == 0); |
| 718 } | 721 } |
| 719 | 722 |
| 720 typesystem::PreParserType NewQueryType( | 723 typesystem::PreParserType NewQueryType( |
| 721 const PreParserIdentifier& name, | 724 const PreParserIdentifier& name, |
| 722 const PreParserIdentifierList& property_names, int pos) { | 725 const PreParserIdentifierList& property_names, int pos) { |
| 723 return typesystem::PreParserType::Default(); | 726 return typesystem::PreParserType::Default(); |
| 724 } | 727 } |
| 725 | 728 |
| 726 typesystem::PreParserFormalParameter NewFormalParameter( | 729 typesystem::PreParserFormalParameter NewFormalParameter( |
| 727 const PreParserIdentifier& name, bool optional, bool spread, | 730 const typesystem::PreParserType& binder, bool optional, bool spread, |
| 728 const typesystem::PreParserType& type, int pos) { | 731 const typesystem::PreParserType& type, int pos) { |
| 729 return typesystem::PreParserFormalParameter::Named(); | 732 return typesystem::PreParserFormalParameter::Named(); |
| 730 } | 733 } |
| 731 | 734 |
| 732 typesystem::PreParserFormalParameter NewFormalParameter( | 735 typesystem::PreParserFormalParameter NewFormalParameter( |
| 733 const typesystem::PreParserType& type, int pos) { | 736 const typesystem::PreParserType& type, int pos) { |
| 734 return typesystem::PreParserFormalParameter::Unnamed(type); | 737 return typesystem::PreParserFormalParameter::Unnamed(type); |
| 735 } | 738 } |
| 736 | 739 |
| 737 typesystem::PreParserType NewTypeOrParameters( | 740 typesystem::PreParserType NewTypeOrParameters( |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 typedef PreParserExpression ObjectLiteralProperty; | 796 typedef PreParserExpression ObjectLiteralProperty; |
| 794 typedef PreParserExpression Literal; | 797 typedef PreParserExpression Literal; |
| 795 typedef PreParserExpressionList ExpressionList; | 798 typedef PreParserExpressionList ExpressionList; |
| 796 typedef PreParserExpressionList PropertyList; | 799 typedef PreParserExpressionList PropertyList; |
| 797 typedef PreParserIdentifier FormalParameter; | 800 typedef PreParserIdentifier FormalParameter; |
| 798 typedef PreParserFormalParameters FormalParameters; | 801 typedef PreParserFormalParameters FormalParameters; |
| 799 typedef PreParserStatementList StatementList; | 802 typedef PreParserStatementList StatementList; |
| 800 | 803 |
| 801 struct TypeSystem { | 804 struct TypeSystem { |
| 802 typedef typesystem::PreParserType Type; | 805 typedef typesystem::PreParserType Type; |
| 803 typedef typesystem::PreParserTypeArguments TypeArguments; | 806 typedef typesystem::PreParserTypeList TypeList; |
| 804 typedef typesystem::PreParserTypeParameter TypeParameter; | 807 typedef typesystem::PreParserTypeParameter TypeParameter; |
| 805 typedef typesystem::PreParserTypeParameters TypeParameters; | 808 typedef typesystem::PreParserTypeParameters TypeParameters; |
| 806 typedef typesystem::PreParserFormalParameter FormalParameter; | 809 typedef typesystem::PreParserFormalParameter FormalParameter; |
| 807 typedef typesystem::PreParserFormalParameters FormalParameters; | 810 typedef typesystem::PreParserFormalParameters FormalParameters; |
| 808 }; | 811 }; |
| 809 | 812 |
| 810 // For constructing objects returned by the traversing functions. | 813 // For constructing objects returned by the traversing functions. |
| 811 typedef PreParserFactory Factory; | 814 typedef PreParserFactory Factory; |
| 812 }; | 815 }; |
| 813 | 816 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 956 } | 959 } |
| 957 static PreParserExpression EmptyFunctionLiteral() { | 960 static PreParserExpression EmptyFunctionLiteral() { |
| 958 return PreParserExpression::Default(); | 961 return PreParserExpression::Default(); |
| 959 } | 962 } |
| 960 static PreParserExpressionList NullExpressionList() { | 963 static PreParserExpressionList NullExpressionList() { |
| 961 return PreParserExpressionList(); | 964 return PreParserExpressionList(); |
| 962 } | 965 } |
| 963 static typesystem::PreParserType EmptyType() { | 966 static typesystem::PreParserType EmptyType() { |
| 964 return typesystem::PreParserType::Default(false); | 967 return typesystem::PreParserType::Default(false); |
| 965 } | 968 } |
| 966 static typesystem::PreParserTypeArguments NullTypeArguments() { | 969 static typesystem::PreParserTypeList NullTypeList() { |
| 967 return typesystem::PreParserTypeArguments(); | 970 return typesystem::PreParserTypeList(); |
| 968 } | 971 } |
| 969 static typesystem::PreParserTypeParameters NullTypeParameters() { | 972 static typesystem::PreParserTypeParameters NullTypeParameters() { |
| 970 return typesystem::PreParserTypeParameters(); | 973 return typesystem::PreParserTypeParameters(); |
| 971 } | 974 } |
| 972 static bool IsNullTypeParameters( | 975 static bool IsNullTypeParameters( |
| 973 const typesystem::PreParserTypeParameters& typ_pars) { | 976 const typesystem::PreParserTypeParameters& typ_pars) { |
| 974 return typ_pars.length() == 0; | 977 return typ_pars.length() == 0; |
| 975 } | 978 } |
| 976 static typesystem::PreParserTypeArguments EmptyTypeArguments() { | 979 static typesystem::PreParserTypeList EmptyTypeList() { |
| 977 return typesystem::PreParserTypeArguments(); | 980 return typesystem::PreParserTypeList(); |
| 978 } | 981 } |
| 979 static typesystem::PreParserTypeParameters EmptyTypeParameters() { | 982 static typesystem::PreParserTypeParameters EmptyTypeParameters() { |
| 980 return typesystem::PreParserTypeParameters(); | 983 return typesystem::PreParserTypeParameters(); |
| 981 } | 984 } |
| 982 static typesystem::PreParserFormalParameters EmptyFormalParameters() { | 985 static typesystem::PreParserFormalParameters EmptyFormalParameters() { |
| 983 return typesystem::PreParserFormalParameters(); | 986 return typesystem::PreParserFormalParameters(); |
| 984 } | 987 } |
| 985 static PreParserIdentifierList NullIdentifierList() { | 988 static PreParserIdentifierList NullIdentifierList() { |
| 986 return PreParserIdentifierList(); | 989 return PreParserIdentifierList(); |
| 987 } | 990 } |
| 988 static PreParserIdentifierList EmptyIdentifierList() { | 991 static PreParserIdentifierList EmptyIdentifierList() { |
| 989 return PreParserIdentifierList(); | 992 return PreParserIdentifierList(); |
| 990 } | 993 } |
| 994 static typesystem::PreParserType HoleTypeElement() { |
| 995 return typesystem::PreParserType::Default(false); |
| 996 } |
| 991 | 997 |
| 992 // Odd-ball literal creators. | 998 // Odd-ball literal creators. |
| 993 static PreParserExpression GetLiteralTheHole(int position, | 999 static PreParserExpression GetLiteralTheHole(int position, |
| 994 PreParserFactory* factory) { | 1000 PreParserFactory* factory) { |
| 995 return PreParserExpression::Default(); | 1001 return PreParserExpression::Default(); |
| 996 } | 1002 } |
| 997 | 1003 |
| 998 // Producing data during the recursive descent. | 1004 // Producing data during the recursive descent. |
| 999 PreParserIdentifier GetSymbol(Scanner* scanner); | 1005 PreParserIdentifier GetSymbol(Scanner* scanner); |
| 1000 PreParserIdentifier GetNumberAsSymbol(Scanner* scanner); | 1006 PreParserIdentifier GetNumberAsSymbol(Scanner* scanner); |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1402 const PreParserFormalParameters& parameters, FunctionKind kind, | 1408 const PreParserFormalParameters& parameters, FunctionKind kind, |
| 1403 FunctionLiteral::FunctionType function_type, bool* ok) { | 1409 FunctionLiteral::FunctionType function_type, bool* ok) { |
| 1404 return pre_parser_->ParseEagerFunctionBody(function_name, pos, parameters, | 1410 return pre_parser_->ParseEagerFunctionBody(function_name, pos, parameters, |
| 1405 kind, function_type, ok); | 1411 kind, function_type, ok); |
| 1406 } | 1412 } |
| 1407 | 1413 |
| 1408 } // namespace internal | 1414 } // namespace internal |
| 1409 } // namespace v8 | 1415 } // namespace v8 |
| 1410 | 1416 |
| 1411 #endif // V8_PARSING_PREPARSER_H | 1417 #endif // V8_PARSING_PREPARSER_H |
| OLD | NEW |