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 |