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_PARSER_H_ | 5 #ifndef V8_PARSING_PARSER_H_ |
6 #define V8_PARSING_PARSER_H_ | 6 #define V8_PARSING_PARSER_H_ |
7 | 7 |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
10 #include "src/parsing/parser-base.h" | 10 #include "src/parsing/parser-base.h" |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
168 typedef AstNodeFactory Factory; | 168 typedef AstNodeFactory Factory; |
169 }; | 169 }; |
170 | 170 |
171 // TODO(nikolaos): The traits methods should not need to call methods | 171 // TODO(nikolaos): The traits methods should not need to call methods |
172 // of the implementation object. | 172 // of the implementation object. |
173 Parser* delegate() { return reinterpret_cast<Parser*>(this); } | 173 Parser* delegate() { return reinterpret_cast<Parser*>(this); } |
174 const Parser* delegate() const { | 174 const Parser* delegate() const { |
175 return reinterpret_cast<const Parser*>(this); | 175 return reinterpret_cast<const Parser*>(this); |
176 } | 176 } |
177 | 177 |
178 // Rewrites the following types of unary expressions: | |
179 // not <literal> -> true / false | |
180 // + <numeric literal> -> <numeric literal> | |
181 // - <numeric literal> -> <numeric literal with value negated> | |
182 // ! <literal> -> true / false | |
183 // The following rewriting rules enable the collection of type feedback | |
184 // without any special stub and the multiplication is removed later in | |
185 // Crankshaft's canonicalization pass. | |
186 // + foo -> foo * 1 | |
187 // - foo -> foo * (-1) | |
188 // ~ foo -> foo ^(~0) | |
189 Expression* BuildUnaryExpression(Expression* expression, Token::Value op, | |
190 int pos, AstNodeFactory* factory); | |
191 | |
192 Expression* BuildIteratorResult(Expression* value, bool done); | |
193 | |
194 // Generate AST node that throws a ReferenceError with the given type. | |
195 Expression* NewThrowReferenceError(MessageTemplate::Template message, | |
196 int pos); | |
197 | |
198 // Generate AST node that throws a SyntaxError with the given | |
199 // type. The first argument may be null (in the handle sense) in | |
200 // which case no arguments are passed to the constructor. | |
201 Expression* NewThrowSyntaxError(MessageTemplate::Template message, | |
202 const AstRawString* arg, int pos); | |
203 | |
204 // Generate AST node that throws a TypeError with the given | |
205 // type. Both arguments must be non-null (in the handle sense). | |
206 Expression* NewThrowTypeError(MessageTemplate::Template message, | |
207 const AstRawString* arg, int pos); | |
208 | |
209 // Reporting errors. | |
210 void ReportMessageAt(Scanner::Location source_location, | |
211 MessageTemplate::Template message, | |
212 const char* arg = NULL, | |
213 ParseErrorType error_type = kSyntaxError); | |
214 void ReportMessageAt(Scanner::Location source_location, | |
215 MessageTemplate::Template message, | |
216 const AstRawString* arg, | |
217 ParseErrorType error_type = kSyntaxError); | |
218 | |
219 // "null" return type creators. | |
220 static const AstRawString* EmptyIdentifier() { return nullptr; } | |
221 static Expression* EmptyExpression() { return nullptr; } | |
222 static Literal* EmptyLiteral() { return nullptr; } | |
223 static ObjectLiteralProperty* EmptyObjectLiteralProperty() { return nullptr; } | |
224 static FunctionLiteral* EmptyFunctionLiteral() { return nullptr; } | |
225 | |
226 // Used in error return values. | |
227 static ZoneList<Expression*>* NullExpressionList() { return nullptr; } | |
228 | |
229 // Non-NULL empty string. | |
230 V8_INLINE const AstRawString* EmptyIdentifierString() const; | |
231 | |
232 // Odd-ball literal creators. | |
233 Literal* GetLiteralTheHole(int position, AstNodeFactory* factory) const; | |
234 | |
235 // Producing data during the recursive descent. | 178 // Producing data during the recursive descent. |
236 const AstRawString* GetSymbol(Scanner* scanner) const; | 179 const AstRawString* GetSymbol(Scanner* scanner) const; |
237 const AstRawString* GetNextSymbol(Scanner* scanner) const; | 180 const AstRawString* GetNextSymbol(Scanner* scanner) const; |
238 const AstRawString* GetNumberAsSymbol(Scanner* scanner) const; | 181 const AstRawString* GetNumberAsSymbol(Scanner* scanner) const; |
239 | 182 |
240 Expression* ThisExpression(int pos = kNoSourcePosition); | 183 Expression* ThisExpression(int pos = kNoSourcePosition); |
241 Expression* NewSuperPropertyReference(AstNodeFactory* factory, int pos); | 184 Expression* NewSuperPropertyReference(AstNodeFactory* factory, int pos); |
242 Expression* NewSuperCallReference(AstNodeFactory* factory, int pos); | 185 Expression* NewSuperCallReference(AstNodeFactory* factory, int pos); |
243 Expression* NewTargetExpression(int pos); | 186 Expression* NewTargetExpression(int pos); |
244 Expression* FunctionSentExpression(AstNodeFactory* factory, int pos) const; | 187 Expression* FunctionSentExpression(AstNodeFactory* factory, int pos) const; |
(...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
932 if (proxy != NULL) proxy->set_is_assigned(); | 875 if (proxy != NULL) proxy->set_is_assigned(); |
933 return expression; | 876 return expression; |
934 } | 877 } |
935 | 878 |
936 // Returns true if we have a binary expression between two numeric | 879 // Returns true if we have a binary expression between two numeric |
937 // literals. In that case, *x will be changed to an expression which is the | 880 // literals. In that case, *x will be changed to an expression which is the |
938 // computed value. | 881 // computed value. |
939 bool ShortcutNumericLiteralBinaryExpression(Expression** x, Expression* y, | 882 bool ShortcutNumericLiteralBinaryExpression(Expression** x, Expression* y, |
940 Token::Value op, int pos); | 883 Token::Value op, int pos); |
941 | 884 |
885 // Rewrites the following types of unary expressions: | |
886 // not <literal> -> true / false | |
887 // + <numeric literal> -> <numeric literal> | |
888 // - <numeric literal> -> <numeric literal with value negated> | |
889 // ! <literal> -> true / false | |
890 // The following rewriting rules enable the collection of type feedback | |
891 // without any special stub and the multiplication is removed later in | |
892 // Crankshaft's canonicalization pass. | |
893 // + foo -> foo * 1 | |
894 // - foo -> foo * (-1) | |
895 // ~ foo -> foo ^(~0) | |
896 Expression* BuildUnaryExpression(Expression* expression, Token::Value op, | |
897 int pos); | |
898 | |
899 Expression* BuildIteratorResult(Expression* value, bool done); | |
900 | |
901 // Generate AST node that throws a ReferenceError with the given type. | |
902 V8_INLINE Expression* NewThrowReferenceError( | |
marja
2016/08/24 08:57:27
Why did you put the implementation in the parser.h
nickie
2016/08/24 09:16:31
We discussed this offline. No, it doesn't have an
| |
903 MessageTemplate::Template message, int pos) { | |
904 return NewThrowError(Runtime::kNewReferenceError, message, | |
905 ast_value_factory()->empty_string(), pos); | |
906 } | |
907 | |
908 // Generate AST node that throws a SyntaxError with the given | |
909 // type. The first argument may be null (in the handle sense) in | |
910 // which case no arguments are passed to the constructor. | |
911 V8_INLINE Expression* NewThrowSyntaxError(MessageTemplate::Template message, | |
912 const AstRawString* arg, int pos) { | |
913 return NewThrowError(Runtime::kNewSyntaxError, message, arg, pos); | |
914 } | |
915 | |
916 // Generate AST node that throws a TypeError with the given | |
917 // type. Both arguments must be non-null (in the handle sense). | |
918 V8_INLINE Expression* NewThrowTypeError(MessageTemplate::Template message, | |
919 const AstRawString* arg, int pos) { | |
920 return NewThrowError(Runtime::kNewTypeError, message, arg, pos); | |
921 } | |
922 | |
923 // Reporting errors. | |
924 V8_INLINE void ReportMessageAt(Scanner::Location source_location, | |
925 MessageTemplate::Template message, | |
926 const char* arg = NULL, | |
927 ParseErrorType error_type = kSyntaxError) { | |
928 if (stack_overflow()) { | |
929 // Suppress the error message (syntax error or such) in the presence of a | |
930 // stack overflow. The isolate allows only one pending exception at at | |
931 // time | |
932 // and we want to report the stack overflow later. | |
933 return; | |
934 } | |
935 pending_error_handler_.ReportMessageAt(source_location.beg_pos, | |
936 source_location.end_pos, message, | |
937 arg, error_type); | |
938 } | |
939 | |
940 V8_INLINE void ReportMessageAt(Scanner::Location source_location, | |
941 MessageTemplate::Template message, | |
942 const AstRawString* arg, | |
943 ParseErrorType error_type = kSyntaxError) { | |
944 if (stack_overflow()) { | |
945 // Suppress the error message (syntax error or such) in the presence of a | |
946 // stack overflow. The isolate allows only one pending exception at at | |
947 // time | |
948 // and we want to report the stack overflow later. | |
949 return; | |
950 } | |
951 pending_error_handler_.ReportMessageAt(source_location.beg_pos, | |
952 source_location.end_pos, message, | |
953 arg, error_type); | |
954 } | |
955 | |
956 // "null" return type creators. | |
957 V8_INLINE static const AstRawString* EmptyIdentifier() { return nullptr; } | |
958 V8_INLINE static Expression* EmptyExpression() { return nullptr; } | |
959 V8_INLINE static Literal* EmptyLiteral() { return nullptr; } | |
960 V8_INLINE static ObjectLiteralProperty* EmptyObjectLiteralProperty() { | |
961 return nullptr; | |
962 } | |
963 V8_INLINE static FunctionLiteral* EmptyFunctionLiteral() { return nullptr; } | |
964 | |
965 // Used in error return values. | |
966 V8_INLINE static ZoneList<Expression*>* NullExpressionList() { | |
967 return nullptr; | |
968 } | |
969 | |
970 // Non-NULL empty string. | |
971 V8_INLINE const AstRawString* EmptyIdentifierString() const { | |
972 return ast_value_factory()->empty_string(); | |
973 } | |
974 | |
975 // Odd-ball literal creators. | |
976 V8_INLINE Literal* GetLiteralTheHole(int position) { | |
977 return factory()->NewTheHoleLiteral(kNoSourcePosition); | |
978 } | |
979 | |
942 // Parser's private field members. | 980 // Parser's private field members. |
943 | 981 |
944 Scanner scanner_; | 982 Scanner scanner_; |
945 PreParser* reusable_preparser_; | 983 PreParser* reusable_preparser_; |
946 Scope* original_scope_; // for ES5 function declarations in sloppy eval | 984 Scope* original_scope_; // for ES5 function declarations in sloppy eval |
947 Target* target_stack_; // for break, continue statements | 985 Target* target_stack_; // for break, continue statements |
948 ScriptCompiler::CompileOptions compile_options_; | 986 ScriptCompiler::CompileOptions compile_options_; |
949 ParseData* cached_parse_data_; | 987 ParseData* cached_parse_data_; |
950 | 988 |
951 PendingCompilationErrorHandler pending_error_handler_; | 989 PendingCompilationErrorHandler pending_error_handler_; |
952 | 990 |
953 // Other information which will be stored in Parser and moved to Isolate after | 991 // Other information which will be stored in Parser and moved to Isolate after |
954 // parsing. | 992 // parsing. |
955 int use_counts_[v8::Isolate::kUseCounterFeatureCount]; | 993 int use_counts_[v8::Isolate::kUseCounterFeatureCount]; |
956 int total_preparse_skipped_; | 994 int total_preparse_skipped_; |
957 HistogramTimer* pre_parse_timer_; | 995 HistogramTimer* pre_parse_timer_; |
958 | 996 |
959 bool parsing_on_main_thread_; | 997 bool parsing_on_main_thread_; |
960 | 998 |
961 #ifdef DEBUG | 999 #ifdef DEBUG |
962 void Print(AstNode* node); | 1000 void Print(AstNode* node); |
963 #endif // DEBUG | 1001 #endif // DEBUG |
964 }; | 1002 }; |
965 | 1003 |
966 const AstRawString* ParserBaseTraits<Parser>::EmptyIdentifierString() const { | |
967 return delegate()->ast_value_factory()->empty_string(); | |
968 } | |
969 | |
970 | 1004 |
971 // Support for handling complex values (array and object literals) that | 1005 // Support for handling complex values (array and object literals) that |
972 // can be fully handled at compile time. | 1006 // can be fully handled at compile time. |
973 class CompileTimeValue: public AllStatic { | 1007 class CompileTimeValue: public AllStatic { |
974 public: | 1008 public: |
975 enum LiteralType { | 1009 enum LiteralType { |
976 OBJECT_LITERAL_FAST_ELEMENTS, | 1010 OBJECT_LITERAL_FAST_ELEMENTS, |
977 OBJECT_LITERAL_SLOW_ELEMENTS, | 1011 OBJECT_LITERAL_SLOW_ELEMENTS, |
978 ARRAY_LITERAL | 1012 ARRAY_LITERAL |
979 }; | 1013 }; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1050 if (init_block != nullptr) { | 1084 if (init_block != nullptr) { |
1051 body->Add(init_block, delegate()->zone()); | 1085 body->Add(init_block, delegate()->zone()); |
1052 } | 1086 } |
1053 } | 1087 } |
1054 } | 1088 } |
1055 | 1089 |
1056 } // namespace internal | 1090 } // namespace internal |
1057 } // namespace v8 | 1091 } // namespace v8 |
1058 | 1092 |
1059 #endif // V8_PARSING_PARSER_H_ | 1093 #endif // V8_PARSING_PARSER_H_ |
OLD | NEW |