| 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_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; | 91 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; |
| 92 typedef typename Traits::Type::Literal LiteralT; | 92 typedef typename Traits::Type::Literal LiteralT; |
| 93 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; | 93 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; |
| 94 typedef typename Traits::Type::StatementList StatementListT; | 94 typedef typename Traits::Type::StatementList StatementListT; |
| 95 typedef typename Traits::Type::ExpressionClassifier ExpressionClassifier; | 95 typedef typename Traits::Type::ExpressionClassifier ExpressionClassifier; |
| 96 | 96 |
| 97 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, | 97 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, |
| 98 v8::Extension* extension, AstValueFactory* ast_value_factory, | 98 v8::Extension* extension, AstValueFactory* ast_value_factory, |
| 99 ParserRecorder* log, typename Traits::Type::Parser this_object) | 99 ParserRecorder* log, typename Traits::Type::Parser this_object) |
| 100 : Traits(this_object), | 100 : Traits(this_object), |
| 101 parenthesized_function_(false), | |
| 102 scope_(NULL), | 101 scope_(NULL), |
| 103 function_state_(NULL), | 102 function_state_(NULL), |
| 104 extension_(extension), | 103 extension_(extension), |
| 105 fni_(NULL), | 104 fni_(NULL), |
| 106 ast_value_factory_(ast_value_factory), | 105 ast_value_factory_(ast_value_factory), |
| 107 log_(log), | 106 log_(log), |
| 108 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. | 107 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. |
| 109 stack_limit_(stack_limit), | 108 stack_limit_(stack_limit), |
| 110 zone_(zone), | 109 zone_(zone), |
| 111 scanner_(scanner), | 110 scanner_(scanner), |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 return collect_expressions_in_tail_position_; | 258 return collect_expressions_in_tail_position_; |
| 260 } | 259 } |
| 261 void set_collect_expressions_in_tail_position(bool collect) { | 260 void set_collect_expressions_in_tail_position(bool collect) { |
| 262 collect_expressions_in_tail_position_ = collect; | 261 collect_expressions_in_tail_position_ = collect; |
| 263 } | 262 } |
| 264 | 263 |
| 265 ZoneList<ExpressionT>* non_patterns_to_rewrite() { | 264 ZoneList<ExpressionT>* non_patterns_to_rewrite() { |
| 266 return &non_patterns_to_rewrite_; | 265 return &non_patterns_to_rewrite_; |
| 267 } | 266 } |
| 268 | 267 |
| 268 void next_function_is_parenthesized(bool parenthesized) { |
| 269 next_function_is_parenthesized_ = parenthesized; |
| 270 } |
| 271 |
| 272 bool this_function_is_parenthesized() const { |
| 273 return this_function_is_parenthesized_; |
| 274 } |
| 275 |
| 269 private: | 276 private: |
| 270 void AddDestructuringAssignment(DestructuringAssignment pair) { | 277 void AddDestructuringAssignment(DestructuringAssignment pair) { |
| 271 destructuring_assignments_to_rewrite_.Add(pair); | 278 destructuring_assignments_to_rewrite_.Add(pair); |
| 272 } | 279 } |
| 273 | 280 |
| 274 V8_INLINE Scope* scope() { return *scope_stack_; } | 281 V8_INLINE Scope* scope() { return *scope_stack_; } |
| 275 | 282 |
| 276 void AddNonPatternForRewriting(ExpressionT expr) { | 283 void AddNonPatternForRewriting(ExpressionT expr) { |
| 277 non_patterns_to_rewrite_.Add(expr, (*scope_stack_)->zone()); | 284 non_patterns_to_rewrite_.Add(expr, (*scope_stack_)->zone()); |
| 278 } | 285 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 305 Scope** scope_stack_; | 312 Scope** scope_stack_; |
| 306 Scope* outer_scope_; | 313 Scope* outer_scope_; |
| 307 | 314 |
| 308 List<DestructuringAssignment> destructuring_assignments_to_rewrite_; | 315 List<DestructuringAssignment> destructuring_assignments_to_rewrite_; |
| 309 List<ExpressionT> expressions_in_tail_position_; | 316 List<ExpressionT> expressions_in_tail_position_; |
| 310 bool collect_expressions_in_tail_position_; | 317 bool collect_expressions_in_tail_position_; |
| 311 ZoneList<ExpressionT> non_patterns_to_rewrite_; | 318 ZoneList<ExpressionT> non_patterns_to_rewrite_; |
| 312 | 319 |
| 313 typename Traits::Type::Factory* factory_; | 320 typename Traits::Type::Factory* factory_; |
| 314 | 321 |
| 322 // If true, the next (and immediately following) function literal is |
| 323 // preceded by a parenthesis. |
| 324 bool next_function_is_parenthesized_; |
| 325 |
| 326 // The value of the parents' next_function_is_parenthesized_, as it applies |
| 327 // to this function. Filled in by constructor. |
| 328 bool this_function_is_parenthesized_; |
| 329 |
| 315 friend class ParserTraits; | 330 friend class ParserTraits; |
| 316 friend class PreParserTraits; | 331 friend class PreParserTraits; |
| 317 friend class Checkpoint; | 332 friend class Checkpoint; |
| 318 }; | 333 }; |
| 319 | 334 |
| 320 // Annoyingly, arrow functions first parse as comma expressions, then when we | 335 // Annoyingly, arrow functions first parse as comma expressions, then when we |
| 321 // see the => we have to go back and reinterpret the arguments as being formal | 336 // see the => we have to go back and reinterpret the arguments as being formal |
| 322 // parameters. To do so we need to reset some of the parser state back to | 337 // parameters. To do so we need to reset some of the parser state back to |
| 323 // what it was before the arguments were first seen. | 338 // what it was before the arguments were first seen. |
| 324 class Checkpoint BASE_EMBEDDED { | 339 class Checkpoint BASE_EMBEDDED { |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 bool IsConstructor() { | 896 bool IsConstructor() { |
| 882 return this->scanner()->LiteralMatches("constructor", 11); | 897 return this->scanner()->LiteralMatches("constructor", 11); |
| 883 } | 898 } |
| 884 bool IsPrototype() { | 899 bool IsPrototype() { |
| 885 return this->scanner()->LiteralMatches("prototype", 9); | 900 return this->scanner()->LiteralMatches("prototype", 9); |
| 886 } | 901 } |
| 887 | 902 |
| 888 bool has_seen_constructor_; | 903 bool has_seen_constructor_; |
| 889 }; | 904 }; |
| 890 | 905 |
| 891 // If true, the next (and immediately following) function literal is | |
| 892 // preceded by a parenthesis. | |
| 893 // Heuristically that means that the function will be called immediately, | |
| 894 // so never lazily compile it. | |
| 895 bool parenthesized_function_; | |
| 896 | |
| 897 Scope* scope_; // Scope stack. | 906 Scope* scope_; // Scope stack. |
| 898 FunctionState* function_state_; // Function state stack. | 907 FunctionState* function_state_; // Function state stack. |
| 899 v8::Extension* extension_; | 908 v8::Extension* extension_; |
| 900 FuncNameInferrer* fni_; | 909 FuncNameInferrer* fni_; |
| 901 AstValueFactory* ast_value_factory_; // Not owned. | 910 AstValueFactory* ast_value_factory_; // Not owned. |
| 902 ParserRecorder* log_; | 911 ParserRecorder* log_; |
| 903 Mode mode_; | 912 Mode mode_; |
| 904 uintptr_t stack_limit_; | 913 uintptr_t stack_limit_; |
| 905 | 914 |
| 906 private: | 915 private: |
| (...skipping 21 matching lines...) Expand all Loading... |
| 928 return_location_(Scanner::Location::invalid()), | 937 return_location_(Scanner::Location::invalid()), |
| 929 super_location_(Scanner::Location::invalid()), | 938 super_location_(Scanner::Location::invalid()), |
| 930 kind_(kind), | 939 kind_(kind), |
| 931 generator_object_variable_(NULL), | 940 generator_object_variable_(NULL), |
| 932 function_state_stack_(function_state_stack), | 941 function_state_stack_(function_state_stack), |
| 933 outer_function_state_(*function_state_stack), | 942 outer_function_state_(*function_state_stack), |
| 934 scope_stack_(scope_stack), | 943 scope_stack_(scope_stack), |
| 935 outer_scope_(*scope_stack), | 944 outer_scope_(*scope_stack), |
| 936 collect_expressions_in_tail_position_(true), | 945 collect_expressions_in_tail_position_(true), |
| 937 non_patterns_to_rewrite_(0, scope->zone()), | 946 non_patterns_to_rewrite_(0, scope->zone()), |
| 938 factory_(factory) { | 947 factory_(factory), |
| 948 next_function_is_parenthesized_(false), |
| 949 this_function_is_parenthesized_(false) { |
| 939 *scope_stack_ = scope; | 950 *scope_stack_ = scope; |
| 940 *function_state_stack = this; | 951 *function_state_stack = this; |
| 952 if (outer_function_state_) { |
| 953 this_function_is_parenthesized_ = |
| 954 outer_function_state_->next_function_is_parenthesized_; |
| 955 outer_function_state_->next_function_is_parenthesized_ = false; |
| 956 } |
| 941 } | 957 } |
| 942 | 958 |
| 943 | 959 |
| 944 template <class Traits> | 960 template <class Traits> |
| 945 ParserBase<Traits>::FunctionState::~FunctionState() { | 961 ParserBase<Traits>::FunctionState::~FunctionState() { |
| 946 *scope_stack_ = outer_scope_; | 962 *scope_stack_ = outer_scope_; |
| 947 *function_state_stack_ = outer_function_state_; | 963 *function_state_stack_ = outer_function_state_; |
| 948 } | 964 } |
| 949 | 965 |
| 950 template <class Traits> | 966 template <class Traits> |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1296 ReportMessageAt(scanner()->peek_location(), | 1312 ReportMessageAt(scanner()->peek_location(), |
| 1297 MessageTemplate::kParamAfterRest); | 1313 MessageTemplate::kParamAfterRest); |
| 1298 *ok = false; | 1314 *ok = false; |
| 1299 return this->EmptyExpression(); | 1315 return this->EmptyExpression(); |
| 1300 } | 1316 } |
| 1301 Expect(Token::RPAREN, CHECK_OK); | 1317 Expect(Token::RPAREN, CHECK_OK); |
| 1302 return factory()->NewSpread(expr, ellipsis_pos, expr_pos); | 1318 return factory()->NewSpread(expr, ellipsis_pos, expr_pos); |
| 1303 } | 1319 } |
| 1304 // Heuristically try to detect immediately called functions before | 1320 // Heuristically try to detect immediately called functions before |
| 1305 // seeing the call parentheses. | 1321 // seeing the call parentheses. |
| 1306 parenthesized_function_ = (peek() == Token::FUNCTION); | 1322 function_state_->next_function_is_parenthesized(peek() == |
| 1323 Token::FUNCTION); |
| 1307 ExpressionT expr = this->ParseExpression(true, classifier, CHECK_OK); | 1324 ExpressionT expr = this->ParseExpression(true, classifier, CHECK_OK); |
| 1308 Expect(Token::RPAREN, CHECK_OK); | 1325 Expect(Token::RPAREN, CHECK_OK); |
| 1309 return expr; | 1326 return expr; |
| 1310 } | 1327 } |
| 1311 | 1328 |
| 1312 case Token::CLASS: { | 1329 case Token::CLASS: { |
| 1313 BindingPatternUnexpectedToken(classifier); | 1330 BindingPatternUnexpectedToken(classifier); |
| 1314 Consume(Token::CLASS); | 1331 Consume(Token::CLASS); |
| 1315 int class_token_position = position(); | 1332 int class_token_position = position(); |
| 1316 IdentifierT name = this->EmptyIdentifier(); | 1333 IdentifierT name = this->EmptyIdentifier(); |
| (...skipping 1513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2830 body = this->ParseEagerFunctionBody( | 2847 body = this->ParseEagerFunctionBody( |
| 2831 this->EmptyIdentifier(), RelocInfo::kNoPosition, formal_parameters, | 2848 this->EmptyIdentifier(), RelocInfo::kNoPosition, formal_parameters, |
| 2832 kArrowFunction, FunctionLiteral::kAnonymousExpression, CHECK_OK); | 2849 kArrowFunction, FunctionLiteral::kAnonymousExpression, CHECK_OK); |
| 2833 materialized_literal_count = | 2850 materialized_literal_count = |
| 2834 function_state.materialized_literal_count(); | 2851 function_state.materialized_literal_count(); |
| 2835 expected_property_count = function_state.expected_property_count(); | 2852 expected_property_count = function_state.expected_property_count(); |
| 2836 } | 2853 } |
| 2837 } else { | 2854 } else { |
| 2838 // Single-expression body | 2855 // Single-expression body |
| 2839 int pos = position(); | 2856 int pos = position(); |
| 2840 parenthesized_function_ = false; | |
| 2841 ExpressionClassifier classifier(this); | 2857 ExpressionClassifier classifier(this); |
| 2842 ExpressionT expression = | 2858 ExpressionT expression = |
| 2843 ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK); | 2859 ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK); |
| 2844 Traits::RewriteNonPattern(&classifier, CHECK_OK); | 2860 Traits::RewriteNonPattern(&classifier, CHECK_OK); |
| 2845 body = this->NewStatementList(1, zone()); | 2861 body = this->NewStatementList(1, zone()); |
| 2846 this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK); | 2862 this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK); |
| 2847 body->Add(factory()->NewReturnStatement(expression, pos), zone()); | 2863 body->Add(factory()->NewReturnStatement(expression, pos), zone()); |
| 2848 materialized_literal_count = function_state.materialized_literal_count(); | 2864 materialized_literal_count = function_state.materialized_literal_count(); |
| 2849 expected_property_count = function_state.expected_property_count(); | 2865 expected_property_count = function_state.expected_property_count(); |
| 2850 } | 2866 } |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3096 has_seen_constructor_ = true; | 3112 has_seen_constructor_ = true; |
| 3097 return; | 3113 return; |
| 3098 } | 3114 } |
| 3099 } | 3115 } |
| 3100 | 3116 |
| 3101 | 3117 |
| 3102 } // namespace internal | 3118 } // namespace internal |
| 3103 } // namespace v8 | 3119 } // namespace v8 |
| 3104 | 3120 |
| 3105 #endif // V8_PARSING_PARSER_BASE_H | 3121 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |