| 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/parsing/parser-base.h" | 9 #include "src/parsing/parser-base.h" | 
| 10 | 10 | 
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 105     kEvalIdentifier, | 105     kEvalIdentifier, | 
| 106     kArgumentsIdentifier, | 106     kArgumentsIdentifier, | 
| 107     kUndefinedIdentifier, | 107     kUndefinedIdentifier, | 
| 108     kPrototypeIdentifier, | 108     kPrototypeIdentifier, | 
| 109     kConstructorIdentifier, | 109     kConstructorIdentifier, | 
| 110     kEnumIdentifier, | 110     kEnumIdentifier, | 
| 111     kAwaitIdentifier, | 111     kAwaitIdentifier, | 
| 112     kAsyncIdentifier | 112     kAsyncIdentifier | 
| 113   }; | 113   }; | 
| 114 | 114 | 
| 115   explicit PreParserIdentifier(Type type) : type_(type) {} | 115   explicit PreParserIdentifier(Type type) : type_(type), string_(nullptr) {} | 
| 116   Type type_; | 116   Type type_; | 
| 117 | 117   // Only non-nullptr when PreParser.track_unresolved_variables_ is true. | 
|  | 118   const AstRawString* string_; | 
| 118   friend class PreParserExpression; | 119   friend class PreParserExpression; | 
|  | 120   friend class PreParser; | 
| 119 }; | 121 }; | 
| 120 | 122 | 
| 121 | 123 | 
| 122 class PreParserExpression { | 124 class PreParserExpression { | 
| 123  public: | 125  public: | 
| 124   PreParserExpression() : code_(TypeField::encode(kEmpty)) {} | 126   PreParserExpression() : code_(TypeField::encode(kEmpty)) {} | 
| 125 | 127 | 
| 126   static PreParserExpression Empty() { return PreParserExpression(); } | 128   static PreParserExpression Empty() { return PreParserExpression(); } | 
| 127 | 129 | 
| 128   static PreParserExpression Default() { | 130   static PreParserExpression Default() { | 
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 754   enum PreParseResult { | 756   enum PreParseResult { | 
| 755     kPreParseStackOverflow, | 757     kPreParseStackOverflow, | 
| 756     kPreParseAbort, | 758     kPreParseAbort, | 
| 757     kPreParseSuccess | 759     kPreParseSuccess | 
| 758   }; | 760   }; | 
| 759 | 761 | 
| 760   PreParser(Zone* zone, Scanner* scanner, AstValueFactory* ast_value_factory, | 762   PreParser(Zone* zone, Scanner* scanner, AstValueFactory* ast_value_factory, | 
| 761             ParserRecorder* log, uintptr_t stack_limit) | 763             ParserRecorder* log, uintptr_t stack_limit) | 
| 762       : ParserBase<PreParser>(zone, scanner, stack_limit, NULL, | 764       : ParserBase<PreParser>(zone, scanner, stack_limit, NULL, | 
| 763                               ast_value_factory, log), | 765                               ast_value_factory, log), | 
| 764         use_counts_(nullptr) {} | 766         use_counts_(nullptr), | 
|  | 767         track_unresolved_variables_(false) {} | 
| 765 | 768 | 
| 766   // Pre-parse the program from the character stream; returns true on | 769   // Pre-parse the program from the character stream; returns true on | 
| 767   // success (even if parsing failed, the pre-parse data successfully | 770   // success (even if parsing failed, the pre-parse data successfully | 
| 768   // captured the syntax error), and false if a stack-overflow happened | 771   // captured the syntax error), and false if a stack-overflow happened | 
| 769   // during parsing. | 772   // during parsing. | 
| 770   PreParseResult PreParseProgram(int* materialized_literals = 0, | 773   PreParseResult PreParseProgram(int* materialized_literals = 0, | 
| 771                                  bool is_module = false) { | 774                                  bool is_module = false) { | 
| 772     DCHECK_NULL(scope_state_); | 775     DCHECK_NULL(scope_state_); | 
| 773     DeclarationScope* scope = NewScriptScope(); | 776     DeclarationScope* scope = NewScriptScope(); | 
| 774 | 777 | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 800   } | 803   } | 
| 801 | 804 | 
| 802   // Parses a single function literal, from the opening parentheses before | 805   // Parses a single function literal, from the opening parentheses before | 
| 803   // parameters to the closing brace after the body. | 806   // parameters to the closing brace after the body. | 
| 804   // Returns a FunctionEntry describing the body of the function in enough | 807   // Returns a FunctionEntry describing the body of the function in enough | 
| 805   // detail that it can be lazily compiled. | 808   // detail that it can be lazily compiled. | 
| 806   // The scanner is expected to have matched the "function" or "function*" | 809   // The scanner is expected to have matched the "function" or "function*" | 
| 807   // keyword and parameters, and have consumed the initial '{'. | 810   // keyword and parameters, and have consumed the initial '{'. | 
| 808   // At return, unless an error occurred, the scanner is positioned before the | 811   // At return, unless an error occurred, the scanner is positioned before the | 
| 809   // the final '}'. | 812   // the final '}'. | 
| 810   PreParseResult PreParseLazyFunction(LanguageMode language_mode, | 813   PreParseResult PreParseLazyFunction(FunctionKind kind, | 
| 811                                       FunctionKind kind, | 814                                       DeclarationScope* function_scope, | 
| 812                                       bool has_simple_parameters, |  | 
| 813                                       bool parsing_module, ParserRecorder* log, | 815                                       bool parsing_module, ParserRecorder* log, | 
|  | 816                                       bool track_unresolved_variables, | 
| 814                                       bool may_abort, int* use_counts); | 817                                       bool may_abort, int* use_counts); | 
| 815 | 818 | 
| 816  private: | 819  private: | 
| 817   // These types form an algebra over syntactic categories that is just | 820   // These types form an algebra over syntactic categories that is just | 
| 818   // rich enough to let us recognize and propagate the constructs that | 821   // rich enough to let us recognize and propagate the constructs that | 
| 819   // are either being counted in the preparser data, or is important | 822   // are either being counted in the preparser data, or is important | 
| 820   // to throw the correct syntax error exceptions. | 823   // to throw the correct syntax error exceptions. | 
| 821 | 824 | 
| 822   // All ParseXXX functions take as the last argument an *ok parameter | 825   // All ParseXXX functions take as the last argument an *ok parameter | 
| 823   // which is set to false if parsing failed; it is unchanged otherwise. | 826   // which is set to false if parsing failed; it is unchanged otherwise. | 
| 824   // By making the 'exception handling' explicit, we are forced to check | 827   // By making the 'exception handling' explicit, we are forced to check | 
| 825   // for failure at the call sites. | 828   // for failure at the call sites. | 
| 826   Statement ParseFunctionDeclaration(bool* ok); | 829   Statement ParseFunctionDeclaration(bool* ok); | 
| 827   Statement ParseAsyncFunctionDeclaration(ZoneList<const AstRawString*>* names, | 830   Statement ParseAsyncFunctionDeclaration(ZoneList<const AstRawString*>* names, | 
| 828                                           bool default_export, bool* ok); | 831                                           bool default_export, bool* ok); | 
| 829   Expression ParseAsyncFunctionExpression(bool* ok); | 832   Expression ParseAsyncFunctionExpression(bool* ok); | 
| 830   Statement ParseClassDeclaration(ZoneList<const AstRawString*>* names, | 833   Statement ParseClassDeclaration(ZoneList<const AstRawString*>* names, | 
| 831                                   bool default_export, bool* ok); | 834                                   bool default_export, bool* ok); | 
| 832   Statement ParseForStatement(ZoneList<const AstRawString*>* labels, bool* ok); | 835   Statement ParseForStatement(ZoneList<const AstRawString*>* labels, bool* ok); | 
| 833   Statement ParseTryStatement(bool* ok); | 836   Statement ParseTryStatement(bool* ok); | 
| 834   Expression ParseConditionalExpression(bool accept_IN, bool* ok); | 837   Expression ParseConditionalExpression(bool accept_IN, bool* ok); | 
| 835   Expression ParseObjectLiteral(bool* ok); | 838   Expression ParseObjectLiteral(bool* ok); | 
| 836 | 839 | 
| 837   V8_INLINE PreParserStatementList ParseEagerFunctionBody( | 840   V8_INLINE PreParserStatementList ParseEagerFunctionBody( | 
| 838       PreParserIdentifier function_name, int pos, | 841       PreParserIdentifier function_name, int pos, | 
| 839       const PreParserFormalParameters& parameters, FunctionKind kind, | 842       const PreParserFormalParameters& parameters, FunctionKind kind, | 
| 840       FunctionLiteral::FunctionType function_type, bool* ok); | 843       FunctionLiteral::FunctionType function_type, bool* ok); | 
| 841 | 844 | 
| 842   V8_INLINE LazyParsingResult | 845   V8_INLINE LazyParsingResult SkipLazyFunctionBody( | 
| 843   SkipLazyFunctionBody(int* materialized_literal_count, | 846       int* materialized_literal_count, int* expected_property_count, | 
| 844                        int* expected_property_count, bool may_abort, bool* ok) { | 847       bool track_unresolved_variables, bool may_abort, bool* ok) { | 
| 845     UNREACHABLE(); | 848     UNREACHABLE(); | 
| 846     return kLazyParsingComplete; | 849     return kLazyParsingComplete; | 
| 847   } | 850   } | 
| 848   Expression ParseFunctionLiteral( | 851   Expression ParseFunctionLiteral( | 
| 849       Identifier name, Scanner::Location function_name_location, | 852       Identifier name, Scanner::Location function_name_location, | 
| 850       FunctionNameValidity function_name_validity, FunctionKind kind, | 853       FunctionNameValidity function_name_validity, FunctionKind kind, | 
| 851       int function_token_pos, FunctionLiteral::FunctionType function_type, | 854       int function_token_pos, FunctionLiteral::FunctionType function_type, | 
| 852       LanguageMode language_mode, bool* ok); | 855       LanguageMode language_mode, bool* ok); | 
| 853   LazyParsingResult ParseLazyFunctionLiteralBody(bool may_abort, bool* ok); | 856   LazyParsingResult ParseLazyFunctionLiteralBody(bool may_abort, bool* ok); | 
| 854 | 857 | 
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1247 | 1250 | 
| 1248   V8_INLINE PreParserExpression FunctionSentExpression(int pos) { | 1251   V8_INLINE PreParserExpression FunctionSentExpression(int pos) { | 
| 1249     return PreParserExpression::Default(); | 1252     return PreParserExpression::Default(); | 
| 1250   } | 1253   } | 
| 1251 | 1254 | 
| 1252   V8_INLINE PreParserExpression ExpressionFromLiteral(Token::Value token, | 1255   V8_INLINE PreParserExpression ExpressionFromLiteral(Token::Value token, | 
| 1253                                                       int pos) { | 1256                                                       int pos) { | 
| 1254     return PreParserExpression::Default(); | 1257     return PreParserExpression::Default(); | 
| 1255   } | 1258   } | 
| 1256 | 1259 | 
| 1257   V8_INLINE PreParserExpression ExpressionFromIdentifier( | 1260   PreParserExpression ExpressionFromIdentifier( | 
| 1258       PreParserIdentifier name, int start_position, int end_position, | 1261       PreParserIdentifier name, int start_position, int end_position, | 
| 1259       InferName infer = InferName::kYes) { | 1262       InferName infer = InferName::kYes); | 
| 1260     return PreParserExpression::FromIdentifier(name); |  | 
| 1261   } |  | 
| 1262 | 1263 | 
| 1263   V8_INLINE PreParserExpression ExpressionFromString(int pos) { | 1264   V8_INLINE PreParserExpression ExpressionFromString(int pos) { | 
| 1264     if (scanner()->UnescapedLiteralMatches("use strict", 10)) { | 1265     if (scanner()->UnescapedLiteralMatches("use strict", 10)) { | 
| 1265       return PreParserExpression::UseStrictStringLiteral(); | 1266       return PreParserExpression::UseStrictStringLiteral(); | 
| 1266     } | 1267     } | 
| 1267     return PreParserExpression::StringLiteral(); | 1268     return PreParserExpression::StringLiteral(); | 
| 1268   } | 1269   } | 
| 1269 | 1270 | 
| 1270   V8_INLINE PreParserExpressionList NewExpressionList(int size) const { | 1271   V8_INLINE PreParserExpressionList NewExpressionList(int size) const { | 
| 1271     return PreParserExpressionList(); | 1272     return PreParserExpressionList(); | 
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1366     return function_state_->non_patterns_to_rewrite(); | 1367     return function_state_->non_patterns_to_rewrite(); | 
| 1367   } | 1368   } | 
| 1368 | 1369 | 
| 1369   V8_INLINE void CountUsage(v8::Isolate::UseCounterFeature feature) { | 1370   V8_INLINE void CountUsage(v8::Isolate::UseCounterFeature feature) { | 
| 1370     if (use_counts_ != nullptr) ++use_counts_[feature]; | 1371     if (use_counts_ != nullptr) ++use_counts_[feature]; | 
| 1371   } | 1372   } | 
| 1372 | 1373 | 
| 1373   // Preparser's private field members. | 1374   // Preparser's private field members. | 
| 1374 | 1375 | 
| 1375   int* use_counts_; | 1376   int* use_counts_; | 
|  | 1377   bool track_unresolved_variables_; | 
| 1376 }; | 1378 }; | 
| 1377 | 1379 | 
| 1378 PreParserExpression PreParser::SpreadCall(PreParserExpression function, | 1380 PreParserExpression PreParser::SpreadCall(PreParserExpression function, | 
| 1379                                           PreParserExpressionList args, | 1381                                           PreParserExpressionList args, | 
| 1380                                           int pos) { | 1382                                           int pos) { | 
| 1381   return factory()->NewCall(function, args, pos); | 1383   return factory()->NewCall(function, args, pos); | 
| 1382 } | 1384 } | 
| 1383 | 1385 | 
| 1384 PreParserExpression PreParser::SpreadCallNew(PreParserExpression function, | 1386 PreParserExpression PreParser::SpreadCallNew(PreParserExpression function, | 
| 1385                                              PreParserExpressionList args, | 1387                                              PreParserExpressionList args, | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
| 1416     function_state_->NextMaterializedLiteralIndex(); | 1418     function_state_->NextMaterializedLiteralIndex(); | 
| 1417     function_state_->NextMaterializedLiteralIndex(); | 1419     function_state_->NextMaterializedLiteralIndex(); | 
| 1418   } | 1420   } | 
| 1419   return EmptyExpression(); | 1421   return EmptyExpression(); | 
| 1420 } | 1422 } | 
| 1421 | 1423 | 
| 1422 }  // namespace internal | 1424 }  // namespace internal | 
| 1423 }  // namespace v8 | 1425 }  // namespace v8 | 
| 1424 | 1426 | 
| 1425 #endif  // V8_PARSING_PREPARSER_H | 1427 #endif  // V8_PARSING_PREPARSER_H | 
| OLD | NEW | 
|---|