Index: src/ia32/full-codegen-ia32.cc |
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
index c9e280ddf7e089b73490a8be547f48e0af292aa0..0ea77f09145d1d84596ffb2567cc6b7d4904fe11 100644 |
--- a/src/ia32/full-codegen-ia32.cc |
+++ b/src/ia32/full-codegen-ia32.cc |
@@ -78,27 +78,6 @@ class JumpPatchSite BASE_EMBEDDED { |
}; |
-static void EmitStackCheck(MacroAssembler* masm_, |
- int pointers = 0, |
- Register scratch = esp) { |
- Label ok; |
- Isolate* isolate = masm_->isolate(); |
- ASSERT(scratch.is(esp) == (pointers == 0)); |
- ExternalReference stack_limit; |
- if (pointers != 0) { |
- __ mov(scratch, esp); |
- __ sub(scratch, Immediate(pointers * kPointerSize)); |
- stack_limit = ExternalReference::address_of_real_stack_limit(isolate); |
- } else { |
- stack_limit = ExternalReference::address_of_stack_limit(isolate); |
- } |
- __ cmp(scratch, Operand::StaticVariable(stack_limit)); |
- __ j(above_equal, &ok, Label::kNear); |
- __ call(isolate->builtins()->StackCheck(), RelocInfo::CODE_TARGET); |
- __ bind(&ok); |
-} |
- |
- |
// Generate code for a JS function. On entry to the function the receiver |
// and arguments have been pushed on the stack left to right, with the |
// return address on top of them. The actual argument count matches the |
@@ -168,7 +147,15 @@ void FullCodeGenerator::Generate() { |
__ push(Immediate(isolate()->factory()->undefined_value())); |
} else if (locals_count > 1) { |
if (locals_count >= 128) { |
- EmitStackCheck(masm_, locals_count, ecx); |
+ Label ok; |
+ __ mov(ecx, esp); |
+ __ sub(ecx, Immediate(locals_count * kPointerSize)); |
+ ExternalReference stack_limit = |
+ ExternalReference::address_of_real_stack_limit(isolate()); |
+ __ cmp(ecx, Operand::StaticVariable(stack_limit)); |
+ __ j(above_equal, &ok, Label::kNear); |
+ __ InvokeBuiltin(Builtins::STACK_OVERFLOW, CALL_FUNCTION); |
+ __ bind(&ok); |
} |
__ mov(eax, Immediate(isolate()->factory()->undefined_value())); |
const int kMaxPushes = 32; |
@@ -309,7 +296,13 @@ void FullCodeGenerator::Generate() { |
{ Comment cmnt(masm_, "[ Stack check"); |
PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS); |
- EmitStackCheck(masm_); |
+ Label ok; |
+ ExternalReference stack_limit |
+ = ExternalReference::address_of_stack_limit(isolate()); |
+ __ cmp(esp, Operand::StaticVariable(stack_limit)); |
+ __ j(above_equal, &ok, Label::kNear); |
+ __ call(isolate()->builtins()->StackCheck(), RelocInfo::CODE_TARGET); |
+ __ bind(&ok); |
} |
{ Comment cmnt(masm_, "[ Body"); |