| 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.
|
|
|