Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(913)

Side by Side Diff: runtime/vm/flow_graph_builder.cc

Issue 634603002: Await always waits (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/flow_graph_builder.h" 5 #include "vm/flow_graph_builder.h"
6 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "vm/ast_printer.h" 8 #include "vm/ast_printer.h"
9 #include "vm/bit_vector.h" 9 #include "vm/bit_vector.h"
10 #include "vm/class_finalizer.h" 10 #include "vm/class_finalizer.h"
(...skipping 1077 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 ASSERT(current_context_level >= 0); 1088 ASSERT(current_context_level >= 0);
1089 if (owner()->parsed_function()->saved_entry_context_var() != NULL) { 1089 if (owner()->parsed_function()->saved_entry_context_var() != NULL) {
1090 // CTX on entry was saved, but not linked as context parent. 1090 // CTX on entry was saved, but not linked as context parent.
1091 BuildRestoreContext(*owner()->parsed_function()->saved_entry_context_var()); 1091 BuildRestoreContext(*owner()->parsed_function()->saved_entry_context_var());
1092 } else { 1092 } else {
1093 UnchainContexts(current_context_level); 1093 UnchainContexts(current_context_level);
1094 } 1094 }
1095 1095
1096 1096
1097 AddReturnExit(node->token_pos(), return_value); 1097 AddReturnExit(node->token_pos(), return_value);
1098
1099 if (function.is_async_closure() &&
1100 (node->return_type() == ReturnNode::kContinuationTarget)) {
1101 JoinEntryInstr* const join = new(I) JoinEntryInstr(
1102 owner()->AllocateBlockId(), owner()->try_index());
1103 owner()->await_joins()->Add(join);
1104 exit_ = join;
1105 }
1098 } 1106 }
1099 1107
1100 1108
1101 // <Expression> ::= Literal { literal: Instance } 1109 // <Expression> ::= Literal { literal: Instance }
1102 void EffectGraphVisitor::VisitLiteralNode(LiteralNode* node) { 1110 void EffectGraphVisitor::VisitLiteralNode(LiteralNode* node) {
1103 ReturnDefinition(new(I) ConstantInstr(node->literal())); 1111 ReturnDefinition(new(I) ConstantInstr(node->literal()));
1104 } 1112 }
1105 1113
1106 1114
1107 // Type nodes are used when a type is referenced as a literal. Type nodes 1115 // Type nodes are used when a type is referenced as a literal. Type nodes
(...skipping 1099 matching lines...) Expand 10 before | Expand all | Expand 10 after
2207 } 2215 }
2208 2216
2209 2217
2210 void EffectGraphVisitor::VisitAwaitNode(AwaitNode* node) { 2218 void EffectGraphVisitor::VisitAwaitNode(AwaitNode* node) {
2211 // Await nodes are temporary during parsing. 2219 // Await nodes are temporary during parsing.
2212 UNREACHABLE(); 2220 UNREACHABLE();
2213 } 2221 }
2214 2222
2215 2223
2216 void EffectGraphVisitor::VisitAwaitMarkerNode(AwaitMarkerNode* node) { 2224 void EffectGraphVisitor::VisitAwaitMarkerNode(AwaitMarkerNode* node) {
2217 if (node->marker_type() == AwaitMarkerNode::kNewContinuationState) { 2225 // We need to create a new await state which involves:
2218 // We need to create a new await state which involves: 2226 // * Increase the jump counter. Sanity check against the list of targets.
2219 // * Increase the jump counter. Sanity check against the list of targets. 2227 // * Save the current context for resuming.
2220 // * Save the current context for resuming. 2228 ASSERT(node->scope() != NULL);
2221 ASSERT(node->scope() != NULL); 2229 LocalVariable* jump_var = node->scope()->LookupVariable(
2222 LocalVariable* jump_var = node->scope()->LookupVariable( 2230 Symbols::AwaitJumpVar(), false);
2223 Symbols::AwaitJumpVar(), false); 2231 LocalVariable* ctx_var = node->scope()->LookupVariable(
2224 LocalVariable* ctx_var = node->scope()->LookupVariable( 2232 Symbols::AwaitContextVar(), false);
2225 Symbols::AwaitContextVar(), false); 2233 ASSERT((jump_var != NULL) && jump_var->is_captured());
2226 ASSERT((jump_var != NULL) && jump_var->is_captured()); 2234 ASSERT((ctx_var != NULL) && ctx_var->is_captured());
2227 ASSERT((ctx_var != NULL) && ctx_var->is_captured()); 2235 const intptr_t jump_cnt = owner()->next_await_counter();
Florian Schneider 2014/10/14 11:47:30 Abbreviations that are not a prefix of the origina
hausner 2014/10/14 19:56:39 We use ctx as much as we use context across our so
2228 const intptr_t jump_cnt = owner()->next_await_counter(); 2236 ASSERT(jump_cnt >= 0);
2229 ASSERT(jump_cnt >= 0); 2237 // Sanity check that we always add a JoinEntryInstr before adding a new
2230 // Sanity check that we always add a JoinEntryInstr before adding a new 2238 // state.
2231 // state. 2239 ASSERT(jump_cnt == owner()->await_joins()->length());
2232 ASSERT(jump_cnt == owner()->await_joins()->length()); 2240 // Store the counter in :await_jump_var.
2233 // Store the counter in :await_jump_var. 2241 Value* jump_val = Bind(new (I) ConstantInstr(
2234 Value* jump_val = Bind(new (I) ConstantInstr( 2242 Smi::ZoneHandle(I, Smi::New(jump_cnt))));
2235 Smi::ZoneHandle(I, Smi::New(jump_cnt)))); 2243 Do(BuildStoreLocal(*jump_var, jump_val));
2236 Do(BuildStoreLocal(*jump_var, jump_val)); 2244 // Save the current context for resuming.
2237 // Save the current context for resuming. 2245 BuildSaveContext(*ctx_var);
2238 BuildSaveContext(*ctx_var); 2246 owner()->await_levels()->Add(owner()->context_level());
2239 owner()->await_levels()->Add(owner()->context_level());
2240 return;
2241 }
2242 if (node->marker_type() == AwaitMarkerNode::kTargetForContinuation) {
2243 // We need to create a new await target which involves:
2244 // * Append a join that is also added to the list that will later result in
2245 // a preamble.
2246 JoinEntryInstr* const join = new(I) JoinEntryInstr(
2247 owner()->AllocateBlockId(), owner()->try_index());
2248 owner()->await_joins()->Add(join);
2249 Goto(join);
2250 exit_ = join;
2251 return;
2252 }
2253 UNREACHABLE();
2254 } 2247 }
2255 2248
2256 2249
2257 intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const { 2250 intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const {
2258 return kFirstLocalSlotFromFp 2251 return kFirstLocalSlotFromFp
2259 - owner()->num_stack_locals() 2252 - owner()->num_stack_locals()
2260 - owner()->num_copied_params() 2253 - owner()->num_copied_params()
2261 - owner()->args_pushed() 2254 - owner()->args_pushed()
2262 - owner()->temp_count() + 1; 2255 - owner()->temp_count() + 1;
2263 } 2256 }
(...skipping 2021 matching lines...) Expand 10 before | Expand all | Expand 10 after
4285 Report::MessageF(Report::kBailout, 4278 Report::MessageF(Report::kBailout,
4286 Script::Handle(function.script()), 4279 Script::Handle(function.script()),
4287 function.token_pos(), 4280 function.token_pos(),
4288 "FlowGraphBuilder Bailout: %s %s", 4281 "FlowGraphBuilder Bailout: %s %s",
4289 String::Handle(function.name()).ToCString(), 4282 String::Handle(function.name()).ToCString(),
4290 reason); 4283 reason);
4291 UNREACHABLE(); 4284 UNREACHABLE();
4292 } 4285 }
4293 4286
4294 } // namespace dart 4287 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698