| 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
|
|
|