| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include <setjmp.h> | 5 #include <setjmp.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 | 7 |
| 8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
| 9 #if defined(TARGET_ARCH_ARM) | 9 #if defined(TARGET_ARCH_ARM) |
| 10 | 10 |
| (...skipping 3673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3684 return_value = Utils::LowHighTo64Bits(get_register(R0), get_register(R1)); | 3684 return_value = Utils::LowHighTo64Bits(get_register(R0), get_register(R1)); |
| 3685 } | 3685 } |
| 3686 return return_value; | 3686 return return_value; |
| 3687 } | 3687 } |
| 3688 | 3688 |
| 3689 | 3689 |
| 3690 void Simulator::Longjmp(uword pc, | 3690 void Simulator::Longjmp(uword pc, |
| 3691 uword sp, | 3691 uword sp, |
| 3692 uword fp, | 3692 uword fp, |
| 3693 RawObject* raw_exception, | 3693 RawObject* raw_exception, |
| 3694 RawObject* raw_stacktrace) { | 3694 RawObject* raw_stacktrace, |
| 3695 Isolate* isolate) { |
| 3695 // Walk over all setjmp buffers (simulated --> C++ transitions) | 3696 // Walk over all setjmp buffers (simulated --> C++ transitions) |
| 3696 // and try to find the setjmp associated with the simulated stack pointer. | 3697 // and try to find the setjmp associated with the simulated stack pointer. |
| 3697 SimulatorSetjmpBuffer* buf = last_setjmp_buffer(); | 3698 SimulatorSetjmpBuffer* buf = last_setjmp_buffer(); |
| 3698 while (buf->link() != NULL && buf->link()->sp() <= sp) { | 3699 while (buf->link() != NULL && buf->link()->sp() <= sp) { |
| 3699 buf = buf->link(); | 3700 buf = buf->link(); |
| 3700 } | 3701 } |
| 3701 ASSERT(buf != NULL); | 3702 ASSERT(buf != NULL); |
| 3702 | 3703 |
| 3703 // The C++ caller has not cleaned up the stack memory of C++ frames. | 3704 // The C++ caller has not cleaned up the stack memory of C++ frames. |
| 3704 // Prepare for unwinding frames by destroying all the stack resources | 3705 // Prepare for unwinding frames by destroying all the stack resources |
| 3705 // in the previous C++ frames. | 3706 // in the previous C++ frames. |
| 3706 uword native_sp = buf->native_sp(); | 3707 uword native_sp = buf->native_sp(); |
| 3707 Isolate* isolate = Isolate::Current(); | |
| 3708 while (isolate->top_resource() != NULL && | 3708 while (isolate->top_resource() != NULL && |
| 3709 (reinterpret_cast<uword>(isolate->top_resource()) < native_sp)) { | 3709 (reinterpret_cast<uword>(isolate->top_resource()) < native_sp)) { |
| 3710 isolate->top_resource()->~StackResource(); | 3710 isolate->top_resource()->~StackResource(); |
| 3711 } | 3711 } |
| 3712 | 3712 |
| 3713 // Unwind the C++ stack and continue simulation in the target frame. | 3713 // Unwind the C++ stack and continue simulation in the target frame. |
| 3714 set_register(PC, static_cast<int32_t>(pc)); | 3714 set_register(PC, static_cast<int32_t>(pc)); |
| 3715 set_register(SP, static_cast<int32_t>(sp)); | 3715 set_register(SP, static_cast<int32_t>(sp)); |
| 3716 set_register(FP, static_cast<int32_t>(fp)); | 3716 set_register(FP, static_cast<int32_t>(fp)); |
| 3717 // Set the tag. |
| 3718 isolate->set_vm_tag(VMTag::kScriptTagId); |
| 3719 // Clear top exit frame. |
| 3720 isolate->set_top_exit_frame_info(0); |
| 3717 | 3721 |
| 3718 ASSERT(raw_exception != Object::null()); | 3722 ASSERT(raw_exception != Object::null()); |
| 3719 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); | 3723 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); |
| 3720 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); | 3724 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); |
| 3721 buf->Longjmp(); | 3725 buf->Longjmp(); |
| 3722 } | 3726 } |
| 3723 | 3727 |
| 3724 } // namespace dart | 3728 } // namespace dart |
| 3725 | 3729 |
| 3726 #endif // !defined(HOST_ARCH_ARM) | 3730 #endif // !defined(HOST_ARCH_ARM) |
| 3727 | 3731 |
| 3728 #endif // defined TARGET_ARCH_ARM | 3732 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |