OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/parser.h" | 5 #include "vm/parser.h" |
6 | 6 |
7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/compiler_stats.h" | 10 #include "vm/compiler_stats.h" |
(...skipping 1752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1763 current_block_->statements->Add( | 1763 current_block_->statements->Add( |
1764 new StaticCallNode(token_index_, super_ctor, super_call_args)); | 1764 new StaticCallNode(token_index_, super_ctor, super_call_args)); |
1765 } | 1765 } |
1766 } | 1766 } |
1767 if (CurrentToken() == Token::kLBRACE) { | 1767 if (CurrentToken() == Token::kLBRACE) { |
1768 ConsumeToken(); | 1768 ConsumeToken(); |
1769 ParseStatementSequence(); | 1769 ParseStatementSequence(); |
1770 ExpectToken(Token::kRBRACE); | 1770 ExpectToken(Token::kRBRACE); |
1771 } else if (CurrentToken() == Token::kARROW) { | 1771 } else if (CurrentToken() == Token::kARROW) { |
1772 ConsumeToken(); | 1772 ConsumeToken(); |
| 1773 if (func.IsConstructor()) { |
| 1774 ErrorMsg("constructors may not return a value"); |
| 1775 } |
1773 intptr_t expr_pos = token_index_; | 1776 intptr_t expr_pos = token_index_; |
1774 AstNode* expr = ParseExpr(kAllowConst); | 1777 AstNode* expr = ParseExpr(kAllowConst); |
1775 ASSERT(expr != NULL); | 1778 ASSERT(expr != NULL); |
1776 current_block_->statements->Add(new ReturnNode(expr_pos, expr)); | 1779 current_block_->statements->Add(new ReturnNode(expr_pos, expr)); |
1777 } else if (IsLiteral("native")) { | 1780 } else if (IsLiteral("native")) { |
1778 ParseNativeFunctionBlock(¶ms, func); | 1781 ParseNativeFunctionBlock(¶ms, func); |
1779 } else if (CurrentToken() == Token::kSEMICOLON) { | 1782 } else if (CurrentToken() == Token::kSEMICOLON) { |
1780 ConsumeToken(); | 1783 ConsumeToken(); |
1781 ASSERT(func.IsConstructor()); | 1784 ASSERT(func.IsConstructor()); |
1782 // Some constructors have no function body. | 1785 // Some constructors have no function body. |
(...skipping 3048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4831 statement = ParseWhileStatement(label_name); | 4834 statement = ParseWhileStatement(label_name); |
4832 } else if (CurrentToken() == Token::kFOR) { | 4835 } else if (CurrentToken() == Token::kFOR) { |
4833 statement = ParseForStatement(label_name); | 4836 statement = ParseForStatement(label_name); |
4834 } else if (CurrentToken() == Token::kDO) { | 4837 } else if (CurrentToken() == Token::kDO) { |
4835 statement = ParseDoWhileStatement(label_name); | 4838 statement = ParseDoWhileStatement(label_name); |
4836 } else if (CurrentToken() == Token::kSWITCH) { | 4839 } else if (CurrentToken() == Token::kSWITCH) { |
4837 statement = ParseSwitchStatement(label_name); | 4840 statement = ParseSwitchStatement(label_name); |
4838 } else if (CurrentToken() == Token::kTRY) { | 4841 } else if (CurrentToken() == Token::kTRY) { |
4839 statement = ParseTryStatement(label_name); | 4842 statement = ParseTryStatement(label_name); |
4840 } else if (CurrentToken() == Token::kRETURN) { | 4843 } else if (CurrentToken() == Token::kRETURN) { |
| 4844 const intptr_t return_pos = token_index_; |
4841 ConsumeToken(); | 4845 ConsumeToken(); |
4842 if (CurrentToken() != Token::kSEMICOLON) { | 4846 if (CurrentToken() != Token::kSEMICOLON) { |
| 4847 if (current_function().IsConstructor() && |
| 4848 (current_block_->scope->function_level() == 0)) { |
| 4849 ErrorMsg(return_pos, "return of a value not allowed in constructors"); |
| 4850 } |
4843 AstNode* expr = ParseExpr(kAllowConst); | 4851 AstNode* expr = ParseExpr(kAllowConst); |
4844 statement = new ReturnNode(statement_pos, expr); | 4852 statement = new ReturnNode(statement_pos, expr); |
4845 } else { | 4853 } else { |
4846 statement = new ReturnNode(statement_pos); | 4854 statement = new ReturnNode(statement_pos); |
4847 } | 4855 } |
4848 AddNodeForFinallyInlining(statement); | 4856 AddNodeForFinallyInlining(statement); |
4849 ExpectSemicolon(); | 4857 ExpectSemicolon(); |
4850 } else if (CurrentToken() == Token::kIF) { | 4858 } else if (CurrentToken() == Token::kIF) { |
4851 statement = ParseIfStatement(label_name); | 4859 statement = ParseIfStatement(label_name); |
4852 } else if (CurrentToken() == Token::kASSERT) { | 4860 } else if (CurrentToken() == Token::kASSERT) { |
(...skipping 2346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7199 } | 7207 } |
7200 | 7208 |
7201 | 7209 |
7202 void Parser::SkipNestedExpr() { | 7210 void Parser::SkipNestedExpr() { |
7203 const bool saved_mode = SetAllowFunctionLiterals(true); | 7211 const bool saved_mode = SetAllowFunctionLiterals(true); |
7204 SkipExpr(); | 7212 SkipExpr(); |
7205 SetAllowFunctionLiterals(saved_mode); | 7213 SetAllowFunctionLiterals(saved_mode); |
7206 } | 7214 } |
7207 | 7215 |
7208 } // namespace dart | 7216 } // namespace dart |
OLD | NEW |