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

Unified Diff: runtime/vm/flow_graph_builder.cc

Issue 655773003: Initialize the async jump variable with a smi to avoid polymorphic comparison. (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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/flow_graph_builder.cc
===================================================================
--- runtime/vm/flow_graph_builder.cc (revision 41096)
+++ runtime/vm/flow_graph_builder.cc (working copy)
@@ -1455,7 +1455,9 @@
}
-void EffectGraphVisitor::BuildAwaitJump(LocalScope* lookup_scope,
+void EffectGraphVisitor::BuildAwaitJump(LocalVariable* old_context,
+ LocalVariable* continuation_result,
+ LocalVariable* continuation_error,
const intptr_t old_ctx_level,
JoinEntryInstr* target) {
// Building a jump consists of the following actions:
@@ -1463,15 +1465,9 @@
// * Restore the old context.
// * Overwrite the old context's continuation result with the temporary.
// * Append a Goto to the target's join.
- LocalVariable* old_ctx = lookup_scope->LookupVariable(
- Symbols::AwaitContextVar(), false);
- LocalVariable* continuation_result = lookup_scope->LookupVariable(
- Symbols::AsyncOperationParam(), false);
- LocalVariable* continuation_error = lookup_scope->LookupVariable(
- Symbols::AsyncOperationErrorParam(), false);
ASSERT((continuation_result != NULL) && continuation_result->is_captured());
ASSERT((continuation_error != NULL) && continuation_error->is_captured());
- ASSERT((old_ctx != NULL) && old_ctx->is_captured());
+ ASSERT((old_context != NULL) && old_context->is_captured());
// Before restoring the continuation context we need to temporary save the
// result and error parameter.
LocalVariable* temp_result_var = EnterTempLocalScope(
@@ -1479,7 +1475,7 @@
LocalVariable* temp_error_var = EnterTempLocalScope(
Bind(BuildLoadLocal(*continuation_error)));
// Restore the saved continuation context.
- BuildRestoreContext(*old_ctx);
+ BuildRestoreContext(*old_context);
// Pass over the continuation result.
@@ -3882,6 +3878,12 @@
Scanner::kNoSourcePos, jump_var);
ComparisonNode* check_jump_cnt;
const intptr_t num_await_states = owner()->await_joins()->length();
+ LocalVariable* old_context = top_scope->LookupVariable(
+ Symbols::AwaitContextVar(), false);
+ LocalVariable* continuation_result = top_scope->LookupVariable(
+ Symbols::AsyncOperationParam(), false);
+ LocalVariable* continuation_error = top_scope->LookupVariable(
+ Symbols::AsyncOperationErrorParam(), false);
for (intptr_t i = 0; i < num_await_states; i++) {
check_jump_cnt = new(I) ComparisonNode(
Scanner::kNoSourcePos,
@@ -3894,7 +3896,9 @@
EffectGraphVisitor for_true(owner());
EffectGraphVisitor for_false(owner());
- for_true.BuildAwaitJump(top_scope,
+ for_true.BuildAwaitJump(old_context,
+ continuation_result,
+ continuation_error,
(*owner()->await_levels())[i],
(*owner()->await_joins())[i]);
Join(for_test, for_true, for_false);

Powered by Google App Engine
This is Rietveld 408576698