Index: runtime/vm/intermediate_language_ia32.cc |
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc |
index 40023e2502224c9ad651f39a768c7659e5fff81e..dbca3a3382435c175d9adebee98150d3888cdba1 100644 |
--- a/runtime/vm/intermediate_language_ia32.cc |
+++ b/runtime/vm/intermediate_language_ia32.cc |
@@ -1429,24 +1429,44 @@ void CatchEntryComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
LocationSummary* CheckStackOverflowComp::MakeLocationSummary() const { |
const intptr_t kNumInputs = 0; |
const intptr_t kNumTemps = 0; |
- // TODO(vegorov): spilling is required only on an infrequently executed path. |
LocationSummary* summary = |
- new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); |
+ new LocationSummary(kNumInputs, |
+ kNumTemps, |
+ LocationSummary::kCallOnSlowPath); |
return summary; |
} |
+class CheckStackOverflowSlowPath : public SlowPathCode { |
+ public: |
+ explicit CheckStackOverflowSlowPath(CheckStackOverflowComp* computation) |
+ : computation_(computation) { } |
+ |
+ virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
+ __ Bind(entry_label()); |
+ compiler->SaveLiveRegisters(computation_->locs()); |
+ compiler->GenerateCallRuntime(computation_->deopt_id(), |
+ computation_->token_pos(), |
+ computation_->try_index(), |
+ kStackOverflowRuntimeEntry, |
+ computation_->locs()->stack_bitmap()); |
+ compiler->RestoreLiveRegisters(computation_->locs()); |
+ __ jmp(exit_label()); |
+ } |
+ |
+ private: |
+ CheckStackOverflowComp* computation_; |
+}; |
+ |
+ |
void CheckStackOverflowComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this); |
+ compiler->AddSlowPathCode(slow_path); |
+ |
__ cmpl(ESP, |
Address::Absolute(Isolate::Current()->stack_limit_address())); |
- Label no_stack_overflow; |
- __ j(ABOVE, &no_stack_overflow); |
- compiler->GenerateCallRuntime(deopt_id(), |
- token_pos(), |
- try_index(), |
- kStackOverflowRuntimeEntry, |
- locs()->stack_bitmap()); |
- __ Bind(&no_stack_overflow); |
+ __ j(BELOW_EQUAL, slow_path->entry_label()); |
+ __ Bind(slow_path->exit_label()); |
} |