Index: src/x64/macro-assembler-x64.cc |
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc |
index 968b459b2b8f06fa05f9a9b0aa24734b8ba78b39..54c299dbfae9894ff96cec5b59fbf835d3a99c57 100644 |
--- a/src/x64/macro-assembler-x64.cc |
+++ b/src/x64/macro-assembler-x64.cc |
@@ -42,6 +42,7 @@ MacroAssembler::MacroAssembler(void* buffer, int size) |
code_object_(Heap::undefined_value()) { |
} |
+ |
void MacroAssembler::TailCallRuntime(ExternalReference const& a, int b) { |
UNIMPLEMENTED(); |
} |
@@ -70,4 +71,46 @@ void MacroAssembler::Set(const Operand& dst, int64_t x) { |
} |
+void MacroAssembler::PushTryHandler(CodeLocation try_location, |
+ HandlerType type) { |
+ // The pc (return address) is already on TOS. |
+ // This code pushes state, code, frame pointer and parameter pointer. |
+ // Check that they are expected next on the stack, int that order. |
+ ASSERT_EQ(StackHandlerConstants::kStateOffset, |
+ StackHandlerConstants::kPCOffset - kPointerSize); |
+ ASSERT_EQ(StackHandlerConstants::kCodeOffset, |
+ StackHandlerConstants::kStateOffset - kPointerSize); |
+ ASSERT_EQ(StackHandlerConstants::kFPOffset, |
+ StackHandlerConstants::kCodeOffset - kPointerSize); |
+ ASSERT_EQ(StackHandlerConstants::kPPOffset, |
+ StackHandlerConstants::kFPOffset - kPointerSize); |
+ |
+ if (try_location == IN_JAVASCRIPT) { |
+ if (type == TRY_CATCH_HANDLER) { |
+ push(Immediate(StackHandler::TRY_CATCH)); |
+ } else { |
+ push(Immediate(StackHandler::TRY_FINALLY)); |
+ } |
+ push(Immediate(Smi::FromInt(StackHandler::kCodeNotPresent))); |
+ push(rbp); |
+ push(rdi); |
+ } else { |
+ ASSERT(try_location == IN_JS_ENTRY); |
+ // The parameter pointer is meaningless here and ebp does not |
+ // point to a JS frame. So we save NULL for both pp and ebp. We |
+ // expect the code throwing an exception to check ebp before |
+ // dereferencing it to restore the context. |
+ push(Immediate(StackHandler::ENTRY)); |
+ push(Immediate(Smi::FromInt(StackHandler::kCodeNotPresent))); |
+ push(Immediate(0)); // NULL frame pointer |
+ push(Immediate(0)); // NULL parameter pointer |
+ } |
+ movq(kScratchRegister, ExternalReference(Top::k_handler_address)); |
+ // Cached TOS. |
+ movq(rax, Operand(kScratchRegister, 0)); |
+ // Link this handler. |
+ movq(Operand(kScratchRegister, 0), rsp); |
+} |
+ |
+ |
} } // namespace v8::internal |