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/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 parsing_module_(false), | 204 parsing_module_(false), |
205 stack_limit_(stack_limit), | 205 stack_limit_(stack_limit), |
206 zone_(zone), | 206 zone_(zone), |
207 classifier_(nullptr), | 207 classifier_(nullptr), |
208 scanner_(scanner), | 208 scanner_(scanner), |
209 stack_overflow_(false), | 209 stack_overflow_(false), |
210 default_eager_compile_hint_(FunctionLiteral::kShouldLazyCompile), | 210 default_eager_compile_hint_(FunctionLiteral::kShouldLazyCompile), |
211 allow_lazy_(false), | 211 allow_lazy_(false), |
212 allow_natives_(false), | 212 allow_natives_(false), |
213 allow_tailcalls_(false), | 213 allow_tailcalls_(false), |
214 allow_harmony_restrictive_declarations_(false), | |
215 allow_harmony_do_expressions_(false), | 214 allow_harmony_do_expressions_(false), |
216 allow_harmony_function_sent_(false), | 215 allow_harmony_function_sent_(false), |
217 allow_harmony_async_await_(false), | 216 allow_harmony_async_await_(false), |
218 allow_harmony_restrictive_generators_(false), | 217 allow_harmony_restrictive_generators_(false), |
219 allow_harmony_trailing_commas_(false), | 218 allow_harmony_trailing_commas_(false), |
220 allow_harmony_class_fields_(false) {} | 219 allow_harmony_class_fields_(false) {} |
221 | 220 |
222 #define ALLOW_ACCESSORS(name) \ | 221 #define ALLOW_ACCESSORS(name) \ |
223 bool allow_##name() const { return allow_##name##_; } \ | 222 bool allow_##name() const { return allow_##name##_; } \ |
224 void set_allow_##name(bool allow) { allow_##name##_ = allow; } | 223 void set_allow_##name(bool allow) { allow_##name##_ = allow; } |
225 | 224 |
226 ALLOW_ACCESSORS(lazy); | 225 ALLOW_ACCESSORS(lazy); |
227 ALLOW_ACCESSORS(natives); | 226 ALLOW_ACCESSORS(natives); |
228 ALLOW_ACCESSORS(tailcalls); | 227 ALLOW_ACCESSORS(tailcalls); |
229 ALLOW_ACCESSORS(harmony_restrictive_declarations); | |
230 ALLOW_ACCESSORS(harmony_do_expressions); | 228 ALLOW_ACCESSORS(harmony_do_expressions); |
231 ALLOW_ACCESSORS(harmony_function_sent); | 229 ALLOW_ACCESSORS(harmony_function_sent); |
232 ALLOW_ACCESSORS(harmony_async_await); | 230 ALLOW_ACCESSORS(harmony_async_await); |
233 ALLOW_ACCESSORS(harmony_restrictive_generators); | 231 ALLOW_ACCESSORS(harmony_restrictive_generators); |
234 ALLOW_ACCESSORS(harmony_trailing_commas); | 232 ALLOW_ACCESSORS(harmony_trailing_commas); |
235 ALLOW_ACCESSORS(harmony_class_fields); | 233 ALLOW_ACCESSORS(harmony_class_fields); |
236 | 234 |
237 #undef ALLOW_ACCESSORS | 235 #undef ALLOW_ACCESSORS |
238 | 236 |
239 uintptr_t stack_limit() const { return stack_limit_; } | 237 uintptr_t stack_limit() const { return stack_limit_; } |
(...skipping 1216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1456 ExpressionClassifier* classifier_; | 1454 ExpressionClassifier* classifier_; |
1457 | 1455 |
1458 Scanner* scanner_; | 1456 Scanner* scanner_; |
1459 bool stack_overflow_; | 1457 bool stack_overflow_; |
1460 | 1458 |
1461 FunctionLiteral::EagerCompileHint default_eager_compile_hint_; | 1459 FunctionLiteral::EagerCompileHint default_eager_compile_hint_; |
1462 | 1460 |
1463 bool allow_lazy_; | 1461 bool allow_lazy_; |
1464 bool allow_natives_; | 1462 bool allow_natives_; |
1465 bool allow_tailcalls_; | 1463 bool allow_tailcalls_; |
1466 bool allow_harmony_restrictive_declarations_; | |
1467 bool allow_harmony_do_expressions_; | 1464 bool allow_harmony_do_expressions_; |
1468 bool allow_harmony_function_sent_; | 1465 bool allow_harmony_function_sent_; |
1469 bool allow_harmony_async_await_; | 1466 bool allow_harmony_async_await_; |
1470 bool allow_harmony_restrictive_generators_; | 1467 bool allow_harmony_restrictive_generators_; |
1471 bool allow_harmony_trailing_commas_; | 1468 bool allow_harmony_trailing_commas_; |
1472 bool allow_harmony_class_fields_; | 1469 bool allow_harmony_class_fields_; |
1473 | 1470 |
1474 friend class DiscardableZoneScope; | 1471 friend class DiscardableZoneScope; |
1475 }; | 1472 }; |
1476 | 1473 |
(...skipping 2199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3676 return init_block; | 3673 return init_block; |
3677 } | 3674 } |
3678 | 3675 |
3679 template <typename Impl> | 3676 template <typename Impl> |
3680 typename ParserBase<Impl>::StatementT | 3677 typename ParserBase<Impl>::StatementT |
3681 ParserBase<Impl>::ParseFunctionDeclaration(bool* ok) { | 3678 ParserBase<Impl>::ParseFunctionDeclaration(bool* ok) { |
3682 Consume(Token::FUNCTION); | 3679 Consume(Token::FUNCTION); |
3683 int pos = position(); | 3680 int pos = position(); |
3684 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; | 3681 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; |
3685 if (Check(Token::MUL)) { | 3682 if (Check(Token::MUL)) { |
3686 flags |= ParseFunctionFlags::kIsGenerator; | 3683 impl()->ReportMessageAt(scanner()->location(), |
3687 if (allow_harmony_restrictive_declarations()) { | 3684 MessageTemplate::kGeneratorInLegacyContext); |
3688 impl()->ReportMessageAt(scanner()->location(), | 3685 *ok = false; |
3689 MessageTemplate::kGeneratorInLegacyContext); | 3686 return impl()->NullStatement(); |
3690 *ok = false; | |
3691 return impl()->NullStatement(); | |
3692 } | |
3693 } | 3687 } |
3694 return ParseHoistableDeclaration(pos, flags, nullptr, false, ok); | 3688 return ParseHoistableDeclaration(pos, flags, nullptr, false, ok); |
3695 } | 3689 } |
3696 | 3690 |
3697 template <typename Impl> | 3691 template <typename Impl> |
3698 typename ParserBase<Impl>::StatementT | 3692 typename ParserBase<Impl>::StatementT |
3699 ParserBase<Impl>::ParseHoistableDeclaration( | 3693 ParserBase<Impl>::ParseHoistableDeclaration( |
3700 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | 3694 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { |
3701 Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement)); | 3695 Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement)); |
3702 int pos = position(); | 3696 int pos = position(); |
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4627 Expect(Token::RBRACE, CHECK_OK_CUSTOM(NullBlock)); | 4621 Expect(Token::RBRACE, CHECK_OK_CUSTOM(NullBlock)); |
4628 block_state.set_end_position(scanner()->location().end_pos); | 4622 block_state.set_end_position(scanner()->location().end_pos); |
4629 body->set_scope(block_state.FinalizedBlockScope()); | 4623 body->set_scope(block_state.FinalizedBlockScope()); |
4630 } | 4624 } |
4631 return body; | 4625 return body; |
4632 } | 4626 } |
4633 | 4627 |
4634 template <typename Impl> | 4628 template <typename Impl> |
4635 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseScopedStatement( | 4629 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseScopedStatement( |
4636 ZoneList<const AstRawString*>* labels, bool legacy, bool* ok) { | 4630 ZoneList<const AstRawString*>* labels, bool legacy, bool* ok) { |
4637 if (is_strict(language_mode()) || peek() != Token::FUNCTION || | 4631 if (is_strict(language_mode()) || peek() != Token::FUNCTION || legacy) { |
4638 (legacy && allow_harmony_restrictive_declarations())) { | |
4639 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); | 4632 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); |
4640 } else { | 4633 } else { |
4641 if (legacy) { | 4634 if (legacy) { |
4642 impl()->CountUsage(v8::Isolate::kLegacyFunctionDeclaration); | 4635 impl()->CountUsage(v8::Isolate::kLegacyFunctionDeclaration); |
4643 } | 4636 } |
4644 // Make a block around the statement for a lexical binding | 4637 // Make a block around the statement for a lexical binding |
4645 // is introduced by a FunctionDeclaration. | 4638 // is introduced by a FunctionDeclaration. |
4646 BlockState block_state(zone(), &scope_state_); | 4639 BlockState block_state(zone(), &scope_state_); |
4647 block_state.set_start_position(scanner()->location().beg_pos); | 4640 block_state.set_start_position(scanner()->location().beg_pos); |
4648 BlockT block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition); | 4641 BlockT block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition); |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5461 has_seen_constructor_ = true; | 5454 has_seen_constructor_ = true; |
5462 return; | 5455 return; |
5463 } | 5456 } |
5464 } | 5457 } |
5465 | 5458 |
5466 | 5459 |
5467 } // namespace internal | 5460 } // namespace internal |
5468 } // namespace v8 | 5461 } // namespace v8 |
5469 | 5462 |
5470 #endif // V8_PARSING_PARSER_BASE_H | 5463 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |