OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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/ast_transformer.h" | 5 #include "vm/ast_transformer.h" |
6 | 6 |
7 #include "vm/object_store.h" | 7 #include "vm/object_store.h" |
8 #include "vm/parser.h" | 8 #include "vm/parser.h" |
9 #include "vm/thread.h" | 9 #include "vm/thread.h" |
10 | 10 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 return new (Z) LoadLocalNode(ST(node->token_pos()), temp); | 112 return new (Z) LoadLocalNode(ST(node->token_pos()), temp); |
113 } | 113 } |
114 | 114 |
115 | 115 |
116 void AwaitTransformer::VisitLiteralNode(LiteralNode* node) { | 116 void AwaitTransformer::VisitLiteralNode(LiteralNode* node) { |
117 result_ = node; | 117 result_ = node; |
118 } | 118 } |
119 | 119 |
120 | 120 |
121 void AwaitTransformer::VisitTypeNode(TypeNode* node) { | 121 void AwaitTransformer::VisitTypeNode(TypeNode* node) { |
122 result_ = new (Z) TypeNode(node->token_pos(), node->type()); | 122 if (node->is_deferred_reference()) { |
| 123 // Deferred references must use a temporary even after loading |
| 124 // happened, so that the number of await temps is the same as |
| 125 // before the loading. |
| 126 result_ = MakeName(node); |
| 127 } else { |
| 128 result_ = node; |
| 129 } |
123 } | 130 } |
124 | 131 |
125 | 132 |
126 void AwaitTransformer::VisitAwaitNode(AwaitNode* node) { | 133 void AwaitTransformer::VisitAwaitNode(AwaitNode* node) { |
127 // Await transformation: | 134 // Await transformation: |
128 // | 135 // |
129 // :await_temp_var_X = <expr>; | 136 // :await_temp_var_X = <expr>; |
130 // AwaitMarker(kNewContinuationState); | 137 // AwaitMarker(kNewContinuationState); |
131 // :result_param = _awaitHelper( | 138 // :result_param = _awaitHelper( |
132 // :await_temp_var_X, :async_then_callback, :async_catch_error_callback); | 139 // :await_temp_var_X, :async_then_callback, :async_catch_error_callback); |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 } | 514 } |
508 | 515 |
509 | 516 |
510 void AwaitTransformer::VisitThrowNode(ThrowNode* node) { | 517 void AwaitTransformer::VisitThrowNode(ThrowNode* node) { |
511 AstNode* new_exception = Transform(node->exception()); | 518 AstNode* new_exception = Transform(node->exception()); |
512 result_ = MakeName( | 519 result_ = MakeName( |
513 new (Z) ThrowNode(node->token_pos(), new_exception, node->stacktrace())); | 520 new (Z) ThrowNode(node->token_pos(), new_exception, node->stacktrace())); |
514 } | 521 } |
515 | 522 |
516 } // namespace dart | 523 } // namespace dart |
OLD | NEW |