annotate agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java @ 24234:ea6f94ab283b default tip

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