Index: runtime/vm/flow_graph.cc |
=================================================================== |
--- runtime/vm/flow_graph.cc (revision 35546) |
+++ runtime/vm/flow_graph.cc (working copy) |
@@ -478,6 +478,7 @@ |
if (store != NULL) { |
const intptr_t index = |
store->local().BitIndexIn(num_non_copied_params_); |
+ if (index >= live_in->length()) continue; // Skip tmp_locals. |
if (kill->Contains(index)) { |
if (!live_in->Contains(index)) { |
store->mark_dead(); |
@@ -756,6 +757,15 @@ |
Environment::From(*env, |
num_non_copied_params_, |
Code::Handle(parsed_function_.code())); |
+ // TODO(fschneider): Add predicates CanEagerlyDeoptimize and |
+ // CanLazilyDeoptimize to instructions to generally deal with instructions |
+ // that have pushed arguments and input operands. |
+ // Right now, closure calls are the only instructions that have both. They |
+ // also don't have an eager deoptimziation point, so the environment attached |
+ // here is only used for after the call. |
+ if (instr->IsClosureCall()) { |
+ deopt_env = deopt_env->DeepCopy(deopt_env->Length() - instr->InputCount()); |
+ } |
instr->SetEnvironment(deopt_env); |
for (Environment::DeepIterator it(deopt_env); !it.Done(); it.Advance()) { |
Value* use = it.CurrentValue(); |