Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index b8b39c94445333c816d03d27fcf38340ab3dc5c5..cc7283b8e38e0e5f6edbe74d247f7f5d1ae5a532 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -2298,8 +2298,7 @@ static int AddressOffset(ExternalReference ref0, ExternalReference ref1) { |
void MacroAssembler::CallApiFunctionAndReturn( |
- ExternalReference function, |
- Address function_address, |
+ Register function_address, |
ExternalReference thunk_ref, |
Register thunk_last_arg, |
int stack_space, |
@@ -2315,7 +2314,26 @@ void MacroAssembler::CallApiFunctionAndReturn( |
ExternalReference::handle_scope_level_address(isolate()), |
next_address); |
- ASSERT(!thunk_last_arg.is(r3)); |
+ ASSERT(function_address.is(r3)); |
+ ASSERT(thunk_last_arg.is(r1) || thunk_last_arg.is(r2)); |
+ |
+ Label profiler_disabled; |
+ Label end_profiler_check; |
+ bool* is_profiling_flag = |
+ isolate()->cpu_profiler()->is_profiling_address(); |
+ STATIC_ASSERT(sizeof(*is_profiling_flag) == 1); |
+ mov(r9, Operand(reinterpret_cast<int32_t>(is_profiling_flag))); |
+ ldrb(r9, MemOperand(r9, 0)); |
+ cmp(r9, Operand(0)); |
+ b(eq, &profiler_disabled); |
+ |
+ // Additional parameter is the address of the actual callback. |
+ mov(r3, Operand(thunk_ref)); |
+ jmp(&end_profiler_check); |
+ |
+ bind(&profiler_disabled); |
+ Move(r3, function_address); |
+ bind(&end_profiler_check); |
// Allocate HandleScope in callee-save registers. |
mov(r9, Operand(next_address)); |
@@ -2334,25 +2352,6 @@ void MacroAssembler::CallApiFunctionAndReturn( |
PopSafepointRegisters(); |
} |
- Label profiler_disabled; |
- Label end_profiler_check; |
- bool* is_profiling_flag = |
- isolate()->cpu_profiler()->is_profiling_address(); |
- STATIC_ASSERT(sizeof(*is_profiling_flag) == 1); |
- mov(r3, Operand(reinterpret_cast<int32_t>(is_profiling_flag))); |
- ldrb(r3, MemOperand(r3, 0)); |
- cmp(r3, Operand(0)); |
- b(eq, &profiler_disabled); |
- |
- // Additional parameter is the address of the actual callback. |
- mov(thunk_last_arg, Operand(reinterpret_cast<int32_t>(function_address))); |
- mov(r3, Operand(thunk_ref)); |
- jmp(&end_profiler_check); |
- |
- bind(&profiler_disabled); |
- mov(r3, Operand(function)); |
- bind(&end_profiler_check); |
- |
// Native call returns to the DirectCEntry stub which redirects to the |
// return address pushed on stack (could have moved after GC). |
// DirectCEntry stub itself is generated early and never moves. |