Index: src/ia32/code-stubs-ia32.cc |
=================================================================== |
--- src/ia32/code-stubs-ia32.cc (revision 8110) |
+++ src/ia32/code-stubs-ia32.cc (working copy) |
@@ -242,6 +242,8 @@ |
// NOTE: The stub does not handle the inlined cases (Smis, Booleans, undefined). |
void ToBooleanStub::Generate(MacroAssembler* masm) { |
+ // This stub overrides SometimesSetsUpAFrame() to return false. That means |
+ // we cannot call anything that could cause a GC from this stub. |
Label false_result, true_result, not_string; |
__ mov(eax, Operand(esp, 1 * kPointerSize)); |
Factory* factory = masm->isolate()->factory(); |
@@ -721,11 +723,12 @@ |
__ jmp(&heapnumber_allocated); |
__ bind(&slow_allocate_heapnumber); |
- __ EnterInternalFrame(); |
- __ push(edx); |
- __ CallRuntime(Runtime::kNumberAlloc, 0); |
- __ pop(edx); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(edx); |
+ __ CallRuntime(Runtime::kNumberAlloc, 0); |
+ __ pop(edx); |
+ } |
__ bind(&heapnumber_allocated); |
// eax: allocated 'empty' number |
@@ -768,15 +771,16 @@ |
__ jmp(&heapnumber_allocated); |
__ bind(&slow_allocate_heapnumber); |
- __ EnterInternalFrame(); |
- // Push the original HeapNumber on the stack. The integer value can't |
- // be stored since it's untagged and not in the smi range (so we can't |
- // smi-tag it). We'll recalculate the value after the GC instead. |
- __ push(ebx); |
- __ CallRuntime(Runtime::kNumberAlloc, 0); |
- // New HeapNumber is in eax. |
- __ pop(edx); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ // Push the original HeapNumber on the stack. The integer value can't |
+ // be stored since it's untagged and not in the smi range (so we can't |
+ // smi-tag it). We'll recalculate the value after the GC instead. |
+ __ push(ebx); |
+ __ CallRuntime(Runtime::kNumberAlloc, 0); |
+ // New HeapNumber is in eax. |
+ __ pop(edx); |
+ } |
// IntegerConvert uses ebx and edi as scratch registers. |
// This conversion won't go slow-case. |
IntegerConvert(masm, edx, CpuFeatures::IsSupported(SSE3), slow); |
@@ -2288,11 +2292,12 @@ |
__ add(Operand(esp), Immediate(kDoubleSize)); |
// We return the value in xmm1 without adding it to the cache, but |
// we cause a scavenging GC so that future allocations will succeed. |
- __ EnterInternalFrame(); |
- // Allocate an unused object bigger than a HeapNumber. |
- __ push(Immediate(Smi::FromInt(2 * kDoubleSize))); |
- __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ // Allocate an unused object bigger than a HeapNumber. |
+ __ push(Immediate(Smi::FromInt(2 * kDoubleSize))); |
+ __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace); |
+ } |
__ Ret(); |
} |
@@ -2309,10 +2314,11 @@ |
__ bind(&runtime_call); |
__ AllocateHeapNumber(eax, edi, no_reg, &skip_cache); |
__ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm1); |
- __ EnterInternalFrame(); |
- __ push(eax); |
- __ CallRuntime(RuntimeFunction(), 1); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(eax); |
+ __ CallRuntime(RuntimeFunction(), 1); |
+ } |
__ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); |
__ Ret(); |
} |
@@ -4525,11 +4531,12 @@ |
__ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); |
} else { |
// Call the builtin and convert 0/1 to true/false. |
- __ EnterInternalFrame(); |
- __ push(object); |
- __ push(function); |
- __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(object); |
+ __ push(function); |
+ __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); |
+ } |
Label true_value, done; |
__ test(eax, Operand(eax)); |
__ j(zero, &true_value, Label::kNear); |
@@ -5959,15 +5966,16 @@ |
__ push(eax); |
__ push(ecx); |
- // Call the runtime system in a fresh internal frame. |
- ExternalReference miss = ExternalReference(IC_Utility(IC::kCompareIC_Miss), |
- masm->isolate()); |
- __ EnterInternalFrame(); |
- __ push(edx); |
- __ push(eax); |
- __ push(Immediate(Smi::FromInt(op_))); |
- __ CallExternalReference(miss, 3); |
- __ LeaveInternalFrame(); |
+ { |
+ // Call the runtime system in a fresh internal frame. |
+ ExternalReference miss = ExternalReference(IC_Utility(IC::kCompareIC_Miss), |
+ masm->isolate()); |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(edx); |
+ __ push(eax); |
+ __ push(Immediate(Smi::FromInt(op_))); |
+ __ CallExternalReference(miss, 3); |
+ } |
// Compute the entry point of the rewritten stub. |
__ lea(edi, FieldOperand(eax, Code::kHeaderSize)); |
@@ -6108,6 +6116,8 @@ |
void StringDictionaryLookupStub::Generate(MacroAssembler* masm) { |
+ // This stub overrides SometimesSetsUpAFrame() to return false. That means |
+ // we cannot call anything that could cause a GC from this stub. |
// Stack frame on entry: |
// esp[0 * kPointerSize]: return address. |
// esp[1 * kPointerSize]: key's hash. |