source: trunk/gcc/libjava/gnu/gcj/runtime/StackTrace.java

Last change on this file was 1598, checked in by bird, 21 years ago

This commit was generated by cvs2svn to compensate for changes in r1597,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 5.3 KB
Line 
1/* gnu.gcj.runtime.StackTrace -- VM support methods for walking the
2 stack.
3 Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
4
5This file is part of GNU Classpath.
6
7GNU Classpath is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU Classpath is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Classpath; see the file COPYING. If not, write to the
19Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
2002111-1307 USA.
21
22Linking this library statically or dynamically with other modules is
23making a combined work based on this library. Thus, the terms and
24conditions of the GNU General Public License cover the whole
25combination.
26
27As a special exception, the copyright holders of this library give you
28permission to link this library with independent modules to produce an
29executable, regardless of the license terms of these independent
30modules, and to copy and distribute the resulting executable under
31terms of your choice, provided that you also meet, for each linked
32independent module, the terms and conditions of the license of that
33module. An independent module is a module which is not derived from
34or based on this library. If you modify this library, you may extend
35this exception to your version of the library, but you are not
36obligated to do so. If you do not wish to do so, delete this
37exception statement from your version. */
38
39package gnu.gcj.runtime;
40
41import gnu.gcj.RawData;
42import java.util.TreeMap;
43import java.util.IdentityHashMap;
44import java.util.SortedMap;
45import gnu.gcj.runtime.NameFinder;
46import java.util.NoSuchElementException;
47
48/**
49 * VM dependent state and support methods for walking the stack.
50 * <p>
51 * This is the version used by libgcj (http://gcc.gnu.org/java/).
52 *
53 * @author Mark Wielaard (mark@klomp.org)
54 * @author Andrew Haley (aph@redhat.com)
55 */
56public final class StackTrace
57{
58 /**
59 * Fill in the stack trace with the top n frames on current
60 * execution stack. Can return null if the VM does not support
61 * capturing the VM execution state.
62 *
63 * @see Throwable#fillInStackTrace()
64 */
65 public StackTrace(int n)
66 {
67 fillInStackTrace(n, 1);
68 }
69
70 /**
71 * Fill in the stack trace with state of the entire execution stack,
72 * starting from frame <code>offset</code>. Can return null if the
73 * VM does not support capturing the VM execution state.
74 *
75 * This can be very expensive. If you only want part of the stack,
76 * see <code>Throwable.fillInStackTrace(int)</code>
77 *
78 * @see Throwable#fillInStackTrace()
79 */
80 public StackTrace()
81 {
82 int n = 64;
83
84 do
85 {
86 n *= 4;
87 fillInStackTrace(n, 1);
88 }
89 while (len >= n);
90 }
91
92 /**
93 * Return the class containing the execution point represented by
94 * the Nth frame down the stack. The zeroth frame represents the
95 * top of the stack, which is the method that called classAt().
96 *
97 * If the Nth frame down the stack was not create by a method
98 * invocation, return null.
99 *
100 * It is not necessary to call <code>fillInStackTrace()</code> with
101 * a size greater than N before calling this method; if the current
102 * stack trace is insufficiently large, it will be expanded as
103 * required. This requires some caution if
104 * <code>fillInStackTrace()</code> is called from a different
105 * invocation to the one that calls <code>classAt()</code>.
106 * classAt() will not call <code>fillInStackTrace()</code> unless N
107 * is greater than the current length.
108 *
109 */
110 public native Class classAt(int n);
111
112 /**
113 * Return the name of the method containing the execution point
114 * represented by the Nth frame down the stack. The zeroth frame
115 * represents the top of the stack, which is the method that called
116 * classAt().
117 *
118 * If the Nth frame down the stack was not create by a method
119 * invocation, return null.
120 *
121 * It is not necessary to call <code>fillInStackTrace()</code> with
122 * a size greater than N before calling this method; if the current
123 * stack trace is insufficiently large, it will be expanded as
124 * required. This requires some caution if
125 * <code>fillInStackTrace()</code> is called from a different
126 * invocation to the one that calls <code>classAt()</code>.
127 * classAt() will not call <code>fillInStackTrace()</code> unless N
128 * is greater than the current length.
129 *
130 */
131 public native String methodAt(int n);
132
133 /**
134 * Return the length of this stack trace.
135 *
136 */
137 public int length ()
138 {
139 return len;
140 }
141
142 private static native void update();
143 private static MethodRef methodAtAddress(RawData addr)
144 {
145 update();
146 synchronized (map)
147 {
148 return (MethodRef) map.get (addr);
149 }
150 }
151
152 gnu.gcj.RawData stackTraceAddrs()
153 {
154 return addrs;
155 }
156
157 private native void fillInStackTrace(int n, int offset);
158 protected native void finalize();
159
160 private static native MethodRef getCompiledMethodRef(RawData addr);
161 private static IdentityHashMap map = new IdentityHashMap();
162
163 private gnu.gcj.RawData addrs;
164 private int len;
165}
Note: See TracBrowser for help on using the repository browser.