Index: src/mips/code-stubs-mips.cc |
=================================================================== |
--- src/mips/code-stubs-mips.cc (revision 9277) |
+++ src/mips/code-stubs-mips.cc (working copy) |
@@ -881,9 +881,11 @@ |
__ Move(f12, a0, a1); |
__ Move(f14, a2, a3); |
} |
- // Call C routine that may not cause GC or other trouble. |
- __ CallCFunction(ExternalReference::double_fp_operation(op, masm->isolate()), |
- 4); |
+ { |
+ AllowExternalCallThatCantCauseGC scope(masm); |
+ __ CallCFunction( |
+ ExternalReference::double_fp_operation(op, masm->isolate()), 4); |
+ } |
// Store answer in the overwritable heap number. |
if (!IsMipsSoftFloatABI) { |
CpuFeatures::Scope scope(FPU); |
@@ -1951,12 +1953,13 @@ |
__ jmp(&heapnumber_allocated); |
__ bind(&slow_allocate_heapnumber); |
- __ EnterInternalFrame(); |
- __ push(a0); |
- __ CallRuntime(Runtime::kNumberAlloc, 0); |
- __ mov(a1, v0); |
- __ pop(a0); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(a0); |
+ __ CallRuntime(Runtime::kNumberAlloc, 0); |
+ __ mov(a1, v0); |
+ __ pop(a0); |
+ } |
__ bind(&heapnumber_allocated); |
__ lw(a3, FieldMemOperand(a0, HeapNumber::kMantissaOffset)); |
@@ -1998,13 +2001,14 @@ |
__ jmp(&heapnumber_allocated); |
__ bind(&slow_allocate_heapnumber); |
- __ EnterInternalFrame(); |
- __ push(v0); // Push the heap number, not the untagged int32. |
- __ CallRuntime(Runtime::kNumberAlloc, 0); |
- __ mov(a2, v0); // Move the new heap number into a2. |
- // Get the heap number into v0, now that the new heap number is in a2. |
- __ pop(v0); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(v0); // Push the heap number, not the untagged int32. |
+ __ CallRuntime(Runtime::kNumberAlloc, 0); |
+ __ mov(a2, v0); // Move the new heap number into a2. |
+ // Get the heap number into v0, now that the new heap number is in a2. |
+ __ pop(v0); |
+ } |
// Convert the heap number in v0 to an untagged integer in a1. |
// This can't go slow-case because it's the same number we already |
@@ -3283,10 +3287,11 @@ |
__ LoadRoot(t1, Heap::kHeapNumberMapRootIndex); |
__ AllocateHeapNumber(a0, scratch0, scratch1, t1, &skip_cache); |
__ sdc1(f4, FieldMemOperand(a0, HeapNumber::kValueOffset)); |
- __ EnterInternalFrame(); |
- __ push(a0); |
- __ CallRuntime(RuntimeFunction(), 1); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ push(a0); |
+ __ CallRuntime(RuntimeFunction(), 1); |
+ } |
__ ldc1(f4, FieldMemOperand(v0, HeapNumber::kValueOffset)); |
__ Ret(); |
@@ -3299,14 +3304,15 @@ |
// We return the value in f4 without adding it to the cache, but |
// we cause a scavenging GC so that future allocations will succeed. |
- __ EnterInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
- // Allocate an aligned object larger than a HeapNumber. |
- ASSERT(4 * kPointerSize >= HeapNumber::kSize); |
- __ li(scratch0, Operand(4 * kPointerSize)); |
- __ push(scratch0); |
- __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace); |
- __ LeaveInternalFrame(); |
+ // Allocate an aligned object larger than a HeapNumber. |
+ ASSERT(4 * kPointerSize >= HeapNumber::kSize); |
+ __ li(scratch0, Operand(4 * kPointerSize)); |
+ __ push(scratch0); |
+ __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace); |
+ } |
__ Ret(); |
} |
} |
@@ -3417,10 +3423,13 @@ |
__ push(ra); |
__ PrepareCallCFunction(3, scratch); |
__ SetCallCDoubleArguments(double_base, exponent); |
- __ CallCFunction( |
- ExternalReference::power_double_int_function(masm->isolate()), 3); |
- __ pop(ra); |
- __ GetCFunctionDoubleResult(double_result); |
+ { |
+ AllowExternalCallThatCantCauseGC scope(masm); |
+ __ CallCFunction( |
+ ExternalReference::power_double_int_function(masm->isolate()), 3); |
+ __ pop(ra); |
+ __ GetCFunctionDoubleResult(double_result); |
+ } |
__ sdc1(double_result, |
FieldMemOperand(heapnumber, HeapNumber::kValueOffset)); |
__ mov(v0, heapnumber); |
@@ -3448,10 +3457,13 @@ |
ASSERT(double_base.is(f12)); |
ASSERT(double_exponent.is(f14)); |
__ SetCallCDoubleArguments(double_base, double_exponent); |
- __ CallCFunction( |
- ExternalReference::power_double_double_function(masm->isolate()), 4); |
- __ pop(ra); |
- __ GetCFunctionDoubleResult(double_result); |
+ { |
+ AllowExternalCallThatCantCauseGC scope(masm); |
+ __ CallCFunction( |
+ ExternalReference::power_double_double_function(masm->isolate()), 4); |
+ __ pop(ra); |
+ __ GetCFunctionDoubleResult(double_result); |
+ } |
__ sdc1(double_result, |
FieldMemOperand(heapnumber, HeapNumber::kValueOffset)); |
__ mov(v0, heapnumber); |
@@ -3628,6 +3640,7 @@ |
__ Subu(s1, s1, Operand(kPointerSize)); |
// Enter the exit frame that transitions from JavaScript to C++. |
+ FrameScope scope(masm, StackFrame::MANUAL); |
__ EnterExitFrame(save_doubles_); |
// Setup argc and the builtin function in callee-saved registers. |
@@ -3986,10 +3999,11 @@ |
} |
__ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); |
} else { |
- __ EnterInternalFrame(); |
- __ Push(a0, a1); |
- __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ Push(a0, a1); |
+ __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); |
+ } |
__ mov(a0, v0); |
__ LoadRoot(v0, Heap::kTrueValueRootIndex); |
__ DropAndRet(HasArgsInRegisters() ? 0 : 2, eq, a0, Operand(zero_reg)); |
@@ -6646,12 +6660,13 @@ |
// Call the runtime system in a fresh internal frame. |
ExternalReference miss = ExternalReference(IC_Utility(IC::kCompareIC_Miss), |
masm->isolate()); |
- __ EnterInternalFrame(); |
- __ Push(a1, a0); |
- __ li(t0, Operand(Smi::FromInt(op_))); |
- __ push(t0); |
- __ CallExternalReference(miss, 3); |
- __ LeaveInternalFrame(); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ Push(a1, a0); |
+ __ li(t0, Operand(Smi::FromInt(op_))); |
+ __ push(t0); |
+ __ CallExternalReference(miss, 3); |
+ } |
// Compute the entry point of the rewritten stub. |
__ Addu(a2, v0, Operand(Code::kHeaderSize - kHeapObjectTag)); |
// Restore registers. |
@@ -6867,6 +6882,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. |
// Registers: |
// result: StringDictionary to probe |
// a1: key |