Chromium Code Reviews| Index: runtime/vm/ast_transformer.cc |
| diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc |
| index b4583cf636de7d8a9156f259c6cc430e65e13772..95d8d4f37dc8ce33dab80a2117276d9731a2f5dc 100644 |
| --- a/runtime/vm/ast_transformer.cc |
| +++ b/runtime/vm/ast_transformer.cc |
| @@ -567,12 +567,21 @@ void AwaitTransformer::VisitLetNode(LetNode* node) { |
| node->TempAt(i), |
| new_init_val)); |
| } |
| - // The transformed LetNode does not have any temporary variables. |
| - LetNode* result = new(Z) LetNode(node->token_pos()); |
| - for (intptr_t i = 0; i < node->nodes().length(); i++) { |
| - result->AddNode(Transform(node->nodes()[i])); |
| + |
| + // Add all expressions but the last to the preamble. We must do |
| + // this because subexpressions of the awaitable expression we |
| + // are currently transforming may depend on each other, |
| + // e.g. await foo(a++, a++). Thus we must preserve the order of the |
| + // transformed subexpressions. |
| + for (intptr_t i = 0; i < node->nodes().length() - 1; i++) { |
| + preamble_->Add(Transform(node->nodes()[i])); |
| } |
| - result_ = result; |
| + |
| + // The last expression in the let node is the value of the node. |
| + // The result of the transformed let node is this expression. |
| + ASSERT(node->nodes().length() > 0); |
| + const intptr_t last_node_index = node->nodes().length() - 1; |
| + result_ = Transform(node->nodes()[last_node_index]); |
|
regis
2015/10/05 20:33:15
You could have used node->nodes().Last()
hausner
2015/10/05 21:19:43
Good idea. Will do in a later checkin.
|
| } |