OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #include "vm/flags.h" | 6 #include "vm/flags.h" |
7 | 7 |
8 #ifndef DART_PRECOMPILED_RUNTIME | 8 #ifndef DART_PRECOMPILED_RUNTIME |
9 | 9 |
10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
(...skipping 9157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9168 arguments->Add(new(Z) LiteralNode(begin, | 9168 arguments->Add(new(Z) LiteralNode(begin, |
9169 Integer::ZoneHandle(Z, Integer::New(begin.value(), Heap::kOld)))); | 9169 Integer::ZoneHandle(Z, Integer::New(begin.value(), Heap::kOld)))); |
9170 arguments->Add(new(Z) LiteralNode(end, | 9170 arguments->Add(new(Z) LiteralNode(end, |
9171 Integer::ZoneHandle(Z, Integer::New(end.value(), Heap::kOld)))); | 9171 Integer::ZoneHandle(Z, Integer::New(end.value(), Heap::kOld)))); |
9172 return MakeStaticCall(Symbols::AssertionError(), | 9172 return MakeStaticCall(Symbols::AssertionError(), |
9173 Library::PrivateCoreLibName(Symbols::ThrowNew()), | 9173 Library::PrivateCoreLibName(Symbols::ThrowNew()), |
9174 arguments); | 9174 arguments); |
9175 } | 9175 } |
9176 | 9176 |
9177 | 9177 |
9178 AstNode* Parser::InsertClosureCallNodes(AstNode* condition) { | 9178 AstNode* Parser::HandleAssertCondition(AstNode* condition) { |
9179 if (condition->IsClosureNode() || | 9179 const TokenPosition pos = condition->token_pos(); |
9180 (condition->IsStoreLocalNode() && | 9180 ArgumentListNode* arguments = new(Z) ArgumentListNode(pos); |
9181 condition->AsStoreLocalNode()->value()->IsClosureNode())) { | 9181 arguments->Add(condition); |
9182 // Function literal in assert implies a call. | 9182 return MakeStaticCall(Symbols::AssertionError(), |
9183 const TokenPosition pos = condition->token_pos(); | 9183 Library::PrivateCoreLibName(Symbols::HandleCondition()), |
9184 condition = BuildClosureCall(pos, | 9184 arguments); |
9185 condition, | |
9186 new(Z) ArgumentListNode(pos)); | |
9187 } else if (condition->IsConditionalExprNode()) { | |
9188 ConditionalExprNode* cond_expr = condition->AsConditionalExprNode(); | |
9189 cond_expr->set_true_expr(InsertClosureCallNodes(cond_expr->true_expr())); | |
9190 cond_expr->set_false_expr(InsertClosureCallNodes(cond_expr->false_expr())); | |
9191 } | |
9192 return condition; | |
9193 } | 9185 } |
9194 | 9186 |
9195 | 9187 |
9196 AstNode* Parser::ParseAssertStatement() { | 9188 AstNode* Parser::ParseAssertStatement() { |
9197 TRACE_PARSER("ParseAssertStatement"); | 9189 TRACE_PARSER("ParseAssertStatement"); |
9198 ConsumeToken(); // Consume assert keyword. | 9190 ConsumeToken(); // Consume assert keyword. |
9199 ExpectToken(Token::kLPAREN); | 9191 ExpectToken(Token::kLPAREN); |
9200 const TokenPosition condition_pos = TokenPos(); | 9192 const TokenPosition condition_pos = TokenPos(); |
9201 if (!I->asserts()) { | 9193 if (!I->asserts()) { |
9202 SkipExpr(); | 9194 SkipExpr(); |
9203 ExpectToken(Token::kRPAREN); | 9195 ExpectToken(Token::kRPAREN); |
9204 return NULL; | 9196 return NULL; |
9205 } | 9197 } |
9206 AstNode* condition = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); | 9198 AstNode* condition = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); |
9207 const TokenPosition condition_end = TokenPos(); | 9199 const TokenPosition condition_end = TokenPos(); |
9208 ExpectToken(Token::kRPAREN); | 9200 ExpectToken(Token::kRPAREN); |
9209 condition = InsertClosureCallNodes(condition); | 9201 condition = HandleAssertCondition(condition); |
9210 condition = new(Z) UnaryOpNode(condition_pos, Token::kNOT, condition); | 9202 condition = new(Z) UnaryOpNode(condition_pos, Token::kNOT, condition); |
9211 AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end); | 9203 AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end); |
9212 return new(Z) IfNode( | 9204 return new(Z) IfNode( |
hausner
2016/06/14 17:51:31
Since you now call a Dart function to evaluate the
Lasse Reichstein Nielsen
2016/06/15 05:57:02
I'm not particularly worried about passing two ext
| |
9213 condition_pos, | 9205 condition_pos, |
9214 condition, | 9206 condition, |
9215 NodeAsSequenceNode(condition_pos, assert_throw, NULL), | 9207 NodeAsSequenceNode(condition_pos, assert_throw, NULL), |
9216 NULL); | 9208 NULL); |
9217 } | 9209 } |
9218 | 9210 |
9219 | 9211 |
9220 // Populate local scope of the catch block with the catch parameters. | 9212 // Populate local scope of the catch block with the catch parameters. |
9221 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param, | 9213 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param, |
9222 CatchParamDesc* stack_trace_param, | 9214 CatchParamDesc* stack_trace_param, |
(...skipping 5407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
14630 const ArgumentListNode& function_args, | 14622 const ArgumentListNode& function_args, |
14631 const LocalVariable* temp_for_last_arg, | 14623 const LocalVariable* temp_for_last_arg, |
14632 bool is_super_invocation) { | 14624 bool is_super_invocation) { |
14633 UNREACHABLE(); | 14625 UNREACHABLE(); |
14634 return NULL; | 14626 return NULL; |
14635 } | 14627 } |
14636 | 14628 |
14637 } // namespace dart | 14629 } // namespace dart |
14638 | 14630 |
14639 #endif // DART_PRECOMPILED_RUNTIME | 14631 #endif // DART_PRECOMPILED_RUNTIME |
OLD | NEW |