OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 StackFrame* frame() const { | 790 StackFrame* frame() const { |
791 ASSERT(!done()); | 791 ASSERT(!done()); |
792 return frame_; | 792 return frame_; |
793 } | 793 } |
794 | 794 |
795 Isolate* isolate() const { return isolate_; } | 795 Isolate* isolate() const { return isolate_; } |
796 | 796 |
797 bool done() const { return frame_ == NULL; } | 797 bool done() const { return frame_ == NULL; } |
798 void Advance() { (this->*advance_)(); } | 798 void Advance() { (this->*advance_)(); } |
799 | 799 |
| 800 private: |
800 // Go back to the first frame. | 801 // Go back to the first frame. |
801 void Reset(); | 802 void Reset(); |
802 | 803 |
803 private: | |
804 Isolate* isolate_; | 804 Isolate* isolate_; |
805 #define DECLARE_SINGLETON(ignore, type) type type##_; | 805 #define DECLARE_SINGLETON(ignore, type) type type##_; |
806 STACK_FRAME_TYPE_LIST(DECLARE_SINGLETON) | 806 STACK_FRAME_TYPE_LIST(DECLARE_SINGLETON) |
807 #undef DECLARE_SINGLETON | 807 #undef DECLARE_SINGLETON |
808 StackFrame* frame_; | 808 StackFrame* frame_; |
809 StackHandler* handler_; | 809 StackHandler* handler_; |
810 ThreadLocalTop* thread_; | 810 ThreadLocalTop* thread_; |
811 Address fp_; | 811 Address fp_; |
812 Address sp_; | 812 Address sp_; |
813 void (StackFrameIterator::*advance_)(); | 813 void (StackFrameIterator::*advance_)(); |
(...skipping 11 matching lines...) Expand all Loading... |
825 void AdvanceWithHandler(); | 825 void AdvanceWithHandler(); |
826 void AdvanceWithoutHandler(); | 826 void AdvanceWithoutHandler(); |
827 | 827 |
828 friend class StackFrame; | 828 friend class StackFrame; |
829 friend class SafeStackFrameIterator; | 829 friend class SafeStackFrameIterator; |
830 DISALLOW_COPY_AND_ASSIGN(StackFrameIterator); | 830 DISALLOW_COPY_AND_ASSIGN(StackFrameIterator); |
831 }; | 831 }; |
832 | 832 |
833 | 833 |
834 // Iterator that supports iterating through all JavaScript frames. | 834 // Iterator that supports iterating through all JavaScript frames. |
835 template<typename Iterator> | 835 class JavaScriptFrameIterator BASE_EMBEDDED { |
836 class JavaScriptFrameIteratorTemp BASE_EMBEDDED { | |
837 public: | 836 public: |
838 inline explicit JavaScriptFrameIteratorTemp(Isolate* isolate); | 837 inline explicit JavaScriptFrameIterator(Isolate* isolate); |
839 | 838 inline JavaScriptFrameIterator(Isolate* isolate, ThreadLocalTop* top); |
840 inline JavaScriptFrameIteratorTemp(Isolate* isolate, ThreadLocalTop* top); | |
841 | |
842 // Skip frames until the frame with the given id is reached. | 839 // Skip frames until the frame with the given id is reached. |
843 explicit JavaScriptFrameIteratorTemp(StackFrame::Id id) { AdvanceToId(id); } | 840 JavaScriptFrameIterator(Isolate* isolate, StackFrame::Id id); |
844 | |
845 inline JavaScriptFrameIteratorTemp(Isolate* isolate, StackFrame::Id id); | |
846 | |
847 JavaScriptFrameIteratorTemp(Address fp, | |
848 Address sp, | |
849 Address low_bound, | |
850 Address high_bound) : | |
851 iterator_(fp, sp, low_bound, high_bound) { | |
852 if (!done()) Advance(); | |
853 } | |
854 | |
855 JavaScriptFrameIteratorTemp(Isolate* isolate, | |
856 Address fp, | |
857 Address sp, | |
858 Address low_bound, | |
859 Address high_bound) : | |
860 iterator_(isolate, fp, sp, low_bound, high_bound) { | |
861 if (!done()) Advance(); | |
862 } | |
863 | 841 |
864 inline JavaScriptFrame* frame() const; | 842 inline JavaScriptFrame* frame() const; |
865 | 843 |
866 bool done() const { return iterator_.done(); } | 844 bool done() const { return iterator_.done(); } |
867 void Advance(); | 845 void Advance(); |
868 | 846 |
869 // Advance to the frame holding the arguments for the current | 847 // Advance to the frame holding the arguments for the current |
870 // frame. This only affects the current frame if it has adapted | 848 // frame. This only affects the current frame if it has adapted |
871 // arguments. | 849 // arguments. |
872 void AdvanceToArgumentsFrame(); | 850 void AdvanceToArgumentsFrame(); |
873 | 851 |
874 // Go back to the first frame. | |
875 void Reset(); | |
876 | |
877 private: | 852 private: |
878 inline void AdvanceToId(StackFrame::Id id); | 853 StackFrameIterator iterator_; |
879 | |
880 Iterator iterator_; | |
881 }; | 854 }; |
882 | 855 |
883 | 856 |
884 typedef JavaScriptFrameIteratorTemp<StackFrameIterator> JavaScriptFrameIterator; | |
885 | |
886 | |
887 // NOTE: The stack trace frame iterator is an iterator that only | 857 // NOTE: The stack trace frame iterator is an iterator that only |
888 // traverse proper JavaScript frames; that is JavaScript frames that | 858 // traverse proper JavaScript frames; that is JavaScript frames that |
889 // have proper JavaScript functions. This excludes the problematic | 859 // have proper JavaScript functions. This excludes the problematic |
890 // functions in runtime.js. | 860 // functions in runtime.js. |
891 class StackTraceFrameIterator: public JavaScriptFrameIterator { | 861 class StackTraceFrameIterator: public JavaScriptFrameIterator { |
892 public: | 862 public: |
893 StackTraceFrameIterator(); | 863 StackTraceFrameIterator(); |
894 explicit StackTraceFrameIterator(Isolate* isolate); | 864 explicit StackTraceFrameIterator(Isolate* isolate); |
895 void Advance(); | 865 void Advance(); |
896 | 866 |
897 private: | 867 private: |
898 bool IsValidFrame(); | 868 bool IsValidFrame(); |
899 }; | 869 }; |
900 | 870 |
901 | 871 |
902 class SafeStackFrameIterator BASE_EMBEDDED { | 872 class SafeStackFrameIterator BASE_EMBEDDED { |
903 public: | 873 public: |
904 SafeStackFrameIterator(Isolate* isolate, | 874 SafeStackFrameIterator(Isolate* isolate, |
905 Address fp, Address sp, | 875 Address fp, Address sp, |
906 Address low_bound, Address high_bound); | 876 Address low_bound, Address high_bound); |
907 | 877 |
908 StackFrame* frame() const { | 878 StackFrame* frame() const { |
909 ASSERT(is_working_iterator_); | 879 ASSERT(is_working_iterator_); |
910 return iterator_.frame(); | 880 return iterator_.frame(); |
911 } | 881 } |
912 | 882 |
913 bool done() const { return iteration_done_ ? true : iterator_.done(); } | 883 bool done() const { return iteration_done_ ? true : iterator_.done(); } |
914 | 884 |
915 void Advance(); | 885 void Advance(); |
916 void Reset(); | |
917 | 886 |
918 static bool is_active(Isolate* isolate); | 887 static bool is_active(Isolate* isolate); |
919 | 888 |
920 static bool IsWithinBounds( | 889 static bool IsWithinBounds( |
921 Address low_bound, Address high_bound, Address addr) { | 890 Address low_bound, Address high_bound, Address addr) { |
922 return low_bound <= addr && addr <= high_bound; | 891 return low_bound <= addr && addr <= high_bound; |
923 } | 892 } |
924 | 893 |
925 private: | 894 private: |
926 class StackAddressValidator { | 895 class StackAddressValidator { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 ActiveCountMaintainer maintainer_; | 940 ActiveCountMaintainer maintainer_; |
972 StackAddressValidator stack_validator_; | 941 StackAddressValidator stack_validator_; |
973 const bool is_valid_top_; | 942 const bool is_valid_top_; |
974 const bool is_valid_fp_; | 943 const bool is_valid_fp_; |
975 const bool is_working_iterator_; | 944 const bool is_working_iterator_; |
976 bool iteration_done_; | 945 bool iteration_done_; |
977 StackFrameIterator iterator_; | 946 StackFrameIterator iterator_; |
978 }; | 947 }; |
979 | 948 |
980 | 949 |
981 typedef JavaScriptFrameIteratorTemp<SafeStackFrameIterator> | 950 class SafeStackTraceFrameIterator BASE_EMBEDDED { |
982 SafeJavaScriptFrameIterator; | 951 public: |
| 952 SafeStackTraceFrameIterator(Isolate* isolate, |
| 953 Address fp, |
| 954 Address sp, |
| 955 Address low_bound, |
| 956 Address high_bound); |
983 | 957 |
| 958 inline JavaScriptFrame* frame() const; |
984 | 959 |
985 class SafeStackTraceFrameIterator: public SafeJavaScriptFrameIterator { | 960 bool done() const { return iterator_.done(); } |
986 public: | |
987 explicit SafeStackTraceFrameIterator(Isolate* isolate, | |
988 Address fp, Address sp, | |
989 Address low_bound, Address high_bound); | |
990 void Advance(); | 961 void Advance(); |
| 962 |
| 963 private: |
| 964 SafeStackFrameIterator iterator_; |
991 }; | 965 }; |
992 | 966 |
993 | 967 |
994 class StackFrameLocator BASE_EMBEDDED { | 968 class StackFrameLocator BASE_EMBEDDED { |
995 public: | 969 public: |
996 explicit StackFrameLocator(Isolate* isolate) : iterator_(isolate) {} | 970 explicit StackFrameLocator(Isolate* isolate) : iterator_(isolate) {} |
997 | 971 |
998 // Find the nth JavaScript frame on the stack. The caller must | 972 // Find the nth JavaScript frame on the stack. The caller must |
999 // guarantee that such a frame exists. | 973 // guarantee that such a frame exists. |
1000 JavaScriptFrame* FindJavaScriptFrame(int n); | 974 JavaScriptFrame* FindJavaScriptFrame(int n); |
1001 | 975 |
1002 private: | 976 private: |
1003 StackFrameIterator iterator_; | 977 StackFrameIterator iterator_; |
1004 }; | 978 }; |
1005 | 979 |
1006 | 980 |
1007 // Reads all frames on the current stack and copies them into the current | 981 // Reads all frames on the current stack and copies them into the current |
1008 // zone memory. | 982 // zone memory. |
1009 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone); | 983 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone); |
1010 | 984 |
1011 } } // namespace v8::internal | 985 } } // namespace v8::internal |
1012 | 986 |
1013 #endif // V8_FRAMES_H_ | 987 #endif // V8_FRAMES_H_ |
OLD | NEW |