| Index: runtime/vm/code_generator.cc
|
| ===================================================================
|
| --- runtime/vm/code_generator.cc (revision 45386)
|
| +++ runtime/vm/code_generator.cc (working copy)
|
| @@ -1439,14 +1439,21 @@
|
|
|
| void DeoptimizeAt(const Code& optimized_code, uword pc) {
|
| ASSERT(optimized_code.is_optimized());
|
| + Thread* thread = Thread::Current();
|
| + Zone* zone = thread->zone();
|
| ICData::DeoptReasonId deopt_reason = ICData::kDeoptUnknown;
|
| uint32_t deopt_flags = 0;
|
| - const TypedData& deopt_info = TypedData::Handle(
|
| + const TypedData& deopt_info = TypedData::Handle(zone,
|
| optimized_code.GetDeoptInfoAtPc(pc, &deopt_reason, &deopt_flags));
|
| ASSERT(!deopt_info.IsNull());
|
| - const Function& function = Function::Handle(optimized_code.function());
|
| - Compiler::EnsureUnoptimizedCode(Thread::Current(), function);
|
| - const Code& unoptimized_code = Code::Handle(function.unoptimized_code());
|
| + const Function& function = Function::Handle(zone, optimized_code.function());
|
| + const Error& error =
|
| + Error::Handle(zone, Compiler::EnsureUnoptimizedCode(thread, function));
|
| + if (!error.IsNull()) {
|
| + Exceptions::PropagateError(error);
|
| + }
|
| + const Code& unoptimized_code =
|
| + Code::Handle(zone, function.unoptimized_code());
|
| ASSERT(!unoptimized_code.IsNull());
|
| // The switch to unoptimized code may have already occurred.
|
| if (function.HasOptimizedCode()) {
|
| @@ -1457,7 +1464,7 @@
|
| uword lazy_deopt_jump = optimized_code.GetLazyDeoptPc();
|
| ASSERT(lazy_deopt_jump != 0);
|
| const Instructions& instrs =
|
| - Instructions::Handle(optimized_code.instructions());
|
| + Instructions::Handle(zone, optimized_code.instructions());
|
| {
|
| WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
|
| CodePatcher::InsertCallAt(pc, lazy_deopt_jump);
|
|
|