| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 } | 54 } |
| 55 static PreParserIdentifier Constructor() { | 55 static PreParserIdentifier Constructor() { |
| 56 return PreParserIdentifier(kConstructorIdentifier); | 56 return PreParserIdentifier(kConstructorIdentifier); |
| 57 } | 57 } |
| 58 static PreParserIdentifier Enum() { | 58 static PreParserIdentifier Enum() { |
| 59 return PreParserIdentifier(kEnumIdentifier); | 59 return PreParserIdentifier(kEnumIdentifier); |
| 60 } | 60 } |
| 61 static PreParserIdentifier Await() { | 61 static PreParserIdentifier Await() { |
| 62 return PreParserIdentifier(kAwaitIdentifier); | 62 return PreParserIdentifier(kAwaitIdentifier); |
| 63 } | 63 } |
| 64 static PreParserIdentifier Async() { |
| 65 return PreParserIdentifier(kAsyncIdentifier); |
| 66 } |
| 64 bool IsEval() const { return type_ == kEvalIdentifier; } | 67 bool IsEval() const { return type_ == kEvalIdentifier; } |
| 65 bool IsArguments() const { return type_ == kArgumentsIdentifier; } | 68 bool IsArguments() const { return type_ == kArgumentsIdentifier; } |
| 66 bool IsEvalOrArguments() const { return IsEval() || IsArguments(); } | 69 bool IsEvalOrArguments() const { return IsEval() || IsArguments(); } |
| 67 bool IsUndefined() const { return type_ == kUndefinedIdentifier; } | 70 bool IsUndefined() const { return type_ == kUndefinedIdentifier; } |
| 68 bool IsLet() const { return type_ == kLetIdentifier; } | 71 bool IsLet() const { return type_ == kLetIdentifier; } |
| 69 bool IsStatic() const { return type_ == kStaticIdentifier; } | 72 bool IsStatic() const { return type_ == kStaticIdentifier; } |
| 70 bool IsYield() const { return type_ == kYieldIdentifier; } | 73 bool IsYield() const { return type_ == kYieldIdentifier; } |
| 71 bool IsPrototype() const { return type_ == kPrototypeIdentifier; } | 74 bool IsPrototype() const { return type_ == kPrototypeIdentifier; } |
| 72 bool IsConstructor() const { return type_ == kConstructorIdentifier; } | 75 bool IsConstructor() const { return type_ == kConstructorIdentifier; } |
| 73 bool IsEnum() const { return type_ == kEnumIdentifier; } | 76 bool IsEnum() const { return type_ == kEnumIdentifier; } |
| 74 bool IsAwait() const { return type_ == kAwaitIdentifier; } | 77 bool IsAwait() const { return type_ == kAwaitIdentifier; } |
| 78 bool IsAsync() const { return type_ == kAsyncIdentifier; } |
| 75 bool IsFutureStrictReserved() const { | 79 bool IsFutureStrictReserved() const { |
| 76 return type_ == kFutureStrictReservedIdentifier || | 80 return type_ == kFutureStrictReservedIdentifier || |
| 77 type_ == kLetIdentifier || type_ == kStaticIdentifier || | 81 type_ == kLetIdentifier || type_ == kStaticIdentifier || |
| 78 type_ == kYieldIdentifier; | 82 type_ == kYieldIdentifier; |
| 79 } | 83 } |
| 80 | 84 |
| 81 // Allow identifier->name()[->length()] to work. The preparser | 85 // Allow identifier->name()[->length()] to work. The preparser |
| 82 // does not need the actual positions/lengths of the identifiers. | 86 // does not need the actual positions/lengths of the identifiers. |
| 83 const PreParserIdentifier* operator->() const { return this; } | 87 const PreParserIdentifier* operator->() const { return this; } |
| 84 const PreParserIdentifier raw_name() const { return *this; } | 88 const PreParserIdentifier raw_name() const { return *this; } |
| 85 | 89 |
| 86 int position() const { return 0; } | 90 int position() const { return 0; } |
| 87 int length() const { return 0; } | 91 int length() const { return 0; } |
| 88 | 92 |
| 89 private: | 93 private: |
| 90 enum Type { | 94 enum Type { |
| 91 kUnknownIdentifier, | 95 kUnknownIdentifier, |
| 92 kFutureReservedIdentifier, | 96 kFutureReservedIdentifier, |
| 93 kFutureStrictReservedIdentifier, | 97 kFutureStrictReservedIdentifier, |
| 94 kLetIdentifier, | 98 kLetIdentifier, |
| 95 kStaticIdentifier, | 99 kStaticIdentifier, |
| 96 kYieldIdentifier, | 100 kYieldIdentifier, |
| 97 kEvalIdentifier, | 101 kEvalIdentifier, |
| 98 kArgumentsIdentifier, | 102 kArgumentsIdentifier, |
| 99 kUndefinedIdentifier, | 103 kUndefinedIdentifier, |
| 100 kPrototypeIdentifier, | 104 kPrototypeIdentifier, |
| 101 kConstructorIdentifier, | 105 kConstructorIdentifier, |
| 102 kEnumIdentifier, | 106 kEnumIdentifier, |
| 103 kAwaitIdentifier | 107 kAwaitIdentifier, |
| 108 kAsyncIdentifier |
| 104 }; | 109 }; |
| 105 | 110 |
| 106 explicit PreParserIdentifier(Type type) : type_(type) {} | 111 explicit PreParserIdentifier(Type type) : type_(type) {} |
| 107 Type type_; | 112 Type type_; |
| 108 | 113 |
| 109 friend class PreParserExpression; | 114 friend class PreParserExpression; |
| 110 }; | 115 }; |
| 111 | 116 |
| 112 | 117 |
| 113 class PreParserExpression { | 118 class PreParserExpression { |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 | 620 |
| 616 // Helper functions for recursive descent. | 621 // Helper functions for recursive descent. |
| 617 static bool IsEval(PreParserIdentifier identifier) { | 622 static bool IsEval(PreParserIdentifier identifier) { |
| 618 return identifier.IsEval(); | 623 return identifier.IsEval(); |
| 619 } | 624 } |
| 620 | 625 |
| 621 static bool IsArguments(PreParserIdentifier identifier) { | 626 static bool IsArguments(PreParserIdentifier identifier) { |
| 622 return identifier.IsArguments(); | 627 return identifier.IsArguments(); |
| 623 } | 628 } |
| 624 | 629 |
| 630 static bool IsAwait(PreParserIdentifier identifier) { |
| 631 return identifier.IsAwait(); |
| 632 } |
| 633 |
| 634 static bool IsAsync(PreParserIdentifier identifier) { |
| 635 return identifier.IsAsync(); |
| 636 } |
| 637 |
| 625 static bool IsEvalOrArguments(PreParserIdentifier identifier) { | 638 static bool IsEvalOrArguments(PreParserIdentifier identifier) { |
| 626 return identifier.IsEvalOrArguments(); | 639 return identifier.IsEvalOrArguments(); |
| 627 } | 640 } |
| 628 | 641 |
| 629 static bool IsUndefined(PreParserIdentifier identifier) { | 642 static bool IsUndefined(PreParserIdentifier identifier) { |
| 630 return identifier.IsUndefined(); | 643 return identifier.IsUndefined(); |
| 631 } | 644 } |
| 632 | 645 |
| 633 static bool IsPrototype(PreParserIdentifier identifier) { | 646 static bool IsPrototype(PreParserIdentifier identifier) { |
| 634 return identifier.IsPrototype(); | 647 return identifier.IsPrototype(); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 V8_INLINE PreParserStatementList ParseEagerFunctionBody( | 871 V8_INLINE PreParserStatementList ParseEagerFunctionBody( |
| 859 PreParserIdentifier function_name, int pos, | 872 PreParserIdentifier function_name, int pos, |
| 860 const PreParserFormalParameters& parameters, FunctionKind kind, | 873 const PreParserFormalParameters& parameters, FunctionKind kind, |
| 861 FunctionLiteral::FunctionType function_type, bool* ok); | 874 FunctionLiteral::FunctionType function_type, bool* ok); |
| 862 | 875 |
| 863 V8_INLINE void ParseArrowFunctionFormalParameterList( | 876 V8_INLINE void ParseArrowFunctionFormalParameterList( |
| 864 PreParserFormalParameters* parameters, | 877 PreParserFormalParameters* parameters, |
| 865 PreParserExpression expression, const Scanner::Location& params_loc, | 878 PreParserExpression expression, const Scanner::Location& params_loc, |
| 866 Scanner::Location* duplicate_loc, bool* ok); | 879 Scanner::Location* duplicate_loc, bool* ok); |
| 867 | 880 |
| 881 V8_INLINE PreParserExpression ParseAsyncFunctionExpression(bool* ok); |
| 882 |
| 868 void ReindexLiterals(const PreParserFormalParameters& paramaters) {} | 883 void ReindexLiterals(const PreParserFormalParameters& paramaters) {} |
| 869 | 884 |
| 870 struct TemplateLiteralState {}; | 885 struct TemplateLiteralState {}; |
| 871 | 886 |
| 872 TemplateLiteralState OpenTemplateLiteral(int pos) { | 887 TemplateLiteralState OpenTemplateLiteral(int pos) { |
| 873 return TemplateLiteralState(); | 888 return TemplateLiteralState(); |
| 874 } | 889 } |
| 875 void AddTemplateSpan(TemplateLiteralState*, bool) {} | 890 void AddTemplateSpan(TemplateLiteralState*, bool) {} |
| 876 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} | 891 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} |
| 877 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, | 892 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 930 | 945 |
| 931 inline void MaterializeUnspreadArgumentsLiterals(int count); | 946 inline void MaterializeUnspreadArgumentsLiterals(int count); |
| 932 | 947 |
| 933 inline PreParserExpression SpreadCall(PreParserExpression function, | 948 inline PreParserExpression SpreadCall(PreParserExpression function, |
| 934 PreParserExpressionList args, int pos); | 949 PreParserExpressionList args, int pos); |
| 935 | 950 |
| 936 inline PreParserExpression SpreadCallNew(PreParserExpression function, | 951 inline PreParserExpression SpreadCallNew(PreParserExpression function, |
| 937 PreParserExpressionList args, | 952 PreParserExpressionList args, |
| 938 int pos); | 953 int pos); |
| 939 | 954 |
| 955 inline PreParserExpression ExpressionListToExpression( |
| 956 PreParserExpressionList args) { |
| 957 return PreParserExpression::Default(); |
| 958 } |
| 959 |
| 940 inline void RewriteDestructuringAssignments() {} | 960 inline void RewriteDestructuringAssignments() {} |
| 941 | 961 |
| 942 inline PreParserExpression RewriteExponentiation(PreParserExpression left, | 962 inline PreParserExpression RewriteExponentiation(PreParserExpression left, |
| 943 PreParserExpression right, | 963 PreParserExpression right, |
| 944 int pos) { | 964 int pos) { |
| 945 return left; | 965 return left; |
| 946 } | 966 } |
| 947 inline PreParserExpression RewriteAssignExponentiation( | 967 inline PreParserExpression RewriteAssignExponentiation( |
| 948 PreParserExpression left, PreParserExpression right, int pos) { | 968 PreParserExpression left, PreParserExpression right, int pos) { |
| 949 return left; | 969 return left; |
| 950 } | 970 } |
| 951 | 971 |
| 952 inline void QueueDestructuringAssignmentForRewriting(PreParserExpression) {} | 972 inline void QueueDestructuringAssignmentForRewriting(PreParserExpression) {} |
| 953 inline void QueueNonPatternForRewriting(PreParserExpression) {} | 973 inline void QueueNonPatternForRewriting(PreParserExpression) {} |
| 954 | 974 |
| 955 void SetFunctionNameFromPropertyName(PreParserExpression, | 975 void SetFunctionNameFromPropertyName(PreParserExpression, |
| 956 PreParserIdentifier) {} | 976 PreParserIdentifier) {} |
| 957 void SetFunctionNameFromIdentifierRef(PreParserExpression, | 977 void SetFunctionNameFromIdentifierRef(PreParserExpression, |
| 958 PreParserExpression) {} | 978 PreParserExpression) {} |
| 959 | 979 |
| 960 inline void RewriteNonPattern(Type::ExpressionClassifier* classifier, | 980 inline void RewriteNonPattern(Type::ExpressionClassifier* classifier, |
| 961 bool* ok); | 981 bool* ok); |
| 962 | 982 |
| 983 inline PreParserExpression RewriteAwaitExpression(PreParserExpression value, |
| 984 int pos); |
| 985 |
| 963 V8_INLINE Zone* zone() const; | 986 V8_INLINE Zone* zone() const; |
| 964 V8_INLINE ZoneList<PreParserExpression>* GetNonPatternList() const; | 987 V8_INLINE ZoneList<PreParserExpression>* GetNonPatternList() const; |
| 965 | 988 |
| 966 inline PreParserExpression RewriteYieldStar( | 989 inline PreParserExpression RewriteYieldStar( |
| 967 PreParserExpression generator, PreParserExpression expr, int pos); | 990 PreParserExpression generator, PreParserExpression expr, int pos); |
| 968 inline PreParserExpression RewriteInstanceof(PreParserExpression lhs, | 991 inline PreParserExpression RewriteInstanceof(PreParserExpression lhs, |
| 969 PreParserExpression rhs, | 992 PreParserExpression rhs, |
| 970 int pos); | 993 int pos); |
| 971 | 994 |
| 972 private: | 995 private: |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1071 void ParseStatementList(int end_token, bool* ok, | 1094 void ParseStatementList(int end_token, bool* ok, |
| 1072 Scanner::BookmarkScope* bookmark = nullptr); | 1095 Scanner::BookmarkScope* bookmark = nullptr); |
| 1073 Statement ParseStatement(AllowLabelledFunctionStatement allow_function, | 1096 Statement ParseStatement(AllowLabelledFunctionStatement allow_function, |
| 1074 bool* ok); | 1097 bool* ok); |
| 1075 Statement ParseSubStatement(AllowLabelledFunctionStatement allow_function, | 1098 Statement ParseSubStatement(AllowLabelledFunctionStatement allow_function, |
| 1076 bool* ok); | 1099 bool* ok); |
| 1077 Statement ParseScopedStatement(bool legacy, bool* ok); | 1100 Statement ParseScopedStatement(bool legacy, bool* ok); |
| 1078 Statement ParseHoistableDeclaration(bool* ok); | 1101 Statement ParseHoistableDeclaration(bool* ok); |
| 1079 Statement ParseHoistableDeclaration(int pos, bool is_generator, bool* ok); | 1102 Statement ParseHoistableDeclaration(int pos, bool is_generator, bool* ok); |
| 1080 Statement ParseFunctionDeclaration(bool* ok); | 1103 Statement ParseFunctionDeclaration(bool* ok); |
| 1104 Statement ParseAsyncFunctionDeclaration(bool* ok); |
| 1105 Expression ParseAsyncFunctionExpression(bool* ok); |
| 1081 Statement ParseClassDeclaration(bool* ok); | 1106 Statement ParseClassDeclaration(bool* ok); |
| 1082 Statement ParseBlock(bool* ok); | 1107 Statement ParseBlock(bool* ok); |
| 1083 Statement ParseVariableStatement(VariableDeclarationContext var_context, | 1108 Statement ParseVariableStatement(VariableDeclarationContext var_context, |
| 1084 bool* ok); | 1109 bool* ok); |
| 1085 Statement ParseVariableDeclarations(VariableDeclarationContext var_context, | 1110 Statement ParseVariableDeclarations(VariableDeclarationContext var_context, |
| 1086 int* num_decl, bool* is_lexical, | 1111 int* num_decl, bool* is_lexical, |
| 1087 bool* is_binding_pattern, | 1112 bool* is_binding_pattern, |
| 1088 Scanner::Location* first_initializer_loc, | 1113 Scanner::Location* first_initializer_loc, |
| 1089 Scanner::Location* bindings_loc, | 1114 Scanner::Location* bindings_loc, |
| 1090 bool* ok); | 1115 bool* ok); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1159 | 1184 |
| 1160 | 1185 |
| 1161 void PreParserTraits::ParseArrowFunctionFormalParameterList( | 1186 void PreParserTraits::ParseArrowFunctionFormalParameterList( |
| 1162 PreParserFormalParameters* parameters, | 1187 PreParserFormalParameters* parameters, |
| 1163 PreParserExpression params, const Scanner::Location& params_loc, | 1188 PreParserExpression params, const Scanner::Location& params_loc, |
| 1164 Scanner::Location* duplicate_loc, bool* ok) { | 1189 Scanner::Location* duplicate_loc, bool* ok) { |
| 1165 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter | 1190 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter |
| 1166 // lists that are too long. | 1191 // lists that are too long. |
| 1167 } | 1192 } |
| 1168 | 1193 |
| 1194 PreParserExpression PreParserTraits::ParseAsyncFunctionExpression(bool* ok) { |
| 1195 return pre_parser_->ParseAsyncFunctionExpression(ok); |
| 1196 } |
| 1169 | 1197 |
| 1170 PreParserExpression PreParserTraits::ParseDoExpression(bool* ok) { | 1198 PreParserExpression PreParserTraits::ParseDoExpression(bool* ok) { |
| 1171 return pre_parser_->ParseDoExpression(ok); | 1199 return pre_parser_->ParseDoExpression(ok); |
| 1172 } | 1200 } |
| 1173 | 1201 |
| 1174 | 1202 |
| 1175 void PreParserTraits::RewriteNonPattern(Type::ExpressionClassifier* classifier, | 1203 void PreParserTraits::RewriteNonPattern(Type::ExpressionClassifier* classifier, |
| 1176 bool* ok) { | 1204 bool* ok) { |
| 1177 pre_parser_->ValidateExpression(classifier, ok); | 1205 pre_parser_->ValidateExpression(classifier, ok); |
| 1178 } | 1206 } |
| 1179 | 1207 |
| 1208 PreParserExpression PreParserTraits::RewriteAwaitExpression( |
| 1209 PreParserExpression value, int pos) { |
| 1210 return value; |
| 1211 } |
| 1180 | 1212 |
| 1181 Zone* PreParserTraits::zone() const { | 1213 Zone* PreParserTraits::zone() const { |
| 1182 return pre_parser_->function_state_->scope()->zone(); | 1214 return pre_parser_->function_state_->scope()->zone(); |
| 1183 } | 1215 } |
| 1184 | 1216 |
| 1185 | 1217 |
| 1186 ZoneList<PreParserExpression>* PreParserTraits::GetNonPatternList() const { | 1218 ZoneList<PreParserExpression>* PreParserTraits::GetNonPatternList() const { |
| 1187 return pre_parser_->function_state_->non_patterns_to_rewrite(); | 1219 return pre_parser_->function_state_->non_patterns_to_rewrite(); |
| 1188 } | 1220 } |
| 1189 | 1221 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1224 const PreParserFormalParameters& parameters, FunctionKind kind, | 1256 const PreParserFormalParameters& parameters, FunctionKind kind, |
| 1225 FunctionLiteral::FunctionType function_type, bool* ok) { | 1257 FunctionLiteral::FunctionType function_type, bool* ok) { |
| 1226 return pre_parser_->ParseEagerFunctionBody(function_name, pos, parameters, | 1258 return pre_parser_->ParseEagerFunctionBody(function_name, pos, parameters, |
| 1227 kind, function_type, ok); | 1259 kind, function_type, ok); |
| 1228 } | 1260 } |
| 1229 | 1261 |
| 1230 } // namespace internal | 1262 } // namespace internal |
| 1231 } // namespace v8 | 1263 } // namespace v8 |
| 1232 | 1264 |
| 1233 #endif // V8_PARSING_PREPARSER_H | 1265 #endif // V8_PARSING_PREPARSER_H |
| OLD | NEW |