| 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_PREPARSER_H | 5 #ifndef V8_PREPARSER_H |
| 6 #define V8_PREPARSER_H | 6 #define V8_PREPARSER_H |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/func-name-inferrer.h" | 10 #include "src/func-name-inferrer.h" |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 scanner()->SetHarmonyScoping(allow); | 110 scanner()->SetHarmonyScoping(allow); |
| 111 } | 111 } |
| 112 void set_allow_harmony_numeric_literals(bool allow) { | 112 void set_allow_harmony_numeric_literals(bool allow) { |
| 113 scanner()->SetHarmonyNumericLiterals(allow); | 113 scanner()->SetHarmonyNumericLiterals(allow); |
| 114 } | 114 } |
| 115 void set_allow_classes(bool allow) { | 115 void set_allow_classes(bool allow) { |
| 116 scanner()->SetHarmonyClasses(allow); | 116 scanner()->SetHarmonyClasses(allow); |
| 117 } | 117 } |
| 118 | 118 |
| 119 protected: | 119 protected: |
| 120 friend class Traits::Type::Checkpoint; | 120 friend class Traits::Checkpoint; |
| 121 | 121 |
| 122 enum AllowEvalOrArgumentsAsIdentifier { | 122 enum AllowEvalOrArgumentsAsIdentifier { |
| 123 kAllowEvalOrArguments, | 123 kAllowEvalOrArguments, |
| 124 kDontAllowEvalOrArguments | 124 kDontAllowEvalOrArguments |
| 125 }; | 125 }; |
| 126 | 126 |
| 127 enum Mode { | 127 enum Mode { |
| 128 PARSE_LAZILY, | 128 PARSE_LAZILY, |
| 129 PARSE_EAGERLY | 129 PARSE_EAGERLY |
| 130 }; | 130 }; |
| 131 | 131 |
| 132 class ParserCheckpoint; | 132 class CheckpointBase; |
| 133 | 133 |
| 134 // --------------------------------------------------------------------------- | 134 // --------------------------------------------------------------------------- |
| 135 // FunctionState and BlockState together implement the parser's scope stack. | 135 // FunctionState and BlockState together implement the parser's scope stack. |
| 136 // The parser's current scope is in scope_. BlockState and FunctionState | 136 // The parser's current scope is in scope_. BlockState and FunctionState |
| 137 // constructors push on the scope stack and the destructors pop. They are also | 137 // constructors push on the scope stack and the destructors pop. They are also |
| 138 // used to hold the parser's per-function and per-block state. | 138 // used to hold the parser's per-function and per-block state. |
| 139 class BlockState BASE_EMBEDDED { | 139 class BlockState BASE_EMBEDDED { |
| 140 public: | 140 public: |
| 141 BlockState(typename Traits::Type::Scope** scope_stack, | 141 BlockState(typename Traits::Type::Scope** scope_stack, |
| 142 typename Traits::Type::Scope* scope) | 142 typename Traits::Type::Scope* scope) |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 | 219 |
| 220 FunctionState** function_state_stack_; | 220 FunctionState** function_state_stack_; |
| 221 FunctionState* outer_function_state_; | 221 FunctionState* outer_function_state_; |
| 222 typename Traits::Type::Scope** scope_stack_; | 222 typename Traits::Type::Scope** scope_stack_; |
| 223 typename Traits::Type::Scope* outer_scope_; | 223 typename Traits::Type::Scope* outer_scope_; |
| 224 int saved_ast_node_id_; // Only used by ParserTraits. | 224 int saved_ast_node_id_; // Only used by ParserTraits. |
| 225 typename Traits::Type::Zone* extra_param_; | 225 typename Traits::Type::Zone* extra_param_; |
| 226 typename Traits::Type::Factory factory_; | 226 typename Traits::Type::Factory factory_; |
| 227 | 227 |
| 228 friend class ParserTraits; | 228 friend class ParserTraits; |
| 229 friend class ParserCheckpoint; | 229 friend class CheckpointBase; |
| 230 }; | 230 }; |
| 231 | 231 |
| 232 // Annoyingly, arrow functions first parse as comma expressions, then when we | 232 // Annoyingly, arrow functions first parse as comma expressions, then when we |
| 233 // see the => we have to go back and reinterpret the arguments as being formal | 233 // see the => we have to go back and reinterpret the arguments as being formal |
| 234 // parameters. To do so we need to reset some of the parser state back to | 234 // parameters. To do so we need to reset some of the parser state back to |
| 235 // what it was before the arguments were first seen. | 235 // what it was before the arguments were first seen. |
| 236 class ParserCheckpoint : public Traits::Type::Checkpoint { | 236 class CheckpointBase BASE_EMBEDDED { |
| 237 public: | 237 public: |
| 238 template <typename Parser> | 238 explicit CheckpointBase(ParserBase* parser) { |
| 239 explicit ParserCheckpoint(Parser* parser) | |
| 240 : Traits::Type::Checkpoint(parser) { | |
| 241 function_state_ = parser->function_state_; | 239 function_state_ = parser->function_state_; |
| 242 next_materialized_literal_index_ = | 240 next_materialized_literal_index_ = |
| 243 function_state_->next_materialized_literal_index_; | 241 function_state_->next_materialized_literal_index_; |
| 244 next_handler_index_ = function_state_->next_handler_index_; | 242 next_handler_index_ = function_state_->next_handler_index_; |
| 245 expected_property_count_ = function_state_->expected_property_count_; | 243 expected_property_count_ = function_state_->expected_property_count_; |
| 246 } | 244 } |
| 247 | 245 |
| 248 void Restore() { | 246 void Restore() { |
| 249 Traits::Type::Checkpoint::Restore(); | |
| 250 function_state_->next_materialized_literal_index_ = | 247 function_state_->next_materialized_literal_index_ = |
| 251 next_materialized_literal_index_; | 248 next_materialized_literal_index_; |
| 252 function_state_->next_handler_index_ = next_handler_index_; | 249 function_state_->next_handler_index_ = next_handler_index_; |
| 253 function_state_->expected_property_count_ = expected_property_count_; | 250 function_state_->expected_property_count_ = expected_property_count_; |
| 254 } | 251 } |
| 255 | 252 |
| 256 private: | 253 private: |
| 257 FunctionState* function_state_; | 254 FunctionState* function_state_; |
| 258 int next_materialized_literal_index_; | 255 int next_materialized_literal_index_; |
| 259 int next_handler_index_; | 256 int next_handler_index_; |
| (...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1017 public: | 1014 public: |
| 1018 struct Type { | 1015 struct Type { |
| 1019 // TODO(marja): To be removed. The Traits object should contain all the data | 1016 // TODO(marja): To be removed. The Traits object should contain all the data |
| 1020 // it needs. | 1017 // it needs. |
| 1021 typedef PreParser* Parser; | 1018 typedef PreParser* Parser; |
| 1022 | 1019 |
| 1023 // Used by FunctionState and BlockState. | 1020 // Used by FunctionState and BlockState. |
| 1024 typedef PreParserScope Scope; | 1021 typedef PreParserScope Scope; |
| 1025 typedef PreParserScope ScopePtr; | 1022 typedef PreParserScope ScopePtr; |
| 1026 | 1023 |
| 1027 class Checkpoint BASE_EMBEDDED { | |
| 1028 public: | |
| 1029 template <typename Parser> | |
| 1030 explicit Checkpoint(Parser* parser) {} | |
| 1031 void Restore() {} | |
| 1032 }; | |
| 1033 | |
| 1034 // PreParser doesn't need to store generator variables. | 1024 // PreParser doesn't need to store generator variables. |
| 1035 typedef void GeneratorVariable; | 1025 typedef void GeneratorVariable; |
| 1036 // No interaction with Zones. | 1026 // No interaction with Zones. |
| 1037 typedef void Zone; | 1027 typedef void Zone; |
| 1038 | 1028 |
| 1039 typedef int AstProperties; | 1029 typedef int AstProperties; |
| 1040 typedef Vector<PreParserIdentifier> ParameterIdentifierVector; | 1030 typedef Vector<PreParserIdentifier> ParameterIdentifierVector; |
| 1041 | 1031 |
| 1042 // Return types for traversing functions. | 1032 // Return types for traversing functions. |
| 1043 typedef PreParserIdentifier Identifier; | 1033 typedef PreParserIdentifier Identifier; |
| 1044 typedef PreParserExpression Expression; | 1034 typedef PreParserExpression Expression; |
| 1045 typedef PreParserExpression YieldExpression; | 1035 typedef PreParserExpression YieldExpression; |
| 1046 typedef PreParserExpression FunctionLiteral; | 1036 typedef PreParserExpression FunctionLiteral; |
| 1047 typedef PreParserExpression ObjectLiteralProperty; | 1037 typedef PreParserExpression ObjectLiteralProperty; |
| 1048 typedef PreParserExpression Literal; | 1038 typedef PreParserExpression Literal; |
| 1049 typedef PreParserExpressionList ExpressionList; | 1039 typedef PreParserExpressionList ExpressionList; |
| 1050 typedef PreParserExpressionList PropertyList; | 1040 typedef PreParserExpressionList PropertyList; |
| 1051 typedef PreParserStatementList StatementList; | 1041 typedef PreParserStatementList StatementList; |
| 1052 | 1042 |
| 1053 // For constructing objects returned by the traversing functions. | 1043 // For constructing objects returned by the traversing functions. |
| 1054 typedef PreParserFactory Factory; | 1044 typedef PreParserFactory Factory; |
| 1055 }; | 1045 }; |
| 1056 | 1046 |
| 1047 class Checkpoint; |
| 1048 |
| 1057 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 1049 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
| 1058 | 1050 |
| 1059 // Custom operations executed when FunctionStates are created and | 1051 // Custom operations executed when FunctionStates are created and |
| 1060 // destructed. (The PreParser doesn't need to do anything.) | 1052 // destructed. (The PreParser doesn't need to do anything.) |
| 1061 template<typename FunctionState> | 1053 template<typename FunctionState> |
| 1062 static void SetUpFunctionState(FunctionState* function_state, void*) {} | 1054 static void SetUpFunctionState(FunctionState* function_state, void*) {} |
| 1063 template<typename FunctionState> | 1055 template<typename FunctionState> |
| 1064 static void TearDownFunctionState(FunctionState* function_state, void*) {} | 1056 static void TearDownFunctionState(FunctionState* function_state, void*) {} |
| 1065 | 1057 |
| 1066 // Helper functions for recursive descent. | 1058 // Helper functions for recursive descent. |
| (...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1972 // YieldExpression | 1964 // YieldExpression |
| 1973 // LeftHandSideExpression AssignmentOperator AssignmentExpression | 1965 // LeftHandSideExpression AssignmentOperator AssignmentExpression |
| 1974 | 1966 |
| 1975 Scanner::Location lhs_location = scanner()->peek_location(); | 1967 Scanner::Location lhs_location = scanner()->peek_location(); |
| 1976 | 1968 |
| 1977 if (peek() == Token::YIELD && is_generator()) { | 1969 if (peek() == Token::YIELD && is_generator()) { |
| 1978 return this->ParseYieldExpression(ok); | 1970 return this->ParseYieldExpression(ok); |
| 1979 } | 1971 } |
| 1980 | 1972 |
| 1981 if (fni_ != NULL) fni_->Enter(); | 1973 if (fni_ != NULL) fni_->Enter(); |
| 1982 ParserCheckpoint checkpoint(this); | 1974 typename Traits::Checkpoint checkpoint(this); |
| 1983 ExpressionT expression = | 1975 ExpressionT expression = |
| 1984 this->ParseConditionalExpression(accept_IN, CHECK_OK); | 1976 this->ParseConditionalExpression(accept_IN, CHECK_OK); |
| 1985 | 1977 |
| 1986 if (allow_arrow_functions() && peek() == Token::ARROW) { | 1978 if (allow_arrow_functions() && peek() == Token::ARROW) { |
| 1987 checkpoint.Restore(); | 1979 checkpoint.Restore(); |
| 1988 expression = this->ParseArrowFunctionLiteral(lhs_location.beg_pos, | 1980 expression = this->ParseArrowFunctionLiteral(lhs_location.beg_pos, |
| 1989 expression, CHECK_OK); | 1981 expression, CHECK_OK); |
| 1990 return expression; | 1982 return expression; |
| 1991 } | 1983 } |
| 1992 | 1984 |
| (...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2576 } | 2568 } |
| 2577 | 2569 |
| 2578 | 2570 |
| 2579 #undef CHECK_OK | 2571 #undef CHECK_OK |
| 2580 #undef CHECK_OK_CUSTOM | 2572 #undef CHECK_OK_CUSTOM |
| 2581 | 2573 |
| 2582 | 2574 |
| 2583 } } // v8::internal | 2575 } } // v8::internal |
| 2584 | 2576 |
| 2585 #endif // V8_PREPARSER_H | 2577 #endif // V8_PREPARSER_H |
| OLD | NEW |