annotate agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 package sun.jvm.hotspot.ui.classbrowser;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 import java.io.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 import java.util.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 import sun.jvm.hotspot.asm.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 import sun.jvm.hotspot.asm.sparc.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 import sun.jvm.hotspot.asm.x86.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 import sun.jvm.hotspot.asm.ia64.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 import sun.jvm.hotspot.code.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 import sun.jvm.hotspot.compiler.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 import sun.jvm.hotspot.debugger.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 import sun.jvm.hotspot.interpreter.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 import sun.jvm.hotspot.memory.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 import sun.jvm.hotspot.oops.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 import sun.jvm.hotspot.runtime.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 import sun.jvm.hotspot.tools.jcore.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 import sun.jvm.hotspot.types.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 import sun.jvm.hotspot.utilities.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 public class HTMLGenerator implements /* imports */ ClassConstants {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 static class Formatter {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 boolean html;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 StringBuffer buf = new StringBuffer();
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 Formatter(boolean h) {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 html = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 }
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 void append(String s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 buf.append(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 void append(int s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
58 buf.append(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
59 }
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 void append(char s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
62 buf.append(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 void append(StringBuffer s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 buf.append(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
67 }
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 void append(Formatter s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 buf.append(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 StringBuffer getBuffer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
74 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 public String toString() {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 }
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 void wrap(String tag, String text) {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 wrap(tag, tag, text);
a61af66fc99e Initial load
duke
parents:
diff changeset
83 }
a61af66fc99e Initial load
duke
parents:
diff changeset
84 void wrap(String before, String after, String text) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 beginTag(before);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 append(text);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 endTag(after);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // header tags
a61af66fc99e Initial load
duke
parents:
diff changeset
91 void h1(String s) { nl(); wrap("h1", s); nl(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
92 void h2(String s) { nl(); wrap("h2", s); nl(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 void h3(String s) { nl(); wrap("h3", s); nl(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
94 void h4(String s) { nl(); wrap("h4", s); nl(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // list tags
a61af66fc99e Initial load
duke
parents:
diff changeset
97 void beginList() { beginTag("ul"); nl(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
98 void li(String s) { wrap("li", s); nl(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 void endList() { endTag("ul"); nl(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // table tags
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void beginTable(int border) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 beginTag("table border='" + border + "'");
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 void cell(String s) { wrap("td", s); }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void headerCell(String s) { wrap("th", s); }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void endTable() { endTag("table"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 void link(String href, String text) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 wrap("a href='" + href + "'", "a", text);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 void beginTag(String s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 if (html) { append("<"); append(s); append(">"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 void endTag(String s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 if (html) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 append("</"); append(s); append(">");
a61af66fc99e Initial load
duke
parents:
diff changeset
118 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 if (s.equals("table") || s.equals("tr")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
120 nl();
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 if (s.equals("td") || s.equals("th")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 append(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 void bold(String s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
128 wrap("b", s);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void nl() {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 if (!html) buf.append("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void br() {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 if (html) append("<br>");
a61af66fc99e Initial load
duke
parents:
diff changeset
137 else append("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 void genEmptyHTML() {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 if (html) append("<html></html>");
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 void genHTMLPrologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (html) append("<html><body>");
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 void genHTMLPrologue(String title) {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if (html) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 append("<html><head><title>");
a61af66fc99e Initial load
duke
parents:
diff changeset
150 append(title);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 append("</title></head>");
a61af66fc99e Initial load
duke
parents:
diff changeset
152 append("<body>");
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154 h2(title);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 void genHTMLEpilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 if (html) append("</body></html>");
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 private static final String DUMP_KLASS_OUTPUT_DIR = ".";
a61af66fc99e Initial load
duke
parents:
diff changeset
163 private static final int NATIVE_CODE_SIZE = 200;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 private final String spaces;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 private final String tab;
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 private boolean genHTML = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 public HTMLGenerator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 this(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 public HTMLGenerator(boolean html) {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 genHTML = html;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 if (html) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 spaces = "&nbsp;&nbsp;";
a61af66fc99e Initial load
duke
parents:
diff changeset
177 tab = "&nbsp;&nbsp;&nbsp;&nbsp;";
a61af66fc99e Initial load
duke
parents:
diff changeset
178 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 spaces = " ";
a61af66fc99e Initial load
duke
parents:
diff changeset
180 tab = " ";
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 private static CPUHelper cpuHelper;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 static {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 VM.registerVMInitializedObserver(new Observer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 public void update(Observable o, Object data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 });
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 private static synchronized void initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 String cpu = VM.getVM().getCPU();
a61af66fc99e Initial load
duke
parents:
diff changeset
195 if (cpu.equals("sparc")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 cpuHelper = new SPARCHelper();
a61af66fc99e Initial load
duke
parents:
diff changeset
197 } else if (cpu.equals("x86")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 cpuHelper = new X86Helper();
a61af66fc99e Initial load
duke
parents:
diff changeset
199 } else if (cpu.equals("ia64")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 cpuHelper = new IA64Helper();
a61af66fc99e Initial load
duke
parents:
diff changeset
201 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 throw new RuntimeException("cpu '" + cpu + "' is not yet supported!");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 protected static synchronized CPUHelper getCPUHelper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 return cpuHelper;
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 protected String escapeHTMLSpecialChars(String value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 if (!genHTML) return value;
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
214 int len = value.length();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 for (int i=0; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 char c = value.charAt(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 switch (c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 case '<':
a61af66fc99e Initial load
duke
parents:
diff changeset
219 buf.append("&lt;");
a61af66fc99e Initial load
duke
parents:
diff changeset
220 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 case '>':
a61af66fc99e Initial load
duke
parents:
diff changeset
222 buf.append("&gt;");
a61af66fc99e Initial load
duke
parents:
diff changeset
223 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 case '&':
a61af66fc99e Initial load
duke
parents:
diff changeset
225 buf.append("&amp;");
a61af66fc99e Initial load
duke
parents:
diff changeset
226 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
228 buf.append(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 public String genHTMLForMessage(String message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 buf.genHTMLPrologue(message);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
239 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 public String genHTMLErrorMessage(Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 exp.printStackTrace();
a61af66fc99e Initial load
duke
parents:
diff changeset
244 return genHTMLForMessage(exp.getClass().getName() + " : " + exp.getMessage());
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 public String genHTMLForWait(String message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 buf.genHTMLPrologue("Please wait ..");
a61af66fc99e Initial load
duke
parents:
diff changeset
250 buf.h2(message);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 protected String genKlassTitle(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 AccessFlags acc = klass.getAccessFlagsObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
257 if (acc.isPublic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 buf.append("public ");
a61af66fc99e Initial load
duke
parents:
diff changeset
259 } else if (acc.isProtected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 buf.append("protected ");
a61af66fc99e Initial load
duke
parents:
diff changeset
261 } else if (acc.isPrivate()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 buf.append("private ");
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 if (acc.isStatic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 buf.append("static ");
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 if (acc.isAbstract() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 buf.append("abstract ");
a61af66fc99e Initial load
duke
parents:
diff changeset
271 } else if (acc.isFinal()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 buf.append("final ");
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 if (acc.isStrict()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 buf.append("strict ");
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // javac generated flags
a61af66fc99e Initial load
duke
parents:
diff changeset
280 if (acc.isEnum()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 buf.append("[enum] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 if (acc.isSynthetic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 buf.append("[synthetic] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 if (klass.isInterface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 buf.append("interface");
a61af66fc99e Initial load
duke
parents:
diff changeset
289 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 buf.append("class");
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 buf.append(' ');
a61af66fc99e Initial load
duke
parents:
diff changeset
294 buf.append(klass.getName().asString().replace('/', '.'));
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // is it generic?
a61af66fc99e Initial load
duke
parents:
diff changeset
296 Symbol genSig = klass.getGenericSignature();
a61af66fc99e Initial load
duke
parents:
diff changeset
297 if (genSig != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 buf.append(" [signature ");
a61af66fc99e Initial load
duke
parents:
diff changeset
299 buf.append(escapeHTMLSpecialChars(genSig.asString()));
a61af66fc99e Initial load
duke
parents:
diff changeset
300 buf.append("] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
301 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 buf.append(' ');
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 buf.append('@');
a61af66fc99e Initial load
duke
parents:
diff changeset
305 buf.append(klass.getHandle().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
306 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 protected String genBaseHref() {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 return "";
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 protected String genKlassHref(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 return genBaseHref() + "klass=" + klass.getHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 protected String genKlassLink(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 buf.link(genKlassHref(klass), genKlassTitle(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
320 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 protected String genMethodModifierString(AccessFlags acc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 if (acc.isPrivate()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 buf.append("private ");
a61af66fc99e Initial load
duke
parents:
diff changeset
327 } else if (acc.isProtected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 buf.append("protected ");
a61af66fc99e Initial load
duke
parents:
diff changeset
329 } else if (acc.isPublic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 buf.append("public ");
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 if (acc.isStatic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 buf.append("static ");
a61af66fc99e Initial load
duke
parents:
diff changeset
335 } else if (acc.isAbstract() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 buf.append("abstract ");
a61af66fc99e Initial load
duke
parents:
diff changeset
337 } else if (acc.isFinal()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 buf.append("final ");
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 if (acc.isNative()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 buf.append("native ");
a61af66fc99e Initial load
duke
parents:
diff changeset
343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 if (acc.isStrict()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 buf.append("strict ");
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 if (acc.isSynchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 buf.append("synchronized ");
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // javac generated flags
a61af66fc99e Initial load
duke
parents:
diff changeset
354 if (acc.isBridge()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
355 buf.append("[bridge] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if (acc.isSynthetic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 buf.append("[synthetic] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (acc.isVarArgs()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 buf.append("[varargs] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 protected String genMethodNameAndSignature(Method method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 buf.append(genMethodModifierString(method.getAccessFlagsObj()));
a61af66fc99e Initial load
duke
parents:
diff changeset
372 Symbol sig = method.getSignature();
a61af66fc99e Initial load
duke
parents:
diff changeset
373 new SignatureConverter(sig, buf.getBuffer()).iterateReturntype();
a61af66fc99e Initial load
duke
parents:
diff changeset
374 buf.append(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
375 String methodName = method.getName().asString();
a61af66fc99e Initial load
duke
parents:
diff changeset
376 buf.append(escapeHTMLSpecialChars(methodName));
a61af66fc99e Initial load
duke
parents:
diff changeset
377 buf.append('(');
a61af66fc99e Initial load
duke
parents:
diff changeset
378 new SignatureConverter(sig, buf.getBuffer()).iterateParameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
379 buf.append(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // is it generic?
a61af66fc99e Initial load
duke
parents:
diff changeset
381 Symbol genSig = method.getGenericSignature();
a61af66fc99e Initial load
duke
parents:
diff changeset
382 if (genSig != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 buf.append(" [signature ");
a61af66fc99e Initial load
duke
parents:
diff changeset
384 buf.append(escapeHTMLSpecialChars(genSig.asString()));
a61af66fc99e Initial load
duke
parents:
diff changeset
385 buf.append("] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
387 return buf.toString().replace('/', '.');
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 protected String genMethodTitle(Method method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 buf.append(genMethodNameAndSignature(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
393 buf.append(' ');
a61af66fc99e Initial load
duke
parents:
diff changeset
394 buf.append('@');
a61af66fc99e Initial load
duke
parents:
diff changeset
395 buf.append(method.getHandle().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
396 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 protected String genMethodHref(Method m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 return genBaseHref() + "method=" + m.getHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 protected String genMethodLink(Method m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 buf.link(genMethodHref(m), genMethodTitle(m));
a61af66fc99e Initial load
duke
parents:
diff changeset
406 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 protected String genMethodAndKlassLink(Method m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
411 buf.append(genMethodLink(m));
a61af66fc99e Initial load
duke
parents:
diff changeset
412 buf.append(" of ");
a61af66fc99e Initial load
duke
parents:
diff changeset
413 buf.append(genKlassLink((InstanceKlass) m.getMethodHolder()));
a61af66fc99e Initial load
duke
parents:
diff changeset
414 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 protected String genNMethodHref(NMethod nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 return genBaseHref() + "nmethod=" + nm.getAddress();
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 public String genNMethodTitle(NMethod nmethod) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 Method m = nmethod.getMethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 buf.append("Disassembly for compiled method [");
a61af66fc99e Initial load
duke
parents:
diff changeset
426 buf.append(genMethodTitle(m));
a61af66fc99e Initial load
duke
parents:
diff changeset
427 buf.append(" ] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
428 buf.append('@');
a61af66fc99e Initial load
duke
parents:
diff changeset
429 buf.append(nmethod.getAddress().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
430 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 protected String genNMethodLink(NMethod nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
435 buf.link(genNMethodHref(nm), genNMethodTitle(nm));
a61af66fc99e Initial load
duke
parents:
diff changeset
436 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439 public String genCodeBlobTitle(CodeBlob blob) {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 buf.append("Disassembly for code blob " + blob.getName() + " [");
a61af66fc99e Initial load
duke
parents:
diff changeset
442 buf.append(blob.getClass().getName());
a61af66fc99e Initial load
duke
parents:
diff changeset
443 buf.append(" ] @");
a61af66fc99e Initial load
duke
parents:
diff changeset
444 buf.append(blob.getAddress().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
445 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 protected BytecodeDisassembler createBytecodeDisassembler(Method m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 return new BytecodeDisassembler(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 private String genLowHighShort(int val) {
a61af66fc99e Initial load
duke
parents:
diff changeset
453 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
454 buf.append('#');
a61af66fc99e Initial load
duke
parents:
diff changeset
455 buf.append(Integer.toString(val & 0xFFFF));
a61af66fc99e Initial load
duke
parents:
diff changeset
456 buf.append(" #");
a61af66fc99e Initial load
duke
parents:
diff changeset
457 buf.append(Integer.toString((val >> 16) & 0xFFFF));
a61af66fc99e Initial load
duke
parents:
diff changeset
458 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 protected String genHTMLTableForConstantPool(ConstantPool cpool) {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
463 buf.beginTable(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 buf.beginTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
466 buf.headerCell("Index");
a61af66fc99e Initial load
duke
parents:
diff changeset
467 buf.headerCell("Constant Type");
a61af66fc99e Initial load
duke
parents:
diff changeset
468 buf.headerCell("Constant Value");
a61af66fc99e Initial load
duke
parents:
diff changeset
469 buf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 final int length = (int) cpool.getLength();
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // zero'th pool entry is always invalid. ignore it.
a61af66fc99e Initial load
duke
parents:
diff changeset
473 for (int index = 1; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 buf.beginTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
475 buf.cell(Integer.toString(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 int ctag = (int) cpool.getTags().getByteAt((int) index);
a61af66fc99e Initial load
duke
parents:
diff changeset
478 switch (ctag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 case JVM_CONSTANT_Integer:
a61af66fc99e Initial load
duke
parents:
diff changeset
480 buf.cell("JVM_CONSTANT_Integer");
a61af66fc99e Initial load
duke
parents:
diff changeset
481 buf.cell(Integer.toString(cpool.getIntAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
482 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 case JVM_CONSTANT_Float:
a61af66fc99e Initial load
duke
parents:
diff changeset
485 buf.cell("JVM_CONSTANT_Float");
a61af66fc99e Initial load
duke
parents:
diff changeset
486 buf.cell(Float.toString(cpool.getFloatAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
487 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 case JVM_CONSTANT_Long:
a61af66fc99e Initial load
duke
parents:
diff changeset
490 buf.cell("JVM_CONSTANT_Long");
a61af66fc99e Initial load
duke
parents:
diff changeset
491 buf.cell(Long.toString(cpool.getLongAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // long entries occupy two slots
a61af66fc99e Initial load
duke
parents:
diff changeset
493 index++;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 case JVM_CONSTANT_Double:
a61af66fc99e Initial load
duke
parents:
diff changeset
497 buf.cell("JVM_CONSTANT_Double");
a61af66fc99e Initial load
duke
parents:
diff changeset
498 buf.cell(Double.toString(cpool.getDoubleAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // double entries occupy two slots
a61af66fc99e Initial load
duke
parents:
diff changeset
500 index++;
a61af66fc99e Initial load
duke
parents:
diff changeset
501 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 case JVM_CONSTANT_UnresolvedClass:
a61af66fc99e Initial load
duke
parents:
diff changeset
504 buf.cell("JVM_CONSTANT_UnresolvedClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
505 buf.cell(cpool.getSymbolAt(index).asString());
a61af66fc99e Initial load
duke
parents:
diff changeset
506 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 case JVM_CONSTANT_Class:
a61af66fc99e Initial load
duke
parents:
diff changeset
509 buf.cell("JVM_CONSTANT_Class");
a61af66fc99e Initial load
duke
parents:
diff changeset
510 Klass klass = (Klass) cpool.getObjAt(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
511 if (klass instanceof InstanceKlass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 buf.cell(genKlassLink((InstanceKlass) klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
513 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
514 buf.cell(klass.getName().asString().replace('/', '.'));
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 case JVM_CONSTANT_UnresolvedString:
a61af66fc99e Initial load
duke
parents:
diff changeset
519 buf.cell("JVM_CONSTANT_UnresolvedString");
a61af66fc99e Initial load
duke
parents:
diff changeset
520 buf.cell("\"" +
a61af66fc99e Initial load
duke
parents:
diff changeset
521 escapeHTMLSpecialChars(cpool.getSymbolAt(index).asString()) +
a61af66fc99e Initial load
duke
parents:
diff changeset
522 "\"");
a61af66fc99e Initial load
duke
parents:
diff changeset
523 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 case JVM_CONSTANT_Utf8:
a61af66fc99e Initial load
duke
parents:
diff changeset
526 buf.cell("JVM_CONSTANT_Utf8");
a61af66fc99e Initial load
duke
parents:
diff changeset
527 buf.cell("\"" +
a61af66fc99e Initial load
duke
parents:
diff changeset
528 escapeHTMLSpecialChars(cpool.getSymbolAt(index).asString()) +
a61af66fc99e Initial load
duke
parents:
diff changeset
529 "\"");
a61af66fc99e Initial load
duke
parents:
diff changeset
530 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 case JVM_CONSTANT_String:
a61af66fc99e Initial load
duke
parents:
diff changeset
533 buf.cell("JVM_CONSTANT_String");
a61af66fc99e Initial load
duke
parents:
diff changeset
534 buf.cell("\"" +
a61af66fc99e Initial load
duke
parents:
diff changeset
535 escapeHTMLSpecialChars(OopUtilities.stringOopToString(cpool.getObjAt(index))) + "\"");
a61af66fc99e Initial load
duke
parents:
diff changeset
536 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 case JVM_CONSTANT_Fieldref:
a61af66fc99e Initial load
duke
parents:
diff changeset
539 buf.cell("JVM_CONSTANT_Fieldref");
a61af66fc99e Initial load
duke
parents:
diff changeset
540 buf.cell(genLowHighShort(cpool.getIntAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
541 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 case JVM_CONSTANT_Methodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
544 buf.cell("JVM_CONSTANT_Methodref");
a61af66fc99e Initial load
duke
parents:
diff changeset
545 buf.cell(genLowHighShort(cpool.getIntAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
546 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 case JVM_CONSTANT_InterfaceMethodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
549 buf.cell("JVM_CONSTANT_InterfaceMethodref");
a61af66fc99e Initial load
duke
parents:
diff changeset
550 buf.cell(genLowHighShort(cpool.getIntAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
551 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 case JVM_CONSTANT_NameAndType:
a61af66fc99e Initial load
duke
parents:
diff changeset
554 buf.cell("JVM_CONSTANT_NameAndType");
a61af66fc99e Initial load
duke
parents:
diff changeset
555 buf.cell(genLowHighShort(cpool.getIntAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
556 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
557
a61af66fc99e Initial load
duke
parents:
diff changeset
558 case JVM_CONSTANT_ClassIndex:
a61af66fc99e Initial load
duke
parents:
diff changeset
559 buf.cell("JVM_CONSTANT_ClassIndex");
a61af66fc99e Initial load
duke
parents:
diff changeset
560 buf.cell(Integer.toString(cpool.getIntAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
561 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 case JVM_CONSTANT_StringIndex:
a61af66fc99e Initial load
duke
parents:
diff changeset
564 buf.cell("JVM_CONSTANT_StringIndex");
a61af66fc99e Initial load
duke
parents:
diff changeset
565 buf.cell(Integer.toString(cpool.getIntAt(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
566 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569 buf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 buf.endTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
573 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 public String genHTML(ConstantPool cpool) {
a61af66fc99e Initial load
duke
parents:
diff changeset
577 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
579 buf.genHTMLPrologue(genConstantPoolTitle(cpool));
a61af66fc99e Initial load
duke
parents:
diff changeset
580 buf.h3("Holder Class");
a61af66fc99e Initial load
duke
parents:
diff changeset
581 buf.append(genKlassLink((InstanceKlass) cpool.getPoolHolder()));
a61af66fc99e Initial load
duke
parents:
diff changeset
582 buf.h3("Constants");
a61af66fc99e Initial load
duke
parents:
diff changeset
583 buf.append(genHTMLTableForConstantPool(cpool));
a61af66fc99e Initial load
duke
parents:
diff changeset
584 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
585 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
586 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
587 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 protected String genConstantPoolHref(ConstantPool cpool) {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 return genBaseHref() + "cpool=" + cpool.getHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 protected String genConstantPoolTitle(ConstantPool cpool) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
597 buf.append("Constant Pool of [");
a61af66fc99e Initial load
duke
parents:
diff changeset
598 buf.append(genKlassTitle((InstanceKlass) cpool.getPoolHolder()));
a61af66fc99e Initial load
duke
parents:
diff changeset
599 buf.append("] @");
a61af66fc99e Initial load
duke
parents:
diff changeset
600 buf.append(cpool.getHandle().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
601 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 protected String genConstantPoolLink(ConstantPool cpool) {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
606 buf.link(genConstantPoolHref(cpool), genConstantPoolTitle(cpool));
a61af66fc99e Initial load
duke
parents:
diff changeset
607 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 public String genHTML(Method method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
611 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 final Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
613 buf.genHTMLPrologue(genMethodTitle(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 buf.h3("Holder Class");
a61af66fc99e Initial load
duke
parents:
diff changeset
616 buf.append(genKlassLink((InstanceKlass) method.getMethodHolder()));
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 NMethod nmethod = method.getNativeMethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
619 if (nmethod != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 buf.h3("Compiled Code");
a61af66fc99e Initial load
duke
parents:
diff changeset
621 buf.append(genNMethodLink(nmethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 boolean hasThrows = method.hasCheckedExceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
625 ConstantPool cpool = ((InstanceKlass) method.getMethodHolder()).getConstants();
a61af66fc99e Initial load
duke
parents:
diff changeset
626 if (hasThrows) {
a61af66fc99e Initial load
duke
parents:
diff changeset
627 buf.h3("Checked Exception(s)");
a61af66fc99e Initial load
duke
parents:
diff changeset
628 CheckedExceptionElement[] exceptions = method.getCheckedExceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
629 buf.beginTag("ul");
a61af66fc99e Initial load
duke
parents:
diff changeset
630 for (int exp = 0; exp < exceptions.length; exp++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 short cpIndex = (short) exceptions[exp].getClassCPIndex();
a61af66fc99e Initial load
duke
parents:
diff changeset
632 Oop obj = cpool.getObjAt(cpIndex);
a61af66fc99e Initial load
duke
parents:
diff changeset
633 if (obj instanceof Symbol) {
a61af66fc99e Initial load
duke
parents:
diff changeset
634 buf.li(((Symbol)obj).asString().replace('/', '.'));
a61af66fc99e Initial load
duke
parents:
diff changeset
635 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
636 buf.li(genKlassLink((InstanceKlass)obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
639 buf.endTag("ul");
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 if (method.isNative() || method.isAbstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
644 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 buf.h3("Bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
648 BytecodeDisassembler disasm = createBytecodeDisassembler(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
649 final boolean hasLineNumbers = method.hasLineNumberTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
650 disasm.decode(new BytecodeVisitor() {
a61af66fc99e Initial load
duke
parents:
diff changeset
651 private Method method;
a61af66fc99e Initial load
duke
parents:
diff changeset
652 public void prologue(Method m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 method = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 buf.beginTable(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
655 buf.beginTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
656 if (hasLineNumbers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 buf.headerCell("line");
a61af66fc99e Initial load
duke
parents:
diff changeset
658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
659 buf.headerCell("bci" + spaces);
a61af66fc99e Initial load
duke
parents:
diff changeset
660 buf.headerCell("bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
661 buf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
663
a61af66fc99e Initial load
duke
parents:
diff changeset
664 public void visit(Bytecode instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
665 int curBci = instr.bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
666 buf.beginTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
667 if (hasLineNumbers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 int lineNumber = method.getLineNumberFromBCI(curBci);
a61af66fc99e Initial load
duke
parents:
diff changeset
669 buf.cell(Integer.toString(lineNumber) + spaces);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 buf.cell(Integer.toString(curBci) + spaces);
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 buf.beginTag("td");
a61af66fc99e Initial load
duke
parents:
diff changeset
674 String instrStr = escapeHTMLSpecialChars(instr.toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
675
a61af66fc99e Initial load
duke
parents:
diff changeset
676 if (instr instanceof BytecodeNew) {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 BytecodeNew newBytecode = (BytecodeNew) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
678 InstanceKlass klass = newBytecode.getNewKlass();
a61af66fc99e Initial load
duke
parents:
diff changeset
679 if (klass != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
680 buf.link(genKlassHref(klass), instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
681 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
682 buf.append(instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684 } else if(instr instanceof BytecodeInvoke) {
a61af66fc99e Initial load
duke
parents:
diff changeset
685 BytecodeInvoke invokeBytecode = (BytecodeInvoke) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
686 Method m = invokeBytecode.getInvokedMethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
687 if (m != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
688 buf.link(genMethodHref(m), instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
689 buf.append(" of ");
a61af66fc99e Initial load
duke
parents:
diff changeset
690 InstanceKlass klass = (InstanceKlass) m.getMethodHolder();
a61af66fc99e Initial load
duke
parents:
diff changeset
691 buf.link(genKlassHref(klass), genKlassTitle(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
692 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 buf.append(instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
695 } else if (instr instanceof BytecodeGetPut) {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 BytecodeGetPut getPut = (BytecodeGetPut) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 sun.jvm.hotspot.oops.Field f = getPut.getField();
a61af66fc99e Initial load
duke
parents:
diff changeset
698 buf.append(instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if (f != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 InstanceKlass klass = f.getFieldHolder();
a61af66fc99e Initial load
duke
parents:
diff changeset
701 buf.append(" of ");
a61af66fc99e Initial load
duke
parents:
diff changeset
702 buf.link(genKlassHref(klass), genKlassTitle(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
704 } else if (instr instanceof BytecodeLoadConstant) {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 BytecodeLoadConstant ldc = (BytecodeLoadConstant) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 if (ldc.isKlassConstant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
707 Oop oop = ldc.getKlass();
a61af66fc99e Initial load
duke
parents:
diff changeset
708 if (oop instanceof Klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 buf.append("<a href='");
a61af66fc99e Initial load
duke
parents:
diff changeset
710 buf.append(genKlassHref((InstanceKlass) oop));
a61af66fc99e Initial load
duke
parents:
diff changeset
711 buf.append("'>");
a61af66fc99e Initial load
duke
parents:
diff changeset
712 buf.append(instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
713 buf.append("</a>");
a61af66fc99e Initial load
duke
parents:
diff changeset
714 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // unresolved klass literal
a61af66fc99e Initial load
duke
parents:
diff changeset
716 buf.append(instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // not a klass literal
a61af66fc99e Initial load
duke
parents:
diff changeset
720 buf.append(instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
722 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 buf.append(instrStr);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
725 buf.endTag("td");
a61af66fc99e Initial load
duke
parents:
diff changeset
726 buf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 public void epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
730 buf.endTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
732 });
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 // display exception table for this method
a61af66fc99e Initial load
duke
parents:
diff changeset
735 TypeArray exceptionTable = method.getExceptionTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // exception table is 4 tuple array of shorts
a61af66fc99e Initial load
duke
parents:
diff changeset
737 int numEntries = (int)exceptionTable.getLength() / 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
738 if (numEntries != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
739 buf.h4("Exception Table");
a61af66fc99e Initial load
duke
parents:
diff changeset
740 buf.beginTable(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
741 buf.beginTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
742 buf.headerCell("start bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
743 buf.headerCell("end bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
744 buf.headerCell("handler bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
745 buf.headerCell("catch type");
a61af66fc99e Initial load
duke
parents:
diff changeset
746 buf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748 for (int e = 0; e < numEntries; e += 4) {
a61af66fc99e Initial load
duke
parents:
diff changeset
749 buf.beginTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
750 buf.cell(Integer.toString(exceptionTable.getIntAt(e)));
a61af66fc99e Initial load
duke
parents:
diff changeset
751 buf.cell(Integer.toString(exceptionTable.getIntAt(e + 1)));
a61af66fc99e Initial load
duke
parents:
diff changeset
752 buf.cell(Integer.toString(exceptionTable.getIntAt(e + 2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
753 short cpIndex = (short) exceptionTable.getIntAt(e + 3);
a61af66fc99e Initial load
duke
parents:
diff changeset
754 Oop obj = cpIndex == 0? null : cpool.getObjAt(cpIndex);
a61af66fc99e Initial load
duke
parents:
diff changeset
755 if (obj == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
756 buf.cell("Any");
a61af66fc99e Initial load
duke
parents:
diff changeset
757 } else if (obj instanceof Symbol) {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 buf.cell(((Symbol)obj).asString().replace('/', '.'));
a61af66fc99e Initial load
duke
parents:
diff changeset
759 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 buf.cell(genKlassLink((InstanceKlass)obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762 buf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 buf.endTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768 // display constant pool hyperlink
a61af66fc99e Initial load
duke
parents:
diff changeset
769 buf.h3("Constant Pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
770 buf.append(genConstantPoolLink(cpool));
a61af66fc99e Initial load
duke
parents:
diff changeset
771 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
772 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
773 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777
a61af66fc99e Initial load
duke
parents:
diff changeset
778 protected Disassembler createDisassembler(long startPc, byte[] code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
779 return getCPUHelper().createDisassembler(startPc, code);
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782 protected SymbolFinder createSymbolFinder() {
a61af66fc99e Initial load
duke
parents:
diff changeset
783 return new DummySymbolFinder();
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // genHTML for a given address. Address may be a PC or
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // methodOop or klassOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 public String genHTMLForAddress(String addrStr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 return genHTML(parseAddress(addrStr));
a61af66fc99e Initial load
duke
parents:
diff changeset
791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 public String genHTML(sun.jvm.hotspot.debugger.Address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
794 CodeBlob blob = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
797 blob = (CodeBlob)VM.getVM().getCodeCache().findBlobUnsafe(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
798 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // ignore
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801
a61af66fc99e Initial load
duke
parents:
diff changeset
802 if (blob != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
803 if (blob instanceof NMethod) {
a61af66fc99e Initial load
duke
parents:
diff changeset
804 return genHTML((NMethod)blob);
a61af66fc99e Initial load
duke
parents:
diff changeset
805 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // may be interpreter code.
a61af66fc99e Initial load
duke
parents:
diff changeset
807 Interpreter interp = VM.getVM().getInterpreter();
a61af66fc99e Initial load
duke
parents:
diff changeset
808 if (interp.contains(pc)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
809 InterpreterCodelet codelet = interp.getCodeletContaining(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
810 return genHTML(codelet);
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812 return genHTML(blob);
a61af66fc99e Initial load
duke
parents:
diff changeset
813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
814 } else if (VM.getVM().getCodeCache().contains(pc)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 return "Unknown location in the CodeCache: " + pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // did not find nmethod.
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // try methodOop, klassOop and constantPoolOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
820 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
821 Oop obj = getOopAtAddress(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
822 if (obj != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 if (obj instanceof Method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 return genHTML((Method) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
825 } else if (obj instanceof InstanceKlass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
826 return genHTML((InstanceKlass) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
827 } else if (obj instanceof ConstantPool) {
a61af66fc99e Initial load
duke
parents:
diff changeset
828 return genHTML((ConstantPool) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
831 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // ignore
a61af66fc99e Initial load
duke
parents:
diff changeset
833 }
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // didn't find any. do raw disassembly.
a61af66fc99e Initial load
duke
parents:
diff changeset
836 return genHTMLForRawDisassembly(pc, null);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839 protected byte[] readBuffer(sun.jvm.hotspot.debugger.Address addr, int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
840 byte[] buf = new byte[size];
a61af66fc99e Initial load
duke
parents:
diff changeset
841 for (int b = 0; b < size; b++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
842 buf[b] = (byte) addr.getJByteAt(b);
a61af66fc99e Initial load
duke
parents:
diff changeset
843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
844 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 public String genHTMLForRawDisassembly(sun.jvm.hotspot.debugger.Address startPc, int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
849 return genHTMLForRawDisassembly(startPc, null, readBuffer(startPc, size));
a61af66fc99e Initial load
duke
parents:
diff changeset
850 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
854
a61af66fc99e Initial load
duke
parents:
diff changeset
855 protected String genHTMLForRawDisassembly(sun.jvm.hotspot.debugger.Address startPc,
a61af66fc99e Initial load
duke
parents:
diff changeset
856 String prevPCs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
858 return genHTMLForRawDisassembly(startPc, prevPCs, readBuffer(startPc, NATIVE_CODE_SIZE));
a61af66fc99e Initial load
duke
parents:
diff changeset
859 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
860 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864 protected String genPCHref(long targetPc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
865 return genBaseHref() + "pc=0x" + Long.toHexString(targetPc);
a61af66fc99e Initial load
duke
parents:
diff changeset
866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 protected String genMultPCHref(String pcs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
869 StringBuffer buf = new StringBuffer(genBaseHref());
a61af66fc99e Initial load
duke
parents:
diff changeset
870 buf.append("pc_multiple=");
a61af66fc99e Initial load
duke
parents:
diff changeset
871 buf.append(pcs);
a61af66fc99e Initial load
duke
parents:
diff changeset
872 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 protected String genPCHref(long currentPc, sun.jvm.hotspot.asm.Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
876 String href = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 if (addr instanceof PCRelativeAddress) {
a61af66fc99e Initial load
duke
parents:
diff changeset
878 PCRelativeAddress pcRelAddr = (PCRelativeAddress) addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
879 href = genPCHref(currentPc + pcRelAddr.getDisplacement());
a61af66fc99e Initial load
duke
parents:
diff changeset
880 } else if(addr instanceof DirectAddress) {
a61af66fc99e Initial load
duke
parents:
diff changeset
881 href = genPCHref(((DirectAddress) addr).getValue());
a61af66fc99e Initial load
duke
parents:
diff changeset
882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
883
a61af66fc99e Initial load
duke
parents:
diff changeset
884 return href;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 class RawCodeVisitor implements InstructionVisitor {
a61af66fc99e Initial load
duke
parents:
diff changeset
888 private int instrSize = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
889 private Formatter buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
890 private SymbolFinder symFinder = createSymbolFinder();
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 RawCodeVisitor(Formatter buf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 this.buf = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 public int getInstructionSize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
897 return instrSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 public void prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902
a61af66fc99e Initial load
duke
parents:
diff changeset
903 public void visit(long currentPc, Instruction instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 String href = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
905 if (instr.isCall()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
906 CallInstruction call = (CallInstruction) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 sun.jvm.hotspot.asm.Address addr = call.getBranchDestination();
a61af66fc99e Initial load
duke
parents:
diff changeset
908 href = genPCHref(currentPc, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 }
a61af66fc99e Initial load
duke
parents:
diff changeset
910
a61af66fc99e Initial load
duke
parents:
diff changeset
911 instrSize += instr.getSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
912 buf.append("0x");
a61af66fc99e Initial load
duke
parents:
diff changeset
913 buf.append(Long.toHexString(currentPc));
a61af66fc99e Initial load
duke
parents:
diff changeset
914 buf.append(':');
a61af66fc99e Initial load
duke
parents:
diff changeset
915 buf.append(tab);
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 if (href != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
918 buf.link(href, instr.asString(currentPc, symFinder));
a61af66fc99e Initial load
duke
parents:
diff changeset
919 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 buf.append(instr.asString(currentPc, symFinder));
a61af66fc99e Initial load
duke
parents:
diff changeset
921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
922 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 public void epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
927 };
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 protected String genHTMLForRawDisassembly(sun.jvm.hotspot.debugger.Address addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
930 String prevPCs,
a61af66fc99e Initial load
duke
parents:
diff changeset
931 byte[] code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
932 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
933 long startPc = addressToLong(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
934 Disassembler disasm = createDisassembler(startPc, code);
a61af66fc99e Initial load
duke
parents:
diff changeset
935 final Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
936 buf.genHTMLPrologue("Disassembly @0x" + Long.toHexString(startPc));
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 if (prevPCs != null && genHTML) {
a61af66fc99e Initial load
duke
parents:
diff changeset
939 buf.beginTag("p");
a61af66fc99e Initial load
duke
parents:
diff changeset
940 buf.link(genMultPCHref(prevPCs), "show previous code ..");
a61af66fc99e Initial load
duke
parents:
diff changeset
941 buf.endTag("p");
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 buf.h3("Code");
a61af66fc99e Initial load
duke
parents:
diff changeset
946 RawCodeVisitor visitor = new RawCodeVisitor(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
947 disasm.decode(visitor);
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 if (genHTML) buf.beginTag("p");
a61af66fc99e Initial load
duke
parents:
diff changeset
950 Formatter tmpBuf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
951 tmpBuf.append("0x");
a61af66fc99e Initial load
duke
parents:
diff changeset
952 tmpBuf.append(Long.toHexString(startPc + visitor.getInstructionSize()).toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
953 tmpBuf.append(",0x");
a61af66fc99e Initial load
duke
parents:
diff changeset
954 tmpBuf.append(Long.toHexString(startPc));
a61af66fc99e Initial load
duke
parents:
diff changeset
955 if (prevPCs != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
956 tmpBuf.append(',');
a61af66fc99e Initial load
duke
parents:
diff changeset
957 tmpBuf.append(prevPCs);
a61af66fc99e Initial load
duke
parents:
diff changeset
958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
959 if (genHTML) {
a61af66fc99e Initial load
duke
parents:
diff changeset
960 buf.link(genMultPCHref(tmpBuf.toString()), "show more code ..");
a61af66fc99e Initial load
duke
parents:
diff changeset
961 buf.endTag("p");
a61af66fc99e Initial load
duke
parents:
diff changeset
962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
965 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
966 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
967 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
970
a61af66fc99e Initial load
duke
parents:
diff changeset
971 protected String genSafepointInfo(NMethod nm, PCDesc pcDesc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
972 ScopeDesc sd = nm.getScopeDescAt(pcDesc.getRealPC(nm));
a61af66fc99e Initial load
duke
parents:
diff changeset
973 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
974 Formatter tabs = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
975
a61af66fc99e Initial load
duke
parents:
diff changeset
976 buf.beginTag("pre");
a61af66fc99e Initial load
duke
parents:
diff changeset
977 genScope(buf, tabs, sd);
a61af66fc99e Initial load
duke
parents:
diff changeset
978 buf.endTag("pre");
a61af66fc99e Initial load
duke
parents:
diff changeset
979 buf.append(genOopMapInfo(nm, pcDesc));
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 protected void genScope(Formatter buf, Formatter tabs, ScopeDesc sd) {
a61af66fc99e Initial load
duke
parents:
diff changeset
985 if (sd == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
986 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
987 }
a61af66fc99e Initial load
duke
parents:
diff changeset
988
a61af66fc99e Initial load
duke
parents:
diff changeset
989 genScope(buf, tabs, sd.sender());
a61af66fc99e Initial load
duke
parents:
diff changeset
990
a61af66fc99e Initial load
duke
parents:
diff changeset
991 buf.append(tabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
992 Method m = sd.getMethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
993 buf.append(genMethodAndKlassLink(m));
a61af66fc99e Initial load
duke
parents:
diff changeset
994 int bci = sd.getBCI();
a61af66fc99e Initial load
duke
parents:
diff changeset
995 buf.append(" @ bci = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
996 buf.append(Integer.toString(bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 int line = m.getLineNumberFromBCI(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
999 if (line != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 buf.append(", line = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 buf.append(Integer.toString(line));
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 List locals = sd.getLocals();
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 if (locals != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 buf.append(tabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 buf.append(genHTMLForLocals(sd, locals));
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1010
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 List expressions = sd.getExpressions();
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 if (expressions != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 buf.append(tabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 buf.append(genHTMLForExpressions(sd, expressions));
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1017
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 List monitors = sd.getMonitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 if (monitors != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 buf.append(tabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 buf.append(genHTMLForMonitors(sd, monitors));
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 tabs.append(tab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1028
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 protected String genHTMLForOopMap(OopMap map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 final int stack0 = VMRegImpl.getStack0().getValue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 final class OopMapValueIterator {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 final Formatter iterate(OopMapStream oms, String type, boolean printContentReg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 Formatter tmpBuf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 boolean found = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 tmpBuf.beginTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 tmpBuf.beginTag("td");
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 tmpBuf.append(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 tmpBuf.endTag("td");
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 tmpBuf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 for (; ! oms.isDone(); oms.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 OopMapValue omv = oms.getCurrent();
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 if (omv == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 found = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 VMReg vmReg = omv.getReg();
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 int reg = vmReg.getValue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 if (reg < stack0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 tmpBuf.append(VMRegImpl.getRegisterName(vmReg.getValue()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 tmpBuf.append('[');
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 tmpBuf.append(Integer.toString((reg - stack0) * 4));
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 tmpBuf.append(']');
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 if (printContentReg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 tmpBuf.append(" = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 VMReg vmContentReg = omv.getContentReg();
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 int contentReg = vmContentReg.getValue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 tmpBuf.append(VMRegImpl.getRegisterName(vmContentReg.getValue()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 tmpBuf.append(spaces);
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 tmpBuf.endTag("td");
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 tmpBuf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 return found ? tmpBuf : new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 buf.beginTable(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1072
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 OopMapValueIterator omvIterator = new OopMapValueIterator();
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 OopMapStream oms = new OopMapStream(map, OopMapValue.OopTypes.OOP_VALUE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 buf.append(omvIterator.iterate(oms, "Oop:", false));
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 oms = new OopMapStream(map, OopMapValue.OopTypes.VALUE_VALUE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 buf.append(omvIterator.iterate(oms, "Value:", false));
a61af66fc99e Initial load
duke
parents:
diff changeset
1079
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1080 oms = new OopMapStream(map, OopMapValue.OopTypes.NARROWOOP_VALUE);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1081 buf.append(omvIterator.iterate(oms, "Oop:", false));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1082
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 oms = new OopMapStream(map, OopMapValue.OopTypes.CALLEE_SAVED_VALUE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 buf.append(omvIterator.iterate(oms, "Callee saved:", true));
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 oms = new OopMapStream(map, OopMapValue.OopTypes.DERIVED_OOP_VALUE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 buf.append(omvIterator.iterate(oms, "Derived oop:", true));
a61af66fc99e Initial load
duke
parents:
diff changeset
1088
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 buf.endTag("table");
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
a61af66fc99e Initial load
duke
parents:
diff changeset
1093
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 protected String genOopMapInfo(NMethod nmethod, PCDesc pcDesc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 OopMapSet mapSet = nmethod.getOopMaps();
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 int pcOffset = pcDesc.getPCOffset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 OopMap map = mapSet.findMapAtOffset(pcOffset, VM.getVM().isDebugging());
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 if (map == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 throw new IllegalArgumentException("no oopmap at safepoint!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1101
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 return genOopMapInfo(map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 protected String genOopMapInfo(OopMap map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 buf.beginTag("pre");
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 buf.append("OopMap: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 buf.append(genHTMLForOopMap(map));
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 buf.endTag("pre");
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 protected String locationAsString(Location loc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 if (loc.isIllegal()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 buf.append("illegal");
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 Location.Where w = loc.getWhere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 Location.Type type = loc.getType();
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 if (w == Location.Where.ON_STACK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 buf.append("stack[" + loc.getStackOffset() + "]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 } else if (w == Location.Where.IN_REGISTER) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 boolean isFloat = (type == Location.Type.FLOAT_IN_DBL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 type == Location.Type.DBL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 int regNum = loc.getRegisterNumber();
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 VMReg vmReg = new VMReg(regNum);
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 buf.append(VMRegImpl.getRegisterName(vmReg.getValue()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1132
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 buf.append(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 if (type == Location.Type.NORMAL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 buf.append("normal");
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 } else if (type == Location.Type.OOP) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 buf.append("oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 } else if (type == Location.Type.INT_IN_LONG) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 buf.append("int");
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 } else if (type == Location.Type.LNG) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 buf.append("long");
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 } else if (type == Location.Type.FLOAT_IN_DBL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 buf.append("float");
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 } else if (type == Location.Type.DBL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 buf.append("double");
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 } else if (type == Location.Type.ADDR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 buf.append("address");
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 } else if (type == Location.Type.INVALID) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 buf.append("invalid");
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1154
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 private String scopeValueAsString(ScopeValue sv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 if (sv.isConstantInt()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 buf.append("int ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 ConstantIntValue intValue = (ConstantIntValue) sv;
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 buf.append(Integer.toString(intValue.getValue()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 } else if (sv.isConstantLong()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 buf.append("long ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 ConstantLongValue longValue = (ConstantLongValue) sv;
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 buf.append(Long.toString(longValue.getValue()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 buf.append("L");
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 } else if (sv.isConstantDouble()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 buf.append("double ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 ConstantDoubleValue dblValue = (ConstantDoubleValue) sv;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 buf.append(Double.toString(dblValue.getValue()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 buf.append("D");
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 } else if (sv.isConstantOop()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 buf.append("oop ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 ConstantOopReadValue oopValue = (ConstantOopReadValue) sv;
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 OopHandle oopHandle = oopValue.getValue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 if (oopHandle != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 buf.append(oopHandle.toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 buf.append("null");
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 } else if (sv.isLocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 LocationValue lvalue = (LocationValue) sv;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 Location loc = lvalue.getLocation();
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 if (loc != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 buf.append(locationAsString(loc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 buf.append("null");
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 protected String genHTMLForScopeValues(ScopeDesc sd, boolean locals, List values) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 int length = values.size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 buf.append(locals? "locals " : "expressions ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 ScopeValue sv = (ScopeValue) values.get(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 if (sv == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 buf.append('(');
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 if (locals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 Symbol name = sd.getMethod().getLocalVariableName(sd.getBCI(), i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 if (name != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 buf.append("'");
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 buf.append(name.asString());
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 buf.append('\'');
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 buf.append("[");
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 buf.append(Integer.toString(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 buf.append(']');
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 buf.append("[");
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 buf.append(Integer.toString(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 buf.append(']');
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 buf.append(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 buf.append(scopeValueAsString(sv));
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 buf.append(") ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1226
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 protected String genHTMLForLocals(ScopeDesc sd, List locals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 return genHTMLForScopeValues(sd, true, locals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1230
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 protected String genHTMLForExpressions(ScopeDesc sd, List expressions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 return genHTMLForScopeValues(sd, false, expressions);
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 protected String genHTMLForMonitors(ScopeDesc sd, List monitors) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 int length = monitors.size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 buf.append("monitors ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 MonitorValue mv = (MonitorValue) monitors.get(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 if (mv == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 buf.append("(owner = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 ScopeValue owner = mv.owner();
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 if (owner != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 buf.append(scopeValueAsString(owner));
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 buf.append("null");
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 buf.append(", lock = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 Location loc = mv.basicLock();
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 if (loc != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 buf.append(locationAsString(loc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 buf.append("null");
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 buf.append(") ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1263
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 public String genHTML(final NMethod nmethod) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 final Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 buf.genHTMLPrologue(genNMethodTitle(nmethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 buf.h3("Method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 buf.append(genMethodAndKlassLink(nmethod.getMethod()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 buf.h3("Compiled Code");
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 sun.jvm.hotspot.debugger.Address codeBegin = nmethod.codeBegin();
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 sun.jvm.hotspot.debugger.Address codeEnd = nmethod.codeEnd();
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 final int codeSize = (int)codeEnd.minus(codeBegin);
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 final long startPc = addressToLong(codeBegin);
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 final byte[] code = new byte[codeSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 for (int i=0; i < code.length; i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 code[i] = codeBegin.getJByteAt(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 final long verifiedEntryPoint = addressToLong(nmethod.getVerifiedEntryPoint());
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 final long entryPoint = addressToLong(nmethod.getEntryPoint());
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 final Map safepoints = nmethod.getSafepoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
1283
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 final SymbolFinder symFinder = createSymbolFinder();
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 final Disassembler disasm = createDisassembler(startPc, code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 class NMethodVisitor implements InstructionVisitor {
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 boolean prevWasCall;
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 public void prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 prevWasCall = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 public void visit(long currentPc, Instruction instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 String href = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 if (instr.isCall()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 CallInstruction call = (CallInstruction) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 sun.jvm.hotspot.asm.Address addr = call.getBranchDestination();
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 href = genPCHref(currentPc, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1299
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 if (currentPc == verifiedEntryPoint) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 buf.bold("Verified Entry Point"); buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 if (currentPc == entryPoint) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 buf.bold(">Entry Point"); buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1306
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 PCDesc pcDesc = (PCDesc) safepoints.get(longToAddress(currentPc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1308
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 boolean isSafepoint = (pcDesc != null);
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 if (isSafepoint && prevWasCall) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 buf.append(genSafepointInfo(nmethod, pcDesc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1313
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 buf.append("0x");
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 buf.append(Long.toHexString(currentPc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 buf.append(':');
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 buf.append(tab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1318
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 if (href != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 buf.link(href, instr.asString(currentPc, symFinder));
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 buf.append(instr.asString(currentPc, symFinder));
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1324
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 if (isSafepoint && !prevWasCall) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 buf.append(genSafepointInfo(nmethod, pcDesc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1328
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 prevWasCall = instr.isCall();
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1332
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 public void epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1336
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 disasm.decode(new NMethodVisitor());
a61af66fc99e Initial load
duke
parents:
diff changeset
1338
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 sun.jvm.hotspot.debugger.Address stubBegin = nmethod.stubBegin();
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 if (stubBegin != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 sun.jvm.hotspot.debugger.Address stubEnd = nmethod.stubEnd();
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 buf.h3("Stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 long stubStartPc = addressToLong(stubBegin);
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 long stubEndPc = addressToLong(stubEnd);
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 int range = (int) (stubEndPc - stubStartPc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 byte[] stubCode = readBuffer(stubBegin, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 Disassembler disasm2 = createDisassembler(stubStartPc, stubCode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 disasm2.decode(new NMethodVisitor());
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1356
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 public String genHTML(final CodeBlob blob) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 final Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 buf.genHTMLPrologue(genCodeBlobTitle(blob));
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 buf.h3("CodeBlob");
a61af66fc99e Initial load
duke
parents:
diff changeset
1362
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 buf.h3("Compiled Code");
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 final sun.jvm.hotspot.debugger.Address codeBegin = blob.instructionsBegin();
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 final int codeSize = blob.getInstructionsSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 final long startPc = addressToLong(codeBegin);
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 final byte[] code = new byte[codeSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 for (int i=0; i < code.length; i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 code[i] = codeBegin.getJByteAt(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1370
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 final SymbolFinder symFinder = createSymbolFinder();
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 final Disassembler disasm = createDisassembler(startPc, code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 class CodeBlobVisitor implements InstructionVisitor {
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 OopMapSet maps;
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 OopMap curMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 int curMapIndex;
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 long curMapOffset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 public void prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 maps = blob.getOopMaps();
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 if (maps != null && (maps.getSize() > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 curMap = maps.getMapAt(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 if (curMap != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 curMapOffset = curMap.getOffset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1387
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 public void visit(long currentPc, Instruction instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 String href = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 if (instr.isCall()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 CallInstruction call = (CallInstruction) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 sun.jvm.hotspot.asm.Address addr = call.getBranchDestination();
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 href = genPCHref(currentPc, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1395
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 buf.append("0x");
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 buf.append(Long.toHexString(currentPc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 buf.append(':');
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 buf.append(tab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1400
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 if (href != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 buf.link(href, instr.asString(currentPc, symFinder));
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 buf.append(instr.asString(currentPc, symFinder));
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1407
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 // See whether we have an oop map at this PC
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 if (curMap != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 long curOffset = currentPc - startPc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 if (curOffset == curMapOffset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 buf.append(genOopMapInfo(curMap));
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 if (++curMapIndex >= maps.getSize()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 curMap = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 curMap = maps.getMapAt(curMapIndex);
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 if (curMap != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 curMapOffset = curMap.getOffset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1424
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 public void epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1428
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 disasm.decode(new CodeBlobVisitor());
a61af66fc99e Initial load
duke
parents:
diff changeset
1430
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1437
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 protected String genInterpreterCodeletTitle(InterpreterCodelet codelet) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 buf.append("Interpreter codelet [");
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 buf.append(codelet.codeBegin().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 buf.append(',');
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 buf.append(codelet.codeEnd().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 buf.append(") - ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 buf.append(codelet.getDescription());
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 protected String genInterpreterCodeletLinkPageHref(StubQueue stubq) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 return genBaseHref() + "interp_codelets";
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1452
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 public String genInterpreterCodeletLinksPage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 buf.genHTMLPrologue("Interpreter Codelets");
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 buf.beginTag("ul");
a61af66fc99e Initial load
duke
parents:
diff changeset
1457
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 Interpreter interp = VM.getVM().getInterpreter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 StubQueue code = interp.getCode();
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 InterpreterCodelet stub = (InterpreterCodelet) code.getFirst();
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 while (stub != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 buf.beginTag("li");
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 sun.jvm.hotspot.debugger.Address addr = stub.codeBegin();
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 buf.link(genPCHref(addressToLong(addr)), stub.getDescription() + " @" + addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 buf.endTag("li");
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 stub = (InterpreterCodelet) code.getNext(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1468
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 buf.endTag("ul");
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1473
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 public String genHTML(InterpreterCodelet codelet) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 buf.genHTMLPrologue(genInterpreterCodeletTitle(codelet));
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 Interpreter interp = VM.getVM().getInterpreter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 StubQueue stubq = interp.getCode();
a61af66fc99e Initial load
duke
parents:
diff changeset
1479
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 if (genHTML) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 buf.beginTag("h3");
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 buf.link(genInterpreterCodeletLinkPageHref(stubq), "View links for all codelets");
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 buf.endTag("h3");
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 Stub prev = stubq.getPrev(codelet);
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 if (prev != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 if (genHTML) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 buf.beginTag("h3");
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 buf.link(genPCHref(addressToLong(prev.codeBegin())), "View Previous Codelet");
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 buf.endTag("h3");
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 buf.h3("Previous Codelet = 0x" + Long.toHexString(addressToLong(prev.codeBegin())));
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 buf.h3("Code");
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 long stubStartPc = addressToLong(codelet.codeBegin());
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 long stubEndPc = addressToLong(codelet.codeEnd());
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 int range = (int) (stubEndPc - stubStartPc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 byte[] stubCode = readBuffer(codelet.codeBegin(), range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 Disassembler disasm = createDisassembler(stubStartPc, stubCode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 disasm.decode(new RawCodeVisitor(buf));
a61af66fc99e Initial load
duke
parents:
diff changeset
1506
a61af66fc99e Initial load
duke
parents:
diff changeset
1507
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 Stub next = stubq.getNext(codelet);
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 if (next != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 if (genHTML) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 buf.beginTag("h3");
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 buf.link(genPCHref(addressToLong(next.codeBegin())), "View Next Codelet");
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 buf.endTag("h3");
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 buf.h3("Next Codelet = 0x" + Long.toHexString(addressToLong(next.codeBegin())));
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1518
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1522
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 protected String genDumpKlassesTitle(InstanceKlass[] klasses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 return (klasses.length == 1) ? "Create .class for this class"
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 : "Create .class for all classes";
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1527
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 protected String genDumpKlassesHref(InstanceKlass[] klasses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 StringBuffer buf = new StringBuffer(genBaseHref());
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 buf.append("jcore_multiple=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 for (int k = 0; k < klasses.length; k++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 buf.append(klasses[k].getHandle().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 buf.append(',');
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1537
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 protected String genDumpKlassesLink(InstanceKlass[] klasses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 if (!genHTML) return "";
a61af66fc99e Initial load
duke
parents:
diff changeset
1540
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 buf.link(genDumpKlassesHref(klasses), genDumpKlassesTitle(klasses));
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1545
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 public String genHTMLForKlassNames(InstanceKlass[] klasses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 buf.genHTMLPrologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 buf.h3(genDumpKlassesLink(klasses));
a61af66fc99e Initial load
duke
parents:
diff changeset
1551
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 buf.append(genHTMLListForKlassNames(klasses));
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1559
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 protected String genHTMLListForKlassNames(InstanceKlass[] klasses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 final Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 buf.beginTable(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 for (int i = 0; i < klasses.length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 InstanceKlass ik = klasses[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 buf.beginTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 buf.cell(genKlassLink(ik));
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 buf.endTag("tr");
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1569
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 buf.endTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1573
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 public String genHTMLForMethodNames(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 buf.genHTMLPrologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 buf.append(genHTMLListForMethods(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1585
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 protected String genHTMLListForMethods(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 ObjArray methods = klass.getMethods();
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 int numMethods = (int) methods.getLength();
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 if (numMethods != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 buf.h3("Methods");
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 buf.beginTag("ul");
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 for (int m = 0; m < numMethods; m++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 Method mtd = (Method) methods.getObjAt(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 buf.li(genMethodLink(mtd) + ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 buf.endTag("ul");
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1601
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 protected String genHTMLListForInterfaces(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 ObjArray interfaces = klass.getLocalInterfaces();
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 int numInterfaces = (int) interfaces.getLength();
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 if (numInterfaces != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 buf.h3("Interfaces");
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 buf.beginTag("ul");
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 for (int i = 0; i < numInterfaces; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 InstanceKlass inf = (InstanceKlass) interfaces.getObjAt(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 buf.li(genKlassLink(inf));
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 buf.endTag("ul");
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1621
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 protected String genFieldModifierString(AccessFlags acc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 if (acc.isPrivate()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 buf.append("private ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 } else if (acc.isProtected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 buf.append("protected ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 } else if (acc.isPublic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 buf.append("public ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1631
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 if (acc.isStatic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 buf.append("static ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1635
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 if (acc.isFinal()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 buf.append("final ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 if (acc.isVolatile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 buf.append("volatile ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 if (acc.isTransient()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 buf.append("transient ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1645
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 // javac generated flags
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 if (acc.isSynthetic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 buf.append("[synthetic] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1652
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 public String genHTMLForFieldNames(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 buf.genHTMLPrologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 buf.append(genHTMLListForFields(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 } catch (Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1664
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 protected String genHTMLListForFields(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 TypeArray fields = klass.getFields();
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 int numFields = (int) fields.getLength();
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 ConstantPool cp = klass.getConstants();
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 if (numFields != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 buf.h3("Fields");
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 buf.beginList();
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 for (int f = 0; f < numFields; f += InstanceKlass.NEXT_OFFSET) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 int nameIndex = fields.getShortAt(f + InstanceKlass.NAME_INDEX_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 int sigIndex = fields.getShortAt(f + InstanceKlass.SIGNATURE_INDEX_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 int genSigIndex = fields.getShortAt(f + InstanceKlass.GENERIC_SIGNATURE_INDEX_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 Symbol f_name = cp.getSymbolAt(nameIndex);
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 Symbol f_sig = cp.getSymbolAt(sigIndex);
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 Symbol f_genSig = (genSigIndex != 0)? cp.getSymbolAt(genSigIndex) : null;
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 AccessFlags acc = new AccessFlags(fields.getShortAt(f + InstanceKlass.ACCESS_FLAGS_OFFSET));
a61af66fc99e Initial load
duke
parents:
diff changeset
1681
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 buf.beginTag("li");
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 buf.append(genFieldModifierString(acc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 buf.append(' ');
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 Formatter sigBuf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 new SignatureConverter(f_sig, sigBuf.getBuffer()).dispatchField();
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 buf.append(sigBuf.toString().replace('/', '.'));
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 buf.append(' ');
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 buf.append(f_name.asString());
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 buf.append(';');
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 // is it generic?
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 if (f_genSig != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 buf.append(" [signature ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 buf.append(escapeHTMLSpecialChars(f_genSig.asString()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 buf.append("] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 buf.endTag("li");
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 buf.endList();
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1703
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 protected String genKlassHierarchyHref(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 return genBaseHref() + "hierarchy=" + klass.getHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1707
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 protected String genKlassHierarchyTitle(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 buf.append("Class Hierarchy of ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 buf.append(genKlassTitle(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1714
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 protected String genKlassHierarchyLink(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 buf.link(genKlassHierarchyHref(klass), genKlassHierarchyTitle(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1720
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 protected String genHTMLListForSubKlasses(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 Klass subklass = klass.getSubklassKlass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 if (subklass != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 buf.beginList();
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 while (subklass != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 if (subklass instanceof InstanceKlass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 buf.li(genKlassLink((InstanceKlass)subklass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 subklass = subklass.getNextSiblingKlass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 buf.endList();
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1736
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 public String genHTMLForKlassHierarchy(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 buf.genHTMLPrologue(genKlassHierarchyTitle(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1740
a61af66fc99e Initial load
duke
parents:
diff changeset
1741
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 buf.beginTag("pre");
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 buf.append(genKlassLink(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 StringBuffer tabs = new StringBuffer(tab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 InstanceKlass superKlass = klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 while ( (superKlass = (InstanceKlass) superKlass.getSuper()) != null ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 buf.append(tabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 buf.append(genKlassLink(superKlass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 tabs.append(tab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 buf.endTag("pre");
a61af66fc99e Initial load
duke
parents:
diff changeset
1754
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 // generate subklass list
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 Klass subklass = klass.getSubklassKlass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 if (subklass != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 buf.h3("Direct Subclasses");
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 buf.append(genHTMLListForSubKlasses(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1761
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1765
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 protected String genDumpKlassHref(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 return genBaseHref() + "jcore=" + klass.getHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1769
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 protected String genDumpKlassLink(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 if (!genHTML) return "";
a61af66fc99e Initial load
duke
parents:
diff changeset
1772
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 buf.link(genDumpKlassHref(klass), "Create .class File");
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1777
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 public String genHTML(InstanceKlass klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 buf.genHTMLPrologue(genKlassTitle(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 InstanceKlass superKlass = (InstanceKlass) klass.getSuper();
a61af66fc99e Initial load
duke
parents:
diff changeset
1782
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 if (genHTML) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 // super class tree and subclass list
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 buf.beginTag("h3");
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 buf.link(genKlassHierarchyHref(klass), "View Class Hierarchy");
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 buf.endTag("h3");
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1789
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 // jcore - create .class link
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 buf.h3(genDumpKlassLink(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1792
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 // super class
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 if (superKlass != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 buf.h3("Super Class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 buf.append(genKlassLink(superKlass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1798
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 // interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 buf.append(genHTMLListForInterfaces(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1801
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 // fields
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 buf.append(genHTMLListForFields(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1804
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 // methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 buf.append(genHTMLListForMethods(klass));
a61af66fc99e Initial load
duke
parents:
diff changeset
1807
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 // constant pool link
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 buf.h3("Constant Pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 buf.append(genConstantPoolLink(klass.getConstants()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1811
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1815
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 protected sun.jvm.hotspot.debugger.Address parseAddress(String address) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 VM vm = VM.getVM();
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 sun.jvm.hotspot.debugger.Address addr = vm.getDebugger().parseAddress(address);
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 return addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1821
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 protected long addressToLong(sun.jvm.hotspot.debugger.Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 return VM.getVM().getDebugger().getAddressValue(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1825
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 protected sun.jvm.hotspot.debugger.Address longToAddress(long addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 return parseAddress("0x" + Long.toHexString(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1829
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 protected Oop getOopAtAddress(sun.jvm.hotspot.debugger.Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 OopHandle oopHandle = addr.addOffsetToAsOopHandle(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 return VM.getVM().getObjectHeap().newOop(oopHandle);
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1834
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 protected Oop getOopAtAddress(String address) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 sun.jvm.hotspot.debugger.Address addr = parseAddress(address);
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 return getOopAtAddress(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1839
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 private void dumpKlass(InstanceKlass kls) throws IOException {
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 String klassName = kls.getName().asString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 klassName = klassName.replace('/', File.separatorChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 int index = klassName.lastIndexOf(File.separatorChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 File dir = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 if (index != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 String dirName = klassName.substring(0, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 dir = new File(DUMP_KLASS_OUTPUT_DIR, dirName);
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 dir = new File(DUMP_KLASS_OUTPUT_DIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1851
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 dir.mkdirs();
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 File f = new File(dir, klassName.substring(klassName.lastIndexOf(File.separatorChar) + 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 + ".class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 f.createNewFile();
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 FileOutputStream fis = new FileOutputStream(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 ClassWriter cw = new ClassWriter(kls, fis);
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 cw.write();
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1860
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 public String genDumpKlass(InstanceKlass kls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 dumpKlass(kls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 buf.genHTMLPrologue(genKlassTitle(kls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 buf.append(".class created for ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 buf.append(genKlassLink(kls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 } catch(IOException exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 return genHTMLErrorMessage(exp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1874
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 protected String genJavaStackTraceTitle(JavaThread thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 buf.append("Java Stack Trace for ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 buf.append(thread.getThreadName());
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1881
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 public String genHTMLForJavaStackTrace(JavaThread thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 buf.genHTMLPrologue(genJavaStackTraceTitle(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
1885
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 buf.append("Thread state = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 buf.append(thread.getThreadState().toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 buf.beginTag("pre");
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 for (JavaVFrame vf = thread.getLastJavaVFrameDbg(); vf != null; vf = vf.javaSender()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 Method method = vf.getMethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 buf.append(" - ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 buf.append(genMethodLink(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 buf.append(" @bci = " + vf.getBCI());
a61af66fc99e Initial load
duke
parents:
diff changeset
1895
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 int lineNumber = method.getLineNumberFromBCI(vf.getBCI());
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 if (lineNumber != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 buf.append(", line = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 buf.append(lineNumber);
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1901
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 sun.jvm.hotspot.debugger.Address pc = vf.getFrame().getPC();
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 if (pc != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 buf.append(", pc = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 buf.link(genPCHref(addressToLong(pc)), pc.toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1907
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 if (vf.isCompiledFrame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 buf.append(" (Compiled");
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 else if (vf.isInterpretedFrame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 buf.append(" (Interpreted");
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1914
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 if (vf.mayBeImpreciseDbg()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 buf.append("; information may be imprecise");
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 buf.append(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1921
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 buf.endTag("pre");
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1926
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 public String genHTMLForHyperlink(String href) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 if (href.startsWith("klass=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 href = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 Oop obj = getOopAtAddress(href);
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 Assert.that(obj instanceof InstanceKlass, "class= href with improper InstanceKlass!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 return genHTML((InstanceKlass) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 } else if (href.startsWith("method=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 href = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 Oop obj = getOopAtAddress(href);
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 Assert.that(obj instanceof Method, "method= href with improper Method!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 return genHTML((Method) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 } else if (href.startsWith("nmethod=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 String addr = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 Object obj = VMObjectFactory.newObject(NMethod.class, parseAddress(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 Assert.that(obj instanceof NMethod, "nmethod= href with improper NMethod!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 return genHTML((NMethod) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 } else if (href.startsWith("pc=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 String address = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 return genHTML(parseAddress(address));
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 } else if (href.startsWith("pc_multiple=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 int indexOfComma = href.indexOf(',');
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 if (indexOfComma == -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 String firstPC = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 return genHTMLForRawDisassembly(parseAddress(firstPC), null);
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 String firstPC = href.substring(href.indexOf('=') + 1, indexOfComma);
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 return genHTMLForRawDisassembly(parseAddress(firstPC), href.substring(indexOfComma + 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 } else if (href.startsWith("interp_codelets")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 return genInterpreterCodeletLinksPage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 } else if (href.startsWith("hierarchy=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 href = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 Oop obj = getOopAtAddress(href);
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 Assert.that(obj instanceof InstanceKlass, "class= href with improper InstanceKlass!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 return genHTMLForKlassHierarchy((InstanceKlass) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 } else if (href.startsWith("cpool=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 href = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 Oop obj = getOopAtAddress(href);
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 Assert.that(obj instanceof ConstantPool, "cpool= href with improper ConstantPool!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 return genHTML((ConstantPool) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 } else if (href.startsWith("jcore=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 href = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 Oop obj = getOopAtAddress(href);
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 Assert.that(obj instanceof InstanceKlass, "jcore= href with improper InstanceKlass!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 return genDumpKlass((InstanceKlass) obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 } else if (href.startsWith("jcore_multiple=")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 href = href.substring(href.indexOf('=') + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 Formatter buf = new Formatter(genHTML);
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 buf.genHTMLPrologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 StringTokenizer st = new StringTokenizer(href, ",");
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 while (st.hasMoreTokens()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 Oop obj = getOopAtAddress(st.nextToken());
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 Assert.that(obj instanceof InstanceKlass, "jcore_multiple= href with improper InstanceKlass!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1994
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 InstanceKlass kls = (InstanceKlass) obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 try {
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 dumpKlass(kls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 buf.append(".class created for ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 buf.append(genKlassLink(kls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 } catch(Exception exp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 buf.bold("can't .class for " +
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 genKlassTitle(kls) +
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 " : " +
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 exp.getMessage());
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 buf.br();
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2008
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 buf.genHTMLEpilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 return buf.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 Assert.that(false, "unknown href link!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 return null;
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 }