Index: src/x64/code-stubs-x64.cc |
=================================================================== |
--- src/x64/code-stubs-x64.cc (revision 9277) |
+++ src/x64/code-stubs-x64.cc (working copy) |
@@ -233,6 +233,8 @@ |
// The stub expects its argument on the stack and returns its result in tos_: |
// zero for false, and a non-zero value for true. |
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 patch; |
const Register argument = rax; |
const Register map = rdx; |
@@ -622,12 +624,13 @@ |
__ jmp(&heapnumber_allocated); |
__ bind(&slow_allocate_heapnumber); |
- __ EnterInternalFrame(); |
- __ push(rax); |
- __ CallRuntime(Runtime::kNumberAlloc, 0); |
- __ movq(rcx, rax); |
- __ pop(rax); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(rax); |
+ __ CallRuntime(Runtime::kNumberAlloc, 0); |
+ __ movq(rcx, rax); |
+ __ pop(rax); |
+ } |
__ bind(&heapnumber_allocated); |
// rcx: allocated 'empty' number |
@@ -1453,11 +1456,12 @@ |
__ addq(rsp, 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(Smi::FromInt(2 * kDoubleSize)); |
- __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ // Allocate an unused object bigger than a HeapNumber. |
+ __ Push(Smi::FromInt(2 * kDoubleSize)); |
+ __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace); |
+ } |
__ Ret(); |
} |
@@ -1473,10 +1477,11 @@ |
__ bind(&runtime_call); |
__ AllocateHeapNumber(rax, rdi, &skip_cache); |
__ movsd(FieldOperand(rax, HeapNumber::kValueOffset), xmm1); |
- __ EnterInternalFrame(); |
- __ push(rax); |
- __ CallRuntime(RuntimeFunction(), 1); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(rax); |
+ __ CallRuntime(RuntimeFunction(), 1); |
+ } |
__ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset)); |
__ Ret(); |
} |
@@ -5271,12 +5276,13 @@ |
// Call the runtime system in a fresh internal frame. |
ExternalReference miss = |
ExternalReference(IC_Utility(IC::kCompareIC_Miss), masm->isolate()); |
- __ EnterInternalFrame(); |
- __ push(rdx); |
- __ push(rax); |
- __ Push(Smi::FromInt(op_)); |
- __ CallExternalReference(miss, 3); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(rdx); |
+ __ push(rax); |
+ __ Push(Smi::FromInt(op_)); |
+ __ CallExternalReference(miss, 3); |
+ } |
// Compute the entry point of the rewritten stub. |
__ lea(rdi, FieldOperand(rax, Code::kHeaderSize)); |
@@ -5407,6 +5413,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. |