Index: src/x64/code-stubs-x64.cc |
diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc |
index 2001b80d82e47397f98744675ea0b86ad53bffbf..e608a53938882fb77aa5aad3a0928b13995696df 100644 |
--- a/src/x64/code-stubs-x64.cc |
+++ b/src/x64/code-stubs-x64.cc |
@@ -3348,7 +3348,7 @@ void StackCheckStub::Generate(MacroAssembler* masm) { |
} |
-void CallFunctionStub::FinishCode(Code* code) { |
+void CallFunctionStub::FinishCode(Handle<Code> code) { |
code->set_has_function_cache(false); |
} |
@@ -3704,7 +3704,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; |
{ // NOLINT. Scope block confuses linter. |
MacroAssembler::NoRootArrayScope uninitialized_root_register(masm); |
@@ -3764,20 +3764,23 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
__ Push(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, |
isolate); |
__ Store(pending_exception, rax); |
__ movq(rax, Failure::Exception(), RelocInfo::NONE); |
__ 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. |
__ LoadRoot(rax, Heap::kTheHoleValueRootIndex); |
@@ -3786,11 +3789,11 @@ 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. We load the address |
- // from an external reference instead of inlining the call target address |
- // directly in the code, because the builtin stubs may not have been |
- // generated yet at the time this code is generated. |
+ // Invoke the function by calling through JS entry trampoline builtin and |
+ // pop the faked function when we return. We load the address from an |
+ // external reference instead of inlining the call target address directly |
+ // in the code, because the builtin stubs may not have been generated yet |
+ // at the time this code is generated. |
if (is_construct) { |
ExternalReference construct_entry(Builtins::kJSConstructEntryTrampoline, |
isolate); |