| Index: runtime/vm/intermediate_language_arm.cc
|
| diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
|
| index 3f9e1f38052212fa7d8e2f1a3ddc27e5900eda21..cfc80193d0adf13b47989fd0fb19f7616be4e34a 100644
|
| --- a/runtime/vm/intermediate_language_arm.cc
|
| +++ b/runtime/vm/intermediate_language_arm.cc
|
| @@ -241,6 +241,7 @@ void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| __ LoadImmediate(R9, 0);
|
| __ blx(R2);
|
| compiler->RecordSafepoint(locs());
|
| + compiler->EmitCatchEntryState();
|
| // Marks either the continuation point in unoptimized code or the
|
| // deoptimization point in optimized code, after call.
|
| const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id());
|
| @@ -2476,8 +2477,9 @@ void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| const Code& stub = Code::ZoneHandle(compiler->zone(),
|
| StubCode::AllocateArray_entry()->code());
|
| compiler->AddStubCallTarget(stub);
|
| - compiler->GenerateCall(token_pos(), *StubCode::AllocateArray_entry(),
|
| - RawPcDescriptors::kOther, locs());
|
| + compiler->GenerateCallWithDeopt(token_pos(), deopt_id(),
|
| + *StubCode::AllocateArray_entry(),
|
| + RawPcDescriptors::kOther, locs());
|
| ASSERT(locs()->out(0).reg() == kResultReg);
|
| }
|
|
|
| @@ -3127,6 +3129,10 @@ class CheckedSmiSlowPath : public SlowPathCode {
|
| locs->live_registers()->Remove(Location::RegisterLocation(result));
|
|
|
| compiler->SaveLiveRegisters(locs);
|
| + if (instruction_->env() != NULL) {
|
| + Environment* env = compiler->SlowPathEnvironmentFor(instruction_);
|
| + compiler->pending_deoptimization_env_ = env;
|
| + }
|
| __ Push(locs->in(0).reg());
|
| __ Push(locs->in(1).reg());
|
| compiler->EmitMegamorphicInstanceCall(
|
| @@ -3137,6 +3143,7 @@ class CheckedSmiSlowPath : public SlowPathCode {
|
| __ mov(result, Operand(R0));
|
| compiler->RestoreLiveRegisters(locs);
|
| __ b(exit_label());
|
| + compiler->pending_deoptimization_env_ = NULL;
|
| }
|
|
|
| private:
|
| @@ -3261,6 +3268,10 @@ class CheckedSmiComparisonSlowPath : public SlowPathCode {
|
| locs->live_registers()->Remove(Location::RegisterLocation(result));
|
|
|
| compiler->SaveLiveRegisters(locs);
|
| + if (instruction_->env() != NULL) {
|
| + Environment* env = compiler->SlowPathEnvironmentFor(instruction_);
|
| + compiler->pending_deoptimization_env_ = env;
|
| + }
|
| __ Push(locs->in(0).reg());
|
| __ Push(locs->in(1).reg());
|
| compiler->EmitMegamorphicInstanceCall(
|
| @@ -3270,6 +3281,7 @@ class CheckedSmiComparisonSlowPath : public SlowPathCode {
|
| /* slow_path_argument_count = */ 2);
|
| __ mov(result, Operand(R0));
|
| compiler->RestoreLiveRegisters(locs);
|
| + compiler->pending_deoptimization_env_ = NULL;
|
| if (merged_) {
|
| __ CompareObject(result, Bool::True());
|
| __ b(
|
| @@ -6399,6 +6411,7 @@ class RangeErrorSlowPath : public SlowPathCode {
|
| }
|
| __ Bind(entry_label());
|
| LocationSummary* locs = instruction_->locs();
|
| + compiler->SaveLiveRegisters(locs);
|
| __ Push(locs->in(0).reg());
|
| __ Push(locs->in(1).reg());
|
| __ CallRuntime(kRangeErrorRuntimeEntry, 2);
|
| @@ -6406,6 +6419,8 @@ class RangeErrorSlowPath : public SlowPathCode {
|
| RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
|
| instruction_->deopt_id(), instruction_->token_pos(), try_index_);
|
| compiler->RecordSafepoint(locs, 2);
|
| + Environment* env = compiler->SlowPathEnvironmentFor(instruction_);
|
| + compiler->EmitCatchEntryState(env, try_index_);
|
| __ bkpt(0);
|
| }
|
|
|
|
|