Chromium Code Reviews| 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/bailout-reason.h" | 8 #include "src/bailout-reason.h" |
| 9 #include "src/expression-classifier.h" | 9 #include "src/expression-classifier.h" |
| 10 #include "src/func-name-inferrer.h" | 10 #include "src/func-name-inferrer.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 class ParserBase : public Traits { | 81 class ParserBase : public Traits { |
| 82 public: | 82 public: |
| 83 // Shorten type names defined by Traits. | 83 // Shorten type names defined by Traits. |
| 84 typedef typename Traits::Type::Expression ExpressionT; | 84 typedef typename Traits::Type::Expression ExpressionT; |
| 85 typedef typename Traits::Type::Identifier IdentifierT; | 85 typedef typename Traits::Type::Identifier IdentifierT; |
| 86 typedef typename Traits::Type::FormalParameter FormalParameterT; | 86 typedef typename Traits::Type::FormalParameter FormalParameterT; |
| 87 typedef typename Traits::Type::FormalParameters FormalParametersT; | 87 typedef typename Traits::Type::FormalParameters FormalParametersT; |
| 88 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; | 88 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; |
| 89 typedef typename Traits::Type::Literal LiteralT; | 89 typedef typename Traits::Type::Literal LiteralT; |
| 90 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; | 90 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; |
| 91 typedef typename Traits::Type::StatementList StatementListT; | |
| 91 | 92 |
| 92 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, | 93 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, |
| 93 v8::Extension* extension, AstValueFactory* ast_value_factory, | 94 v8::Extension* extension, AstValueFactory* ast_value_factory, |
| 94 ParserRecorder* log, typename Traits::Type::Parser this_object) | 95 ParserRecorder* log, typename Traits::Type::Parser this_object) |
| 95 : Traits(this_object), | 96 : Traits(this_object), |
| 96 parenthesized_function_(false), | 97 parenthesized_function_(false), |
| 97 scope_(NULL), | 98 scope_(NULL), |
| 98 function_state_(NULL), | 99 function_state_(NULL), |
| 99 extension_(extension), | 100 extension_(extension), |
| 100 fni_(NULL), | 101 fni_(NULL), |
| 101 ast_value_factory_(ast_value_factory), | 102 ast_value_factory_(ast_value_factory), |
| 102 log_(log), | 103 log_(log), |
| 103 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. | 104 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. |
| 104 stack_limit_(stack_limit), | 105 stack_limit_(stack_limit), |
| 105 zone_(zone), | 106 zone_(zone), |
| 106 scanner_(scanner), | 107 scanner_(scanner), |
| 107 stack_overflow_(false), | 108 stack_overflow_(false), |
| 108 allow_lazy_(false), | 109 allow_lazy_(false), |
| 109 allow_natives_(false), | 110 allow_natives_(false), |
| 110 allow_harmony_sloppy_(false), | 111 allow_harmony_sloppy_(false), |
| 111 allow_harmony_sloppy_function_(false), | 112 allow_harmony_sloppy_function_(false), |
| 112 allow_harmony_sloppy_let_(false), | 113 allow_harmony_sloppy_let_(false), |
| 113 allow_harmony_rest_parameters_(false), | 114 allow_harmony_rest_parameters_(false), |
| 114 allow_harmony_default_parameters_(false), | 115 allow_harmony_default_parameters_(false), |
| 115 allow_harmony_spread_calls_(false), | 116 allow_harmony_spread_calls_(false), |
| 116 allow_harmony_destructuring_(false), | 117 allow_harmony_destructuring_(false), |
| 117 allow_harmony_spread_arrays_(false), | 118 allow_harmony_spread_arrays_(false), |
| 118 allow_harmony_new_target_(false), | 119 allow_harmony_new_target_(false), |
| 119 allow_strong_mode_(false), | 120 allow_strong_mode_(false), |
| 120 allow_legacy_const_(true) {} | 121 allow_legacy_const_(true), |
| 122 allow_harmony_do_expressions_(false) {} | |
| 121 | 123 |
| 122 #define ALLOW_ACCESSORS(name) \ | 124 #define ALLOW_ACCESSORS(name) \ |
| 123 bool allow_##name() const { return allow_##name##_; } \ | 125 bool allow_##name() const { return allow_##name##_; } \ |
| 124 void set_allow_##name(bool allow) { allow_##name##_ = allow; } | 126 void set_allow_##name(bool allow) { allow_##name##_ = allow; } |
| 125 | 127 |
| 126 ALLOW_ACCESSORS(lazy); | 128 ALLOW_ACCESSORS(lazy); |
| 127 ALLOW_ACCESSORS(natives); | 129 ALLOW_ACCESSORS(natives); |
| 128 ALLOW_ACCESSORS(harmony_sloppy); | 130 ALLOW_ACCESSORS(harmony_sloppy); |
| 129 ALLOW_ACCESSORS(harmony_sloppy_function); | 131 ALLOW_ACCESSORS(harmony_sloppy_function); |
| 130 ALLOW_ACCESSORS(harmony_sloppy_let); | 132 ALLOW_ACCESSORS(harmony_sloppy_let); |
| 131 ALLOW_ACCESSORS(harmony_rest_parameters); | 133 ALLOW_ACCESSORS(harmony_rest_parameters); |
| 132 ALLOW_ACCESSORS(harmony_default_parameters); | 134 ALLOW_ACCESSORS(harmony_default_parameters); |
| 133 ALLOW_ACCESSORS(harmony_spread_calls); | 135 ALLOW_ACCESSORS(harmony_spread_calls); |
| 134 ALLOW_ACCESSORS(harmony_destructuring); | 136 ALLOW_ACCESSORS(harmony_destructuring); |
| 135 ALLOW_ACCESSORS(harmony_spread_arrays); | 137 ALLOW_ACCESSORS(harmony_spread_arrays); |
| 136 ALLOW_ACCESSORS(harmony_new_target); | 138 ALLOW_ACCESSORS(harmony_new_target); |
| 137 ALLOW_ACCESSORS(strong_mode); | 139 ALLOW_ACCESSORS(strong_mode); |
| 138 ALLOW_ACCESSORS(legacy_const); | 140 ALLOW_ACCESSORS(legacy_const); |
| 141 ALLOW_ACCESSORS(harmony_do_expressions); | |
| 139 #undef ALLOW_ACCESSORS | 142 #undef ALLOW_ACCESSORS |
| 140 | 143 |
| 144 INLINE(bool CheckStackOverflow()) { | |
|
adamk
2015/10/15 10:59:33
I don't think you need this anymore.
| |
| 145 if (stack_overflow_) return true; | |
| 146 if (GetCurrentStackPosition() >= stack_limit_) return false; | |
| 147 stack_overflow_ = true; | |
| 148 return true; | |
| 149 } | |
| 150 | |
| 151 uintptr_t stack_limit() const { return stack_limit_; } | |
| 152 | |
| 141 protected: | 153 protected: |
| 142 enum AllowRestrictedIdentifiers { | 154 enum AllowRestrictedIdentifiers { |
| 143 kAllowRestrictedIdentifiers, | 155 kAllowRestrictedIdentifiers, |
| 144 kDontAllowRestrictedIdentifiers | 156 kDontAllowRestrictedIdentifiers |
| 145 }; | 157 }; |
| 146 | 158 |
| 147 enum Mode { | 159 enum Mode { |
| 148 PARSE_LAZILY, | 160 PARSE_LAZILY, |
| 149 PARSE_EAGERLY | 161 PARSE_EAGERLY |
| 150 }; | 162 }; |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 834 bool allow_harmony_sloppy_function_; | 846 bool allow_harmony_sloppy_function_; |
| 835 bool allow_harmony_sloppy_let_; | 847 bool allow_harmony_sloppy_let_; |
| 836 bool allow_harmony_rest_parameters_; | 848 bool allow_harmony_rest_parameters_; |
| 837 bool allow_harmony_default_parameters_; | 849 bool allow_harmony_default_parameters_; |
| 838 bool allow_harmony_spread_calls_; | 850 bool allow_harmony_spread_calls_; |
| 839 bool allow_harmony_destructuring_; | 851 bool allow_harmony_destructuring_; |
| 840 bool allow_harmony_spread_arrays_; | 852 bool allow_harmony_spread_arrays_; |
| 841 bool allow_harmony_new_target_; | 853 bool allow_harmony_new_target_; |
| 842 bool allow_strong_mode_; | 854 bool allow_strong_mode_; |
| 843 bool allow_legacy_const_; | 855 bool allow_legacy_const_; |
| 856 bool allow_harmony_do_expressions_; | |
| 844 }; | 857 }; |
| 845 | 858 |
| 846 | 859 |
| 847 class PreParserIdentifier { | 860 class PreParserIdentifier { |
| 848 public: | 861 public: |
| 849 PreParserIdentifier() : type_(kUnknownIdentifier) {} | 862 PreParserIdentifier() : type_(kUnknownIdentifier) {} |
| 850 static PreParserIdentifier Default() { | 863 static PreParserIdentifier Default() { |
| 851 return PreParserIdentifier(kUnknownIdentifier); | 864 return PreParserIdentifier(kUnknownIdentifier); |
| 852 } | 865 } |
| 853 static PreParserIdentifier Eval() { | 866 static PreParserIdentifier Eval() { |
| (...skipping 836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1690 ExpressionClassifier* classifier) { | 1703 ExpressionClassifier* classifier) { |
| 1691 if (!classifier->is_simple_parameter_list()) { | 1704 if (!classifier->is_simple_parameter_list()) { |
| 1692 scope->SetHasNonSimpleParameters(); | 1705 scope->SetHasNonSimpleParameters(); |
| 1693 } | 1706 } |
| 1694 } | 1707 } |
| 1695 | 1708 |
| 1696 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} | 1709 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} |
| 1697 | 1710 |
| 1698 // Temporary glue; these functions will move to ParserBase. | 1711 // Temporary glue; these functions will move to ParserBase. |
| 1699 PreParserExpression ParseV8Intrinsic(bool* ok); | 1712 PreParserExpression ParseV8Intrinsic(bool* ok); |
| 1713 V8_INLINE PreParserExpression ParseDoExpression(bool* ok); | |
| 1700 PreParserExpression ParseFunctionLiteral( | 1714 PreParserExpression ParseFunctionLiteral( |
| 1701 PreParserIdentifier name, Scanner::Location function_name_location, | 1715 PreParserIdentifier name, Scanner::Location function_name_location, |
| 1702 FunctionNameValidity function_name_validity, FunctionKind kind, | 1716 FunctionNameValidity function_name_validity, FunctionKind kind, |
| 1703 int function_token_position, FunctionLiteral::FunctionType type, | 1717 int function_token_position, FunctionLiteral::FunctionType type, |
| 1704 FunctionLiteral::ArityRestriction arity_restriction, | 1718 FunctionLiteral::ArityRestriction arity_restriction, |
| 1705 LanguageMode language_mode, bool* ok); | 1719 LanguageMode language_mode, bool* ok); |
| 1706 | 1720 |
| 1707 PreParserExpression ParseClassLiteral(PreParserIdentifier name, | 1721 PreParserExpression ParseClassLiteral(PreParserIdentifier name, |
| 1708 Scanner::Location class_name_location, | 1722 Scanner::Location class_name_location, |
| 1709 bool name_is_strict_reserved, int pos, | 1723 bool name_is_strict_reserved, int pos, |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1830 Statement ParseSwitchStatement(bool* ok); | 1844 Statement ParseSwitchStatement(bool* ok); |
| 1831 Statement ParseDoWhileStatement(bool* ok); | 1845 Statement ParseDoWhileStatement(bool* ok); |
| 1832 Statement ParseWhileStatement(bool* ok); | 1846 Statement ParseWhileStatement(bool* ok); |
| 1833 Statement ParseForStatement(bool* ok); | 1847 Statement ParseForStatement(bool* ok); |
| 1834 Statement ParseThrowStatement(bool* ok); | 1848 Statement ParseThrowStatement(bool* ok); |
| 1835 Statement ParseTryStatement(bool* ok); | 1849 Statement ParseTryStatement(bool* ok); |
| 1836 Statement ParseDebuggerStatement(bool* ok); | 1850 Statement ParseDebuggerStatement(bool* ok); |
| 1837 Expression ParseConditionalExpression(bool accept_IN, bool* ok); | 1851 Expression ParseConditionalExpression(bool accept_IN, bool* ok); |
| 1838 Expression ParseObjectLiteral(bool* ok); | 1852 Expression ParseObjectLiteral(bool* ok); |
| 1839 Expression ParseV8Intrinsic(bool* ok); | 1853 Expression ParseV8Intrinsic(bool* ok); |
| 1854 Expression ParseDoExpression(bool* ok); | |
| 1840 | 1855 |
| 1841 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, | 1856 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, |
| 1842 int* expected_property_count, bool* ok); | 1857 int* expected_property_count, bool* ok); |
| 1843 V8_INLINE PreParserStatementList ParseEagerFunctionBody( | 1858 V8_INLINE PreParserStatementList ParseEagerFunctionBody( |
| 1844 PreParserIdentifier function_name, int pos, | 1859 PreParserIdentifier function_name, int pos, |
| 1845 const PreParserFormalParameters& parameters, FunctionKind kind, | 1860 const PreParserFormalParameters& parameters, FunctionKind kind, |
| 1846 FunctionLiteral::FunctionType function_type, bool* ok); | 1861 FunctionLiteral::FunctionType function_type, bool* ok); |
| 1847 | 1862 |
| 1848 Expression ParseFunctionLiteral( | 1863 Expression ParseFunctionLiteral( |
| 1849 Identifier name, Scanner::Location function_name_location, | 1864 Identifier name, Scanner::Location function_name_location, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1895 // lists that are too long. | 1910 // lists that are too long. |
| 1896 | 1911 |
| 1897 // Accomodate array literal for rest parameter. | 1912 // Accomodate array literal for rest parameter. |
| 1898 if (params.IsArrowFunctionFormalParametersWithRestParameter()) { | 1913 if (params.IsArrowFunctionFormalParametersWithRestParameter()) { |
| 1899 ++parameters->materialized_literals_count; | 1914 ++parameters->materialized_literals_count; |
| 1900 pre_parser_->function_state_->NextMaterializedLiteralIndex(); | 1915 pre_parser_->function_state_->NextMaterializedLiteralIndex(); |
| 1901 } | 1916 } |
| 1902 } | 1917 } |
| 1903 | 1918 |
| 1904 | 1919 |
| 1920 PreParserExpression PreParserTraits::ParseDoExpression(bool* ok) { | |
| 1921 return pre_parser_->ParseDoExpression(ok); | |
| 1922 } | |
| 1923 | |
| 1924 | |
| 1905 PreParserStatementList PreParser::ParseEagerFunctionBody( | 1925 PreParserStatementList PreParser::ParseEagerFunctionBody( |
| 1906 PreParserIdentifier function_name, int pos, | 1926 PreParserIdentifier function_name, int pos, |
| 1907 const PreParserFormalParameters& parameters, FunctionKind kind, | 1927 const PreParserFormalParameters& parameters, FunctionKind kind, |
| 1908 FunctionLiteral::FunctionType function_type, bool* ok) { | 1928 FunctionLiteral::FunctionType function_type, bool* ok) { |
| 1909 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 1929 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
| 1910 | 1930 |
| 1911 ParseStatementList(Token::RBRACE, ok); | 1931 ParseStatementList(Token::RBRACE, ok); |
| 1912 if (!*ok) return PreParserStatementList(); | 1932 if (!*ok) return PreParserStatementList(); |
| 1913 | 1933 |
| 1914 Expect(Token::RBRACE, ok); | 1934 Expect(Token::RBRACE, ok); |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2215 // 'false' | 2235 // 'false' |
| 2216 // Identifier | 2236 // Identifier |
| 2217 // Number | 2237 // Number |
| 2218 // String | 2238 // String |
| 2219 // ArrayLiteral | 2239 // ArrayLiteral |
| 2220 // ObjectLiteral | 2240 // ObjectLiteral |
| 2221 // RegExpLiteral | 2241 // RegExpLiteral |
| 2222 // ClassLiteral | 2242 // ClassLiteral |
| 2223 // '(' Expression ')' | 2243 // '(' Expression ')' |
| 2224 // TemplateLiteral | 2244 // TemplateLiteral |
| 2245 // do Block | |
| 2225 | 2246 |
| 2226 int beg_pos = scanner()->peek_location().beg_pos; | 2247 int beg_pos = scanner()->peek_location().beg_pos; |
| 2227 int end_pos = scanner()->peek_location().end_pos; | 2248 int end_pos = scanner()->peek_location().end_pos; |
| 2228 ExpressionT result = this->EmptyExpression(); | 2249 ExpressionT result = this->EmptyExpression(); |
| 2229 Token::Value token = peek(); | 2250 Token::Value token = peek(); |
| 2230 switch (token) { | 2251 switch (token) { |
| 2231 case Token::THIS: { | 2252 case Token::THIS: { |
| 2232 BindingPatternUnexpectedToken(classifier); | 2253 BindingPatternUnexpectedToken(classifier); |
| 2233 Consume(Token::THIS); | 2254 Consume(Token::THIS); |
| 2234 if (FLAG_strong_this && is_strong(language_mode())) { | 2255 if (FLAG_strong_this && is_strong(language_mode())) { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2395 MessageTemplate::kUnexpectedTemplateString); | 2416 MessageTemplate::kUnexpectedTemplateString); |
| 2396 result = this->ParseTemplateLiteral(Traits::NoTemplateTag(), beg_pos, | 2417 result = this->ParseTemplateLiteral(Traits::NoTemplateTag(), beg_pos, |
| 2397 classifier, CHECK_OK); | 2418 classifier, CHECK_OK); |
| 2398 break; | 2419 break; |
| 2399 | 2420 |
| 2400 case Token::MOD: | 2421 case Token::MOD: |
| 2401 if (allow_natives() || extension_ != NULL) { | 2422 if (allow_natives() || extension_ != NULL) { |
| 2402 result = this->ParseV8Intrinsic(CHECK_OK); | 2423 result = this->ParseV8Intrinsic(CHECK_OK); |
| 2403 break; | 2424 break; |
| 2404 } | 2425 } |
| 2426 | |
| 2427 case Token::DO: | |
| 2428 if (token == Token::DO && allow_harmony_do_expressions()) { | |
|
adamk
2015/10/15 10:59:33
Didn't we just switch on |token|?
caitp (gmail)
2015/10/15 11:24:17
It can fall through from the above, unfortunately
adamk
2015/10/15 12:01:25
What if you restructured the cases to have returns
caitp (gmail)
2015/10/15 12:34:07
I think doing that will add a lot of unrelated noi
adamk
2015/10/15 12:42:27
If you want to wait on it, please add a TODO.
| |
| 2429 BindingPatternUnexpectedToken(classifier); | |
| 2430 result = Traits::ParseDoExpression(CHECK_OK); | |
| 2431 break; | |
| 2432 } | |
| 2405 // If we're not allowing special syntax we fall-through to the | 2433 // If we're not allowing special syntax we fall-through to the |
| 2406 // default case. | 2434 // default case. |
| 2407 | 2435 |
| 2408 default: { | 2436 default: { |
| 2409 Next(); | 2437 Next(); |
| 2410 ReportUnexpectedToken(token); | 2438 ReportUnexpectedToken(token); |
| 2411 *ok = false; | 2439 *ok = false; |
| 2412 } | 2440 } |
| 2413 } | 2441 } |
| 2414 | 2442 |
| (...skipping 1771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4186 return; | 4214 return; |
| 4187 } | 4215 } |
| 4188 has_seen_constructor_ = true; | 4216 has_seen_constructor_ = true; |
| 4189 return; | 4217 return; |
| 4190 } | 4218 } |
| 4191 } | 4219 } |
| 4192 } // namespace internal | 4220 } // namespace internal |
| 4193 } // namespace v8 | 4221 } // namespace v8 |
| 4194 | 4222 |
| 4195 #endif // V8_PREPARSER_H | 4223 #endif // V8_PREPARSER_H |
| OLD | NEW |