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 945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 typedef PreParserStatement Statement; | 956 typedef PreParserStatement Statement; |
957 | 957 |
958 enum PreParseResult { | 958 enum PreParseResult { |
959 kPreParseStackOverflow, | 959 kPreParseStackOverflow, |
960 kPreParseSuccess | 960 kPreParseSuccess |
961 }; | 961 }; |
962 | 962 |
963 PreParser(Zone* zone, Scanner* scanner, AstValueFactory* ast_value_factory, | 963 PreParser(Zone* zone, Scanner* scanner, AstValueFactory* ast_value_factory, |
964 ParserRecorder* log, uintptr_t stack_limit) | 964 ParserRecorder* log, uintptr_t stack_limit) |
965 : ParserBase<PreParserTraits>(zone, scanner, stack_limit, NULL, | 965 : ParserBase<PreParserTraits>(zone, scanner, stack_limit, NULL, |
966 ast_value_factory, log, this) {} | 966 ast_value_factory, log, this), |
| 967 use_counts_(nullptr) {} |
967 | 968 |
968 // Pre-parse the program from the character stream; returns true on | 969 // Pre-parse the program from the character stream; returns true on |
969 // success (even if parsing failed, the pre-parse data successfully | 970 // success (even if parsing failed, the pre-parse data successfully |
970 // captured the syntax error), and false if a stack-overflow happened | 971 // captured the syntax error), and false if a stack-overflow happened |
971 // during parsing. | 972 // during parsing. |
972 PreParseResult PreParseProgram(int* materialized_literals = 0, | 973 PreParseResult PreParseProgram(int* materialized_literals = 0, |
973 bool is_module = false) { | 974 bool is_module = false) { |
974 Scope* scope = NewScope(scope_, is_module ? MODULE_SCOPE : SCRIPT_SCOPE); | 975 Scope* scope = NewScope(scope_, is_module ? MODULE_SCOPE : SCRIPT_SCOPE); |
975 PreParserFactory factory(NULL); | 976 PreParserFactory factory(NULL); |
976 FunctionState top_scope(&function_state_, &scope_, scope, kNormalFunction, | 977 FunctionState top_scope(&function_state_, &scope_, scope, kNormalFunction, |
(...skipping 17 matching lines...) Expand all Loading... |
994 // Parses a single function literal, from the opening parentheses before | 995 // Parses a single function literal, from the opening parentheses before |
995 // parameters to the closing brace after the body. | 996 // parameters to the closing brace after the body. |
996 // Returns a FunctionEntry describing the body of the function in enough | 997 // Returns a FunctionEntry describing the body of the function in enough |
997 // detail that it can be lazily compiled. | 998 // detail that it can be lazily compiled. |
998 // The scanner is expected to have matched the "function" or "function*" | 999 // The scanner is expected to have matched the "function" or "function*" |
999 // keyword and parameters, and have consumed the initial '{'. | 1000 // keyword and parameters, and have consumed the initial '{'. |
1000 // At return, unless an error occurred, the scanner is positioned before the | 1001 // At return, unless an error occurred, the scanner is positioned before the |
1001 // the final '}'. | 1002 // the final '}'. |
1002 PreParseResult PreParseLazyFunction( | 1003 PreParseResult PreParseLazyFunction( |
1003 LanguageMode language_mode, FunctionKind kind, bool has_simple_parameters, | 1004 LanguageMode language_mode, FunctionKind kind, bool has_simple_parameters, |
1004 ParserRecorder* log, Scanner::BookmarkScope* bookmark = nullptr); | 1005 ParserRecorder* log, Scanner::BookmarkScope* bookmark, int* use_counts); |
1005 | 1006 |
1006 private: | 1007 private: |
1007 friend class PreParserTraits; | 1008 friend class PreParserTraits; |
1008 | 1009 |
1009 static const int kLazyParseTrialLimit = 200; | 1010 static const int kLazyParseTrialLimit = 200; |
1010 | 1011 |
1011 // These types form an algebra over syntactic categories that is just | 1012 // These types form an algebra over syntactic categories that is just |
1012 // rich enough to let us recognize and propagate the constructs that | 1013 // rich enough to let us recognize and propagate the constructs that |
1013 // are either being counted in the preparser data, or is important | 1014 // are either being counted in the preparser data, or is important |
1014 // to throw the correct syntax error exceptions. | 1015 // to throw the correct syntax error exceptions. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 FunctionNameValidity function_name_validity, FunctionKind kind, | 1068 FunctionNameValidity function_name_validity, FunctionKind kind, |
1068 int function_token_pos, FunctionLiteral::FunctionType function_type, | 1069 int function_token_pos, FunctionLiteral::FunctionType function_type, |
1069 LanguageMode language_mode, bool* ok); | 1070 LanguageMode language_mode, bool* ok); |
1070 void ParseLazyFunctionLiteralBody(bool* ok, | 1071 void ParseLazyFunctionLiteralBody(bool* ok, |
1071 Scanner::BookmarkScope* bookmark = nullptr); | 1072 Scanner::BookmarkScope* bookmark = nullptr); |
1072 | 1073 |
1073 PreParserExpression ParseClassLiteral(PreParserIdentifier name, | 1074 PreParserExpression ParseClassLiteral(PreParserIdentifier name, |
1074 Scanner::Location class_name_location, | 1075 Scanner::Location class_name_location, |
1075 bool name_is_strict_reserved, int pos, | 1076 bool name_is_strict_reserved, int pos, |
1076 bool* ok); | 1077 bool* ok); |
| 1078 |
| 1079 int* use_counts_; |
1077 }; | 1080 }; |
1078 | 1081 |
1079 | 1082 |
1080 void PreParserTraits::MaterializeTemplateCallsiteLiterals() { | 1083 void PreParserTraits::MaterializeTemplateCallsiteLiterals() { |
1081 pre_parser_->function_state_->NextMaterializedLiteralIndex(); | 1084 pre_parser_->function_state_->NextMaterializedLiteralIndex(); |
1082 pre_parser_->function_state_->NextMaterializedLiteralIndex(); | 1085 pre_parser_->function_state_->NextMaterializedLiteralIndex(); |
1083 } | 1086 } |
1084 | 1087 |
1085 | 1088 |
1086 void PreParserTraits::MaterializeUnspreadArgumentsLiterals(int count) { | 1089 void PreParserTraits::MaterializeUnspreadArgumentsLiterals(int count) { |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1169 const PreParserFormalParameters& parameters, FunctionKind kind, | 1172 const PreParserFormalParameters& parameters, FunctionKind kind, |
1170 FunctionLiteral::FunctionType function_type, bool* ok) { | 1173 FunctionLiteral::FunctionType function_type, bool* ok) { |
1171 return pre_parser_->ParseEagerFunctionBody(function_name, pos, parameters, | 1174 return pre_parser_->ParseEagerFunctionBody(function_name, pos, parameters, |
1172 kind, function_type, ok); | 1175 kind, function_type, ok); |
1173 } | 1176 } |
1174 | 1177 |
1175 } // namespace internal | 1178 } // namespace internal |
1176 } // namespace v8 | 1179 } // namespace v8 |
1177 | 1180 |
1178 #endif // V8_PARSING_PREPARSER_H | 1181 #endif // V8_PARSING_PREPARSER_H |
OLD | NEW |