Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index 6a96a5b8cb0c5f31c3e52f705e24b86317763373..4d69bf8b5c04aca8daaecc9e2d82a57b17244be3 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -4337,7 +4337,7 @@ void StackCheckStub::Generate(MacroAssembler* masm) { |
} |
-void CallFunctionStub::FinishCode(Code* code) { |
+void CallFunctionStub::FinishCode(Handle<Code> code) { |
code->set_has_function_cache(RecordCallTarget()); |
} |
@@ -4715,7 +4715,7 @@ void CEntryStub::Generate(MacroAssembler* masm) { |
void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
- Label invoke, exit; |
+ Label invoke, handler_entry, exit; |
Label not_outermost_js, not_outermost_js_2; |
// Setup frame. |
@@ -4748,20 +4748,23 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
__ push(Immediate(Smi::FromInt(StackFrame::INNER_JSENTRY_FRAME))); |
__ bind(&cont); |
- // Call a faked try-block that does the invoke. |
- __ call(&invoke); |
- |
- // Caught exception: Store result (exception) in the pending |
- // exception field in the JSEnv and return a failure sentinel. |
+ // Jump to a faked try block that does the invoke, with a faked catch |
+ // block that sets the pending exception. |
+ __ jmp(&invoke); |
+ __ bind(&handler_entry); |
+ handler_offset_ = handler_entry.pos(); |
+ // Caught exception: Store result (exception) in the pending exception |
+ // field in the JSEnv and return a failure sentinel. |
ExternalReference pending_exception(Isolate::kPendingExceptionAddress, |
masm->isolate()); |
__ mov(Operand::StaticVariable(pending_exception), eax); |
__ mov(eax, reinterpret_cast<int32_t>(Failure::Exception())); |
__ jmp(&exit); |
- // Invoke: Link this frame into the handler chain. |
+ // Invoke: Link this frame into the handler chain. There's only one |
+ // handler block in this code object, so its index is 0. |
__ bind(&invoke); |
- __ PushTryHandler(IN_JS_ENTRY, JS_ENTRY_HANDLER); |
+ __ PushTryHandler(IN_JS_ENTRY, JS_ENTRY_HANDLER, 0); |
// Clear any pending exceptions. |
__ mov(edx, Immediate(masm->isolate()->factory()->the_hole_value())); |
@@ -4770,14 +4773,13 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
// Fake a receiver (NULL). |
__ push(Immediate(0)); // receiver |
- // Invoke the function by calling through JS entry trampoline |
- // builtin and pop the faked function when we return. Notice that we |
- // cannot store a reference to the trampoline code directly in this |
- // stub, because the builtin stubs may not have been generated yet. |
+ // Invoke the function by calling through JS entry trampoline builtin and |
+ // pop the faked function when we return. Notice that we cannot store a |
+ // reference to the trampoline code directly in this stub, because the |
+ // builtin stubs may not have been generated yet. |
if (is_construct) { |
- ExternalReference construct_entry( |
- Builtins::kJSConstructEntryTrampoline, |
- masm->isolate()); |
+ ExternalReference construct_entry(Builtins::kJSConstructEntryTrampoline, |
+ masm->isolate()); |
__ mov(edx, Immediate(construct_entry)); |
} else { |
ExternalReference entry(Builtins::kJSEntryTrampoline, |