Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index 83b753b591ad07cdb311b13b0c3df369f33b9c69..045ed82650a25acfb669e3225c9aaedfea92b991 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -5077,6 +5077,8 @@ void CEntryStub::Generate(MacroAssembler* masm) { |
// esi: current context (C callee-saved) |
// edi: JS function of the caller (C callee-saved) |
+ ProfileEntryHookStub::MaybeCallEntryHook(masm); |
+ |
// NOTE: Invocations of builtins may return failure objects instead |
// of a proper result. The builtin entry handles this by performing |
// a garbage collection and retrying the builtin (twice). |
@@ -5150,6 +5152,8 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
Label invoke, handler_entry, exit; |
Label not_outermost_js, not_outermost_js_2; |
+ ProfileEntryHookStub::MaybeCallEntryHook(masm); |
+ |
// Set up frame. |
__ push(ebp); |
__ mov(ebp, esp); |
@@ -7691,7 +7695,11 @@ void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { |
void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { |
- if (entry_hook_ != NULL) { |
+ if (masm->isolate()->function_entry_hook() != NULL) { |
+ // It's always safe to call the entry hook stub, as the hook itself |
+ // is not allowed to call back to V8. |
+ AllowStubCallsScope allow_stub_calls(masm, true); |
+ |
ProfileEntryHookStub stub; |
masm->CallStub(&stub); |
} |
@@ -7699,9 +7707,11 @@ void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { |
void ProfileEntryHookStub::Generate(MacroAssembler* masm) { |
- // Ecx is the only volatile register we must save. |
- const int kNumSavedRegisters = 1; |
+ // Save volatile registers. |
+ const int kNumSavedRegisters = 3; |
+ __ push(eax); |
__ push(ecx); |
+ __ push(edx); |
// Calculate and push the original stack pointer. |
__ lea(eax, Operand(esp, (kNumSavedRegisters + 1) * kPointerSize)); |
@@ -7714,12 +7724,16 @@ void ProfileEntryHookStub::Generate(MacroAssembler* masm) { |
__ push(eax); |
// Call the entry hook. |
- int32_t hook_location = reinterpret_cast<int32_t>(&entry_hook_); |
- __ call(Operand(hook_location, RelocInfo::NONE32)); |
+ ASSERT(masm->isolate()->function_entry_hook() != NULL); |
+ __ call(FUNCTION_ADDR(masm->isolate()->function_entry_hook()), |
+ RelocInfo::RUNTIME_ENTRY); |
__ add(esp, Immediate(2 * kPointerSize)); |
// Restore ecx. |
+ __ pop(edx); |
__ pop(ecx); |
+ __ pop(eax); |
+ |
__ ret(0); |
} |