| Index: src/arm/code-stubs-arm.cc
|
| ===================================================================
|
| --- src/arm/code-stubs-arm.cc (revision 8124)
|
| +++ src/arm/code-stubs-arm.cc (working copy)
|
| @@ -846,11 +846,9 @@
|
| __ vmov(d0, r0, r1);
|
| __ vmov(d1, r2, r3);
|
| }
|
| - {
|
| - AllowExternalCallThatCantCauseGC scope(masm);
|
| - __ CallCFunction(
|
| - ExternalReference::double_fp_operation(op, masm->isolate()), 0, 2);
|
| - }
|
| + // Call C routine that may not cause GC or other trouble.
|
| + __ CallCFunction(ExternalReference::double_fp_operation(op, masm->isolate()),
|
| + 0, 2);
|
| // Store answer in the overwritable heap number. Double returned in
|
| // registers r0 and r1 or in d0.
|
| if (masm->use_eabi_hardfloat()) {
|
| @@ -1619,8 +1617,6 @@
|
| // This stub does not handle the inlined cases (Smis, Booleans, undefined).
|
| // The stub returns 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.
|
| // This stub uses VFP3 instructions.
|
| CpuFeatures::Scope scope(VFP3);
|
|
|
| @@ -1886,13 +1882,12 @@
|
| __ jmp(&heapnumber_allocated);
|
|
|
| __ bind(&slow_allocate_heapnumber);
|
| - {
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| - __ push(r0);
|
| - __ CallRuntime(Runtime::kNumberAlloc, 0);
|
| - __ mov(r1, Operand(r0));
|
| - __ pop(r0);
|
| - }
|
| + __ EnterInternalFrame();
|
| + __ push(r0);
|
| + __ CallRuntime(Runtime::kNumberAlloc, 0);
|
| + __ mov(r1, Operand(r0));
|
| + __ pop(r0);
|
| + __ LeaveInternalFrame();
|
|
|
| __ bind(&heapnumber_allocated);
|
| __ ldr(r3, FieldMemOperand(r0, HeapNumber::kMantissaOffset));
|
| @@ -1933,14 +1928,13 @@
|
| __ jmp(&heapnumber_allocated);
|
|
|
| __ bind(&slow_allocate_heapnumber);
|
| - {
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| - __ push(r0); // Push the heap number, not the untagged int32.
|
| - __ CallRuntime(Runtime::kNumberAlloc, 0);
|
| - __ mov(r2, r0); // Move the new heap number into r2.
|
| - // Get the heap number into r0, now that the new heap number is in r2.
|
| - __ pop(r0);
|
| - }
|
| + __ EnterInternalFrame();
|
| + __ push(r0); // Push the heap number, not the untagged int32.
|
| + __ CallRuntime(Runtime::kNumberAlloc, 0);
|
| + __ mov(r2, r0); // Move the new heap number into r2.
|
| + // Get the heap number into r0, now that the new heap number is in r2.
|
| + __ pop(r0);
|
| + __ LeaveInternalFrame();
|
|
|
| // Convert the heap number in r0 to an untagged integer in r1.
|
| // This can't go slow-case because it's the same number we already
|
| @@ -3169,11 +3163,10 @@
|
| __ LoadRoot(r5, Heap::kHeapNumberMapRootIndex);
|
| __ AllocateHeapNumber(r0, scratch0, scratch1, r5, &skip_cache);
|
| __ vstr(d2, FieldMemOperand(r0, HeapNumber::kValueOffset));
|
| - {
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| - __ push(r0);
|
| - __ CallRuntime(RuntimeFunction(), 1);
|
| - }
|
| + __ EnterInternalFrame();
|
| + __ push(r0);
|
| + __ CallRuntime(RuntimeFunction(), 1);
|
| + __ LeaveInternalFrame();
|
| __ vldr(d2, FieldMemOperand(r0, HeapNumber::kValueOffset));
|
| __ Ret();
|
|
|
| @@ -3186,15 +3179,14 @@
|
|
|
| // We return the value in d2 without adding it to the cache, but
|
| // we cause a scavenging GC so that future allocations will succeed.
|
| - {
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| + __ EnterInternalFrame();
|
|
|
| - // Allocate an aligned object larger than a HeapNumber.
|
| - ASSERT(4 * kPointerSize >= HeapNumber::kSize);
|
| - __ mov(scratch0, Operand(4 * kPointerSize));
|
| - __ push(scratch0);
|
| - __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace);
|
| - }
|
| + // Allocate an aligned object larger than a HeapNumber.
|
| + ASSERT(4 * kPointerSize >= HeapNumber::kSize);
|
| + __ mov(scratch0, Operand(4 * kPointerSize));
|
| + __ push(scratch0);
|
| + __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace);
|
| + __ LeaveInternalFrame();
|
| __ Ret();
|
| }
|
| }
|
| @@ -3306,14 +3298,11 @@
|
| __ push(lr);
|
| __ PrepareCallCFunction(1, 1, scratch);
|
| __ SetCallCDoubleArguments(double_base, exponent);
|
| - {
|
| - AllowExternalCallThatCantCauseGC scope(masm);
|
| - __ CallCFunction(
|
| - ExternalReference::power_double_int_function(masm->isolate()),
|
| - 1, 1);
|
| - __ pop(lr);
|
| - __ GetCFunctionDoubleResult(double_result);
|
| - }
|
| + __ CallCFunction(
|
| + ExternalReference::power_double_int_function(masm->isolate()),
|
| + 1, 1);
|
| + __ pop(lr);
|
| + __ GetCFunctionDoubleResult(double_result);
|
| __ vstr(double_result,
|
| FieldMemOperand(heapnumber, HeapNumber::kValueOffset));
|
| __ mov(r0, heapnumber);
|
| @@ -3339,14 +3328,11 @@
|
| __ push(lr);
|
| __ PrepareCallCFunction(0, 2, scratch);
|
| __ SetCallCDoubleArguments(double_base, double_exponent);
|
| - {
|
| - AllowExternalCallThatCantCauseGC scope(masm);
|
| - __ CallCFunction(
|
| - ExternalReference::power_double_double_function(masm->isolate()),
|
| - 0, 2);
|
| - __ pop(lr);
|
| - __ GetCFunctionDoubleResult(double_result);
|
| - }
|
| + __ CallCFunction(
|
| + ExternalReference::power_double_double_function(masm->isolate()),
|
| + 0, 2);
|
| + __ pop(lr);
|
| + __ GetCFunctionDoubleResult(double_result);
|
| __ vstr(double_result,
|
| FieldMemOperand(heapnumber, HeapNumber::kValueOffset));
|
| __ mov(r0, heapnumber);
|
| @@ -3518,7 +3504,6 @@
|
| __ sub(r6, r6, 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.
|
| @@ -3884,11 +3869,10 @@
|
| }
|
| __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION);
|
| } else {
|
| - {
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| - __ Push(r0, r1);
|
| - __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION);
|
| - }
|
| + __ EnterInternalFrame();
|
| + __ Push(r0, r1);
|
| + __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION);
|
| + __ LeaveInternalFrame();
|
| __ cmp(r0, Operand(0));
|
| __ LoadRoot(r0, Heap::kTrueValueRootIndex, eq);
|
| __ LoadRoot(r0, Heap::kFalseValueRootIndex, ne);
|
| @@ -6153,13 +6137,12 @@
|
| // 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(r1, r0);
|
| - __ mov(ip, Operand(Smi::FromInt(op_)));
|
| - __ push(ip);
|
| - __ CallExternalReference(miss, 3);
|
| - }
|
| + __ EnterInternalFrame();
|
| + __ Push(r1, r0);
|
| + __ mov(ip, Operand(Smi::FromInt(op_)));
|
| + __ push(ip);
|
| + __ CallExternalReference(miss, 3);
|
| + __ LeaveInternalFrame();
|
| // Compute the entry point of the rewritten stub.
|
| __ add(r2, r0, Operand(Code::kHeaderSize - kHeapObjectTag));
|
| // Restore registers.
|
| @@ -6340,8 +6323,6 @@
|
|
|
|
|
| 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
|
| // r1: key
|
|
|