| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 // These functions make list->Add(some_expression) work (and do nothing). | 680 // These functions make list->Add(some_expression) work (and do nothing). |
| 681 PreParserExpressionList() : length_(0) {} | 681 PreParserExpressionList() : length_(0) {} |
| 682 PreParserExpressionList* operator->() { return this; } | 682 PreParserExpressionList* operator->() { return this; } |
| 683 void Add(PreParserExpression, void*) { ++length_; } | 683 void Add(PreParserExpression, void*) { ++length_; } |
| 684 int length() const { return length_; } | 684 int length() const { return length_; } |
| 685 private: | 685 private: |
| 686 int length_; | 686 int length_; |
| 687 }; | 687 }; |
| 688 | 688 |
| 689 | 689 |
| 690 class PreParserStatement { |
| 691 public: |
| 692 static PreParserStatement Default() { |
| 693 return PreParserStatement(kUnknownStatement); |
| 694 } |
| 695 |
| 696 static PreParserStatement FunctionDeclaration() { |
| 697 return PreParserStatement(kFunctionDeclaration); |
| 698 } |
| 699 |
| 700 // Creates expression statement from expression. |
| 701 // Preserves being an unparenthesized string literal, possibly |
| 702 // "use strict". |
| 703 static PreParserStatement ExpressionStatement( |
| 704 PreParserExpression expression) { |
| 705 if (expression.IsUseStrictLiteral()) { |
| 706 return PreParserStatement(kUseStrictExpressionStatement); |
| 707 } |
| 708 if (expression.IsStringLiteral()) { |
| 709 return PreParserStatement(kStringLiteralExpressionStatement); |
| 710 } |
| 711 return Default(); |
| 712 } |
| 713 |
| 714 bool IsStringLiteral() { |
| 715 return code_ == kStringLiteralExpressionStatement; |
| 716 } |
| 717 |
| 718 bool IsUseStrictLiteral() { |
| 719 return code_ == kUseStrictExpressionStatement; |
| 720 } |
| 721 |
| 722 bool IsFunctionDeclaration() { |
| 723 return code_ == kFunctionDeclaration; |
| 724 } |
| 725 |
| 726 private: |
| 727 enum Type { |
| 728 kUnknownStatement, |
| 729 kStringLiteralExpressionStatement, |
| 730 kUseStrictExpressionStatement, |
| 731 kFunctionDeclaration |
| 732 }; |
| 733 |
| 734 explicit PreParserStatement(Type code) : code_(code) {} |
| 735 Type code_; |
| 736 }; |
| 737 |
| 738 |
| 739 |
| 740 // PreParserStatementList doesn't actually store the statements because |
| 741 // the PreParser does not need them. |
| 742 class PreParserStatementList { |
| 743 public: |
| 744 // These functions make list->Add(some_expression) work as no-ops. |
| 745 PreParserStatementList() {} |
| 746 PreParserStatementList* operator->() { return this; } |
| 747 void Add(PreParserStatement, void*) {} |
| 748 }; |
| 749 |
| 750 |
| 690 class PreParserScope { | 751 class PreParserScope { |
| 691 public: | 752 public: |
| 692 explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type) | 753 explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type) |
| 693 : scope_type_(scope_type) { | 754 : scope_type_(scope_type) { |
| 694 strict_mode_ = outer_scope ? outer_scope->strict_mode() : SLOPPY; | 755 strict_mode_ = outer_scope ? outer_scope->strict_mode() : SLOPPY; |
| 695 } | 756 } |
| 696 | 757 |
| 697 ScopeType type() { return scope_type_; } | 758 ScopeType type() { return scope_type_; } |
| 698 StrictMode strict_mode() const { return strict_mode_; } | 759 StrictMode strict_mode() const { return strict_mode_; } |
| 699 void SetStrictMode(StrictMode strict_mode) { strict_mode_ = strict_mode; } | 760 void SetStrictMode(StrictMode strict_mode) { strict_mode_ = strict_mode; } |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 | 884 |
| 824 // Return types for traversing functions. | 885 // Return types for traversing functions. |
| 825 typedef PreParserIdentifier Identifier; | 886 typedef PreParserIdentifier Identifier; |
| 826 typedef PreParserExpression Expression; | 887 typedef PreParserExpression Expression; |
| 827 typedef PreParserExpression YieldExpression; | 888 typedef PreParserExpression YieldExpression; |
| 828 typedef PreParserExpression FunctionLiteral; | 889 typedef PreParserExpression FunctionLiteral; |
| 829 typedef PreParserExpression ObjectLiteralProperty; | 890 typedef PreParserExpression ObjectLiteralProperty; |
| 830 typedef PreParserExpression Literal; | 891 typedef PreParserExpression Literal; |
| 831 typedef PreParserExpressionList ExpressionList; | 892 typedef PreParserExpressionList ExpressionList; |
| 832 typedef PreParserExpressionList PropertyList; | 893 typedef PreParserExpressionList PropertyList; |
| 894 typedef PreParserStatementList StatementList; |
| 833 | 895 |
| 834 // For constructing objects returned by the traversing functions. | 896 // For constructing objects returned by the traversing functions. |
| 835 typedef PreParserFactory Factory; | 897 typedef PreParserFactory Factory; |
| 836 }; | 898 }; |
| 837 | 899 |
| 838 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 900 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
| 839 | 901 |
| 840 // Custom operations executed when FunctionStates are created and | 902 // Custom operations executed when FunctionStates are created and |
| 841 // destructed. (The PreParser doesn't need to do anything.) | 903 // destructed. (The PreParser doesn't need to do anything.) |
| 842 template<typename FunctionState> | 904 template<typename FunctionState> |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 } | 1048 } |
| 987 | 1049 |
| 988 PreParserExpression ExpressionFromString(int pos, | 1050 PreParserExpression ExpressionFromString(int pos, |
| 989 Scanner* scanner, | 1051 Scanner* scanner, |
| 990 PreParserFactory* factory = NULL); | 1052 PreParserFactory* factory = NULL); |
| 991 | 1053 |
| 992 static PreParserExpressionList NewExpressionList(int size, void* zone) { | 1054 static PreParserExpressionList NewExpressionList(int size, void* zone) { |
| 993 return PreParserExpressionList(); | 1055 return PreParserExpressionList(); |
| 994 } | 1056 } |
| 995 | 1057 |
| 1058 static PreParserStatementList NewStatementList(int size, void* zone) { |
| 1059 return PreParserStatementList(); |
| 1060 } |
| 1061 |
| 996 static PreParserExpressionList NewPropertyList(int size, void* zone) { | 1062 static PreParserExpressionList NewPropertyList(int size, void* zone) { |
| 997 return PreParserExpressionList(); | 1063 return PreParserExpressionList(); |
| 998 } | 1064 } |
| 999 | 1065 |
| 1000 // Temporary glue; these functions will move to ParserBase. | 1066 // Temporary glue; these functions will move to ParserBase. |
| 1001 PreParserExpression ParseV8Intrinsic(bool* ok); | 1067 PreParserExpression ParseV8Intrinsic(bool* ok); |
| 1002 PreParserExpression ParseFunctionLiteral( | 1068 PreParserExpression ParseFunctionLiteral( |
| 1003 PreParserIdentifier name, | 1069 PreParserIdentifier name, |
| 1004 Scanner::Location function_name_location, | 1070 Scanner::Location function_name_location, |
| 1005 bool name_is_strict_reserved, | 1071 bool name_is_strict_reserved, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1022 // The grammar check is only performed in order to understand the program | 1088 // The grammar check is only performed in order to understand the program |
| 1023 // sufficiently to deduce some information about it, that can be used | 1089 // sufficiently to deduce some information about it, that can be used |
| 1024 // to speed up later parsing. Finding errors is not the goal of pre-parsing, | 1090 // to speed up later parsing. Finding errors is not the goal of pre-parsing, |
| 1025 // rather it is to speed up properly written and correct programs. | 1091 // rather it is to speed up properly written and correct programs. |
| 1026 // That means that contextual checks (like a label being declared where | 1092 // That means that contextual checks (like a label being declared where |
| 1027 // it is used) are generally omitted. | 1093 // it is used) are generally omitted. |
| 1028 class PreParser : public ParserBase<PreParserTraits> { | 1094 class PreParser : public ParserBase<PreParserTraits> { |
| 1029 public: | 1095 public: |
| 1030 typedef PreParserIdentifier Identifier; | 1096 typedef PreParserIdentifier Identifier; |
| 1031 typedef PreParserExpression Expression; | 1097 typedef PreParserExpression Expression; |
| 1098 typedef PreParserStatement Statement; |
| 1032 | 1099 |
| 1033 enum PreParseResult { | 1100 enum PreParseResult { |
| 1034 kPreParseStackOverflow, | 1101 kPreParseStackOverflow, |
| 1035 kPreParseSuccess | 1102 kPreParseSuccess |
| 1036 }; | 1103 }; |
| 1037 | 1104 |
| 1038 PreParser(Scanner* scanner, ParserRecorder* log, uintptr_t stack_limit) | 1105 PreParser(Scanner* scanner, ParserRecorder* log, uintptr_t stack_limit) |
| 1039 : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, log, NULL, | 1106 : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, log, NULL, |
| 1040 this) {} | 1107 this) {} |
| 1041 | 1108 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1083 kStatement, | 1150 kStatement, |
| 1084 kForStatement | 1151 kForStatement |
| 1085 }; | 1152 }; |
| 1086 | 1153 |
| 1087 // If a list of variable declarations includes any initializers. | 1154 // If a list of variable declarations includes any initializers. |
| 1088 enum VariableDeclarationProperties { | 1155 enum VariableDeclarationProperties { |
| 1089 kHasInitializers, | 1156 kHasInitializers, |
| 1090 kHasNoInitializers | 1157 kHasNoInitializers |
| 1091 }; | 1158 }; |
| 1092 | 1159 |
| 1093 class Statement { | |
| 1094 public: | |
| 1095 static Statement Default() { | |
| 1096 return Statement(kUnknownStatement); | |
| 1097 } | |
| 1098 | |
| 1099 static Statement FunctionDeclaration() { | |
| 1100 return Statement(kFunctionDeclaration); | |
| 1101 } | |
| 1102 | |
| 1103 // Creates expression statement from expression. | |
| 1104 // Preserves being an unparenthesized string literal, possibly | |
| 1105 // "use strict". | |
| 1106 static Statement ExpressionStatement(Expression expression) { | |
| 1107 if (expression.IsUseStrictLiteral()) { | |
| 1108 return Statement(kUseStrictExpressionStatement); | |
| 1109 } | |
| 1110 if (expression.IsStringLiteral()) { | |
| 1111 return Statement(kStringLiteralExpressionStatement); | |
| 1112 } | |
| 1113 return Default(); | |
| 1114 } | |
| 1115 | |
| 1116 bool IsStringLiteral() { | |
| 1117 return code_ == kStringLiteralExpressionStatement; | |
| 1118 } | |
| 1119 | |
| 1120 bool IsUseStrictLiteral() { | |
| 1121 return code_ == kUseStrictExpressionStatement; | |
| 1122 } | |
| 1123 | |
| 1124 bool IsFunctionDeclaration() { | |
| 1125 return code_ == kFunctionDeclaration; | |
| 1126 } | |
| 1127 | |
| 1128 private: | |
| 1129 enum Type { | |
| 1130 kUnknownStatement, | |
| 1131 kStringLiteralExpressionStatement, | |
| 1132 kUseStrictExpressionStatement, | |
| 1133 kFunctionDeclaration | |
| 1134 }; | |
| 1135 | |
| 1136 explicit Statement(Type code) : code_(code) {} | |
| 1137 Type code_; | |
| 1138 }; | |
| 1139 | 1160 |
| 1140 enum SourceElements { | 1161 enum SourceElements { |
| 1141 kUnknownSourceElements | 1162 kUnknownSourceElements |
| 1142 }; | 1163 }; |
| 1143 | 1164 |
| 1144 // All ParseXXX functions take as the last argument an *ok parameter | 1165 // All ParseXXX functions take as the last argument an *ok parameter |
| 1145 // which is set to false if parsing failed; it is unchanged otherwise. | 1166 // which is set to false if parsing failed; it is unchanged otherwise. |
| 1146 // By making the 'exception handling' explicit, we are forced to check | 1167 // By making the 'exception handling' explicit, we are forced to check |
| 1147 // for failure at the call sites. | 1168 // for failure at the call sites. |
| 1148 Statement ParseSourceElement(bool* ok); | 1169 Statement ParseSourceElement(bool* ok); |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2172 "accessor_get_set"); | 2193 "accessor_get_set"); |
| 2173 } | 2194 } |
| 2174 *ok = false; | 2195 *ok = false; |
| 2175 } | 2196 } |
| 2176 } | 2197 } |
| 2177 | 2198 |
| 2178 | 2199 |
| 2179 } } // v8::internal | 2200 } } // v8::internal |
| 2180 | 2201 |
| 2181 #endif // V8_PREPARSER_H | 2202 #endif // V8_PREPARSER_H |
| OLD | NEW |