| 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());
|
| }
|
|
|
|
|
|
|