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_MIPS) | 9 #if defined(TARGET_ARCH_MIPS) |
10 | 10 |
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 return new Redirection(external_function, call_kind, argument_count); | 649 return new Redirection(external_function, call_kind, argument_count); |
650 } | 650 } |
651 | 651 |
652 static Redirection* FromBreakInstruction(Instr* break_instruction) { | 652 static Redirection* FromBreakInstruction(Instr* break_instruction) { |
653 char* addr_of_break = reinterpret_cast<char*>(break_instruction); | 653 char* addr_of_break = reinterpret_cast<char*>(break_instruction); |
654 char* addr_of_redirection = | 654 char* addr_of_redirection = |
655 addr_of_break - OFFSET_OF(Redirection, break_instruction_); | 655 addr_of_break - OFFSET_OF(Redirection, break_instruction_); |
656 return reinterpret_cast<Redirection*>(addr_of_redirection); | 656 return reinterpret_cast<Redirection*>(addr_of_redirection); |
657 } | 657 } |
658 | 658 |
| 659 static uword FunctionForRedirect(uword address_of_break) { |
| 660 Redirection* current; |
| 661 for (current = list_; current != NULL; current = current->next_) { |
| 662 if (current->address_of_break_instruction() == address_of_break) { |
| 663 return current->external_function_; |
| 664 } |
| 665 } |
| 666 return 0; |
| 667 } |
| 668 |
659 private: | 669 private: |
660 static const int32_t kRedirectInstruction = | 670 static const int32_t kRedirectInstruction = |
661 Instr::kBreakPointInstruction | (Instr::kRedirectCode << kBreakCodeShift); | 671 Instr::kBreakPointInstruction | (Instr::kRedirectCode << kBreakCodeShift); |
662 | 672 |
663 Redirection(uword external_function, | 673 Redirection(uword external_function, |
664 Simulator::CallKind call_kind, | 674 Simulator::CallKind call_kind, |
665 int argument_count) | 675 int argument_count) |
666 : external_function_(external_function), | 676 : external_function_(external_function), |
667 call_kind_(call_kind), | 677 call_kind_(call_kind), |
668 argument_count_(argument_count), | 678 argument_count_(argument_count), |
(...skipping 16 matching lines...) Expand all Loading... |
685 | 695 |
686 uword Simulator::RedirectExternalReference(uword function, | 696 uword Simulator::RedirectExternalReference(uword function, |
687 CallKind call_kind, | 697 CallKind call_kind, |
688 int argument_count) { | 698 int argument_count) { |
689 Redirection* redirection = | 699 Redirection* redirection = |
690 Redirection::Get(function, call_kind, argument_count); | 700 Redirection::Get(function, call_kind, argument_count); |
691 return redirection->address_of_break_instruction(); | 701 return redirection->address_of_break_instruction(); |
692 } | 702 } |
693 | 703 |
694 | 704 |
| 705 uword Simulator::FunctionForRedirect(uword redirect) { |
| 706 return Redirection::FunctionForRedirect(redirect); |
| 707 } |
| 708 |
| 709 |
695 // Get the active Simulator for the current isolate. | 710 // Get the active Simulator for the current isolate. |
696 Simulator* Simulator::Current() { | 711 Simulator* Simulator::Current() { |
697 Simulator* simulator = Isolate::Current()->simulator(); | 712 Simulator* simulator = Isolate::Current()->simulator(); |
698 if (simulator == NULL) { | 713 if (simulator == NULL) { |
699 simulator = new Simulator(); | 714 simulator = new Simulator(); |
700 Isolate::Current()->set_simulator(simulator); | 715 Isolate::Current()->set_simulator(simulator); |
701 } | 716 } |
702 return simulator; | 717 return simulator; |
703 } | 718 } |
704 | 719 |
(...skipping 1656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2361 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); | 2376 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); |
2362 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); | 2377 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); |
2363 buf->Longjmp(); | 2378 buf->Longjmp(); |
2364 } | 2379 } |
2365 | 2380 |
2366 } // namespace dart | 2381 } // namespace dart |
2367 | 2382 |
2368 #endif // !defined(HOST_ARCH_MIPS) | 2383 #endif // !defined(HOST_ARCH_MIPS) |
2369 | 2384 |
2370 #endif // defined TARGET_ARCH_MIPS | 2385 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |