Chromium Code Reviews| 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; |
| 1032 | 1098 |
|
marja
2014/04/24 15:31:10
Add a typedef for Statement here...
| |
| 1033 enum PreParseResult { | 1099 enum PreParseResult { |
| 1034 kPreParseStackOverflow, | 1100 kPreParseStackOverflow, |
| 1035 kPreParseSuccess | 1101 kPreParseSuccess |
| 1036 }; | 1102 }; |
| 1037 | 1103 |
| 1038 PreParser(Scanner* scanner, ParserRecorder* log, uintptr_t stack_limit) | 1104 PreParser(Scanner* scanner, ParserRecorder* log, uintptr_t stack_limit) |
| 1039 : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, log, NULL, | 1105 : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, log, NULL, |
| 1040 this) {} | 1106 this) {} |
| 1041 | 1107 |
| 1042 // Pre-parse the program from the character stream; returns true on | 1108 // Pre-parse the program from the character stream; returns true on |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1083 kStatement, | 1149 kStatement, |
| 1084 kForStatement | 1150 kForStatement |
| 1085 }; | 1151 }; |
| 1086 | 1152 |
| 1087 // If a list of variable declarations includes any initializers. | 1153 // If a list of variable declarations includes any initializers. |
| 1088 enum VariableDeclarationProperties { | 1154 enum VariableDeclarationProperties { |
| 1089 kHasInitializers, | 1155 kHasInitializers, |
| 1090 kHasNoInitializers | 1156 kHasNoInitializers |
| 1091 }; | 1157 }; |
| 1092 | 1158 |
| 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 | 1159 |
| 1140 enum SourceElements { | 1160 enum SourceElements { |
| 1141 kUnknownSourceElements | 1161 kUnknownSourceElements |
| 1142 }; | 1162 }; |
| 1143 | 1163 |
| 1144 // All ParseXXX functions take as the last argument an *ok parameter | 1164 // All ParseXXX functions take as the last argument an *ok parameter |
|
marja
2014/04/24 15:31:10
So you don't need to change these lines.
| |
| 1145 // which is set to false if parsing failed; it is unchanged otherwise. | 1165 // which is set to false if parsing failed; it is unchanged otherwise. |
| 1146 // By making the 'exception handling' explicit, we are forced to check | 1166 // By making the 'exception handling' explicit, we are forced to check |
| 1147 // for failure at the call sites. | 1167 // for failure at the call sites. |
| 1148 Statement ParseSourceElement(bool* ok); | 1168 PreParserStatement ParseSourceElement(bool* ok); |
| 1149 SourceElements ParseSourceElements(int end_token, bool* ok); | 1169 SourceElements ParseSourceElements(int end_token, bool* ok); |
| 1150 Statement ParseStatement(bool* ok); | 1170 PreParserStatement ParseStatement(bool* ok); |
| 1151 Statement ParseFunctionDeclaration(bool* ok); | 1171 PreParserStatement ParseFunctionDeclaration(bool* ok); |
| 1152 Statement ParseBlock(bool* ok); | 1172 PreParserStatement ParseBlock(bool* ok); |
| 1153 Statement ParseVariableStatement(VariableDeclarationContext var_context, | 1173 PreParserStatement ParseVariableStatement( |
| 1154 bool* ok); | 1174 VariableDeclarationContext var_context, |
| 1155 Statement ParseVariableDeclarations(VariableDeclarationContext var_context, | 1175 bool* ok); |
| 1156 VariableDeclarationProperties* decl_props, | 1176 PreParserStatement ParseVariableDeclarations( |
| 1157 int* num_decl, | 1177 VariableDeclarationContext var_context, |
| 1158 bool* ok); | 1178 VariableDeclarationProperties* decl_props, |
| 1159 Statement ParseExpressionOrLabelledStatement(bool* ok); | 1179 int* num_decl, |
| 1160 Statement ParseIfStatement(bool* ok); | 1180 bool* ok); |
| 1161 Statement ParseContinueStatement(bool* ok); | 1181 PreParserStatement ParseExpressionOrLabelledStatement(bool* ok); |
| 1162 Statement ParseBreakStatement(bool* ok); | 1182 PreParserStatement ParseIfStatement(bool* ok); |
| 1163 Statement ParseReturnStatement(bool* ok); | 1183 PreParserStatement ParseContinueStatement(bool* ok); |
| 1164 Statement ParseWithStatement(bool* ok); | 1184 PreParserStatement ParseBreakStatement(bool* ok); |
| 1165 Statement ParseSwitchStatement(bool* ok); | 1185 PreParserStatement ParseReturnStatement(bool* ok); |
| 1166 Statement ParseDoWhileStatement(bool* ok); | 1186 PreParserStatement ParseWithStatement(bool* ok); |
| 1167 Statement ParseWhileStatement(bool* ok); | 1187 PreParserStatement ParseSwitchStatement(bool* ok); |
| 1168 Statement ParseForStatement(bool* ok); | 1188 PreParserStatement ParseDoWhileStatement(bool* ok); |
| 1169 Statement ParseThrowStatement(bool* ok); | 1189 PreParserStatement ParseWhileStatement(bool* ok); |
| 1170 Statement ParseTryStatement(bool* ok); | 1190 PreParserStatement ParseForStatement(bool* ok); |
| 1171 Statement ParseDebuggerStatement(bool* ok); | 1191 PreParserStatement ParseThrowStatement(bool* ok); |
| 1192 PreParserStatement ParseTryStatement(bool* ok); | |
| 1193 PreParserStatement ParseDebuggerStatement(bool* ok); | |
| 1172 Expression ParseConditionalExpression(bool accept_IN, bool* ok); | 1194 Expression ParseConditionalExpression(bool accept_IN, bool* ok); |
| 1173 Expression ParseObjectLiteral(bool* ok); | 1195 Expression ParseObjectLiteral(bool* ok); |
| 1174 Expression ParseV8Intrinsic(bool* ok); | 1196 Expression ParseV8Intrinsic(bool* ok); |
| 1175 | 1197 |
| 1176 Expression ParseFunctionLiteral( | 1198 Expression ParseFunctionLiteral( |
| 1177 Identifier name, | 1199 Identifier name, |
| 1178 Scanner::Location function_name_location, | 1200 Scanner::Location function_name_location, |
| 1179 bool name_is_strict_reserved, | 1201 bool name_is_strict_reserved, |
| 1180 bool is_generator, | 1202 bool is_generator, |
| 1181 int function_token_pos, | 1203 int function_token_pos, |
| (...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2172 "accessor_get_set"); | 2194 "accessor_get_set"); |
| 2173 } | 2195 } |
| 2174 *ok = false; | 2196 *ok = false; |
| 2175 } | 2197 } |
| 2176 } | 2198 } |
| 2177 | 2199 |
| 2178 | 2200 |
| 2179 } } // v8::internal | 2201 } } // v8::internal |
| 2180 | 2202 |
| 2181 #endif // V8_PREPARSER_H | 2203 #endif // V8_PREPARSER_H |
| OLD | NEW |