Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index bdb2cad9c31162df670ea7c0cc0d7f2f8c7d99da..6dfa4a7d17f488f748c8535aeef0d98fbf387fe8 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -1219,6 +1219,7 @@ class ParserBase { |
bool* ok); |
StatementT ParseStatementAsUnlabelled(ZoneList<const AstRawString*>* labels, |
bool* ok); |
+ BlockT ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok); |
bool IsNextLetKeyword(); |
bool IsTrivialExpression(); |
@@ -4201,6 +4202,36 @@ ParserBase<Impl>::ParseStatementAsUnlabelled( |
} |
} |
+template <typename Impl> |
+typename ParserBase<Impl>::BlockT ParserBase<Impl>::ParseBlock( |
+ ZoneList<const AstRawString*>* labels, bool* ok) { |
+ // Block :: |
+ // '{' StatementList '}' |
+ |
+ // Construct block expecting 16 statements. |
+ BlockT body = factory()->NewBlock(labels, 16, false, kNoSourcePosition); |
+ |
+ // Parse the statements and collect escaping labels. |
+ Expect(Token::LBRACE, CHECK_OK_CUSTOM(NullBlock)); |
+ { |
+ BlockState block_state(&scope_state_); |
+ block_state.set_start_position(scanner()->location().beg_pos); |
+ typename Types::Target target(this, body); |
+ |
+ while (peek() != Token::RBRACE) { |
+ StatementT stat = ParseStatementListItem(CHECK_OK_CUSTOM(NullBlock)); |
+ if (!impl()->IsNullOrEmptyStatement(stat)) { |
+ body->statements()->Add(stat, zone()); |
+ } |
+ } |
+ |
+ Expect(Token::RBRACE, CHECK_OK_CUSTOM(NullBlock)); |
+ block_state.set_end_position(scanner()->location().end_pos); |
+ body->set_scope(block_state.FinalizedBlockScope()); |
+ } |
+ return body; |
+} |
+ |
#undef CHECK_OK |
#undef CHECK_OK_CUSTOM |