Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/hotspot/jtreg/vmTestbase/vm/runtime/defmeth/shared/Printer.java
41161 views
1
/*
2
* Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
package vm.runtime.defmeth.shared;
25
26
import java.util.List;
27
import java.util.ArrayList;
28
import static jdk.internal.org.objectweb.asm.Opcodes.*;
29
30
import vm.runtime.defmeth.shared.data.*;
31
import vm.runtime.defmeth.shared.data.method.*;
32
import vm.runtime.defmeth.shared.data.method.body.*;
33
import vm.runtime.defmeth.shared.data.method.param.*;
34
import vm.runtime.defmeth.shared.data.method.result.*;
35
36
import static java.lang.String.*;
37
import nsk.share.Pair;
38
39
40
/**
41
* Construct text representation of a class.
42
* Used to print generated class hierarchies.
43
*/
44
public class Printer implements Visitor {
45
46
private StringBuilder sb = new StringBuilder();
47
private Tester t;
48
49
private String output() {
50
return sb.toString();
51
}
52
53
static private String printAcc(int acc) {
54
List<String> flags = new ArrayList<>();
55
if ((acc & ACC_STATIC) != 0) {
56
flags.add("static");
57
}
58
if ((acc & ACC_PUBLIC) != 0) {
59
flags.add("public");
60
}
61
if ((acc & ACC_PRIVATE) != 0) {
62
flags.add("private");
63
}
64
if ((acc & ACC_PROTECTED) != 0) {
65
flags.add("protected");
66
}
67
if ((acc & ACC_PUBLIC) == 0 &&
68
(acc & ACC_PRIVATE) == 0 &&
69
(acc & ACC_PROTECTED) == 0) {
70
flags.add("package");
71
}
72
if ((acc & ACC_SYNCHRONIZED) != 0) {
73
flags.add("synchronized");
74
}
75
return Util.intersperse(" ", flags.toArray(new String[0]));
76
}
77
78
static public String print(Clazz clz) {
79
Printer p = new Printer();
80
clz.visit(p);
81
return p.output();
82
}
83
84
static public String print(Method m) {
85
Printer p = new Printer();
86
m.visit(p);
87
return p.output();
88
}
89
90
@Override
91
public void visitClass(Clazz clz) {
92
throw new IllegalStateException("More specific method should be called");
93
}
94
95
@Override
96
public void visitMethod(Method m) {
97
sb.append(String.format(
98
"%s%s",
99
m.name(), m.desc()));
100
101
if (m.sig() != null) {
102
sb.append("/* <").append(m.sig()).append("> */");
103
}
104
}
105
106
@Override
107
public void visitConcreteClass(ConcreteClass clz) {
108
sb.append("class ").append(clz.name()).append(" ");
109
110
if (!clz.parent().name().equals("java.lang.Object")) {
111
sb.append("extends ").append(clz.parent().name()).append(" ");
112
}
113
114
if (clz.interfaces().length > 0) {
115
sb.append("implements ");
116
sb.append(Util.intersperse(", ", Util.asStrings(clz.interfaces())));
117
sb.append(" ");
118
}
119
120
Method[] methods = clz.methods();
121
122
sb.append("{");
123
if (methods.length > 0) {
124
for (Method m : methods) {
125
sb.append("\n ");
126
m.visit(this);
127
}
128
sb.append("\n");
129
}
130
sb.append("}");
131
}
132
133
@Override
134
public void visitInterface(Interface intf) {
135
sb.append("interface ").append(intf.name())
136
.append(" ");
137
138
if (intf.parents().length > 0) {
139
sb.append("extends ");
140
sb.append(Util.intersperse(", ", Util.asStrings(intf.parents())));
141
sb.append(" ");
142
}
143
144
Method[] methods = intf.methods();
145
146
sb.append("{");
147
if (methods.length > 0) {
148
for (Method m : methods) {
149
sb.append("\n ");
150
m.visit(this);
151
}
152
sb.append("\n");
153
}
154
sb.append("}");
155
}
156
@Override
157
158
/* ====================================================================== */
159
160
public void visitTester(Tester t) {
161
this.t = t;
162
163
//sb.append(t.name()).append(": ");
164
sb.append("TEST: ");
165
166
//t.getCall().visit(this);
167
CallMethod call = t.getCall();
168
169
// call.receiverClass() is null when a .staticCallSite() invoke is
170
// used. There is a staticClass but no receiverClass.
171
sb.append(format("%s o = new %s(); o.%s%s",
172
call.staticClass().name(),
173
(call.receiverClass() == null ? "" : call.receiverClass().name()),
174
call.methodName(),
175
call.methodDesc()));
176
177
sb.append(" ");
178
179
t.getResult().visit(this);
180
181
this.t = null;
182
}
183
184
/* ====================================================================== */
185
186
@Override
187
public void visitAbstractMethod(AbstractMethod m) {
188
Pair<String[],String> desc = Util.parseDesc(m.desc());
189
190
sb.append(format(
191
"abstract %s %s %s(%s);",
192
printAcc(m.acc()),
193
Util.decodeClassName(desc.second),
194
m.name(),
195
Util.intersperse(", ", desc.first)));
196
197
if (m.sig() != null) {
198
sb.append("<").append(m.sig()).append(">");
199
}
200
}
201
202
@Override
203
public void visitConcreteMethod(ConcreteMethod m) {
204
Pair<String[],String> desc = Util.parseDesc(m.desc());
205
206
sb.append(format(
207
"%s %s %s(%s)",
208
printAcc(m.acc()),
209
Util.decodeClassName(desc.second),
210
m.name(),
211
Util.intersperse(", ", desc.first)));
212
213
if (m.sig() != null) {
214
sb.append("<").append(m.sig()).append(">");
215
}
216
217
sb.append(" ");
218
219
sb.append(" { ");
220
m.body().visit(this);
221
sb.append(" }");
222
}
223
224
@Override
225
public void visitDefaultMethod(DefaultMethod m) {
226
Pair<String[],String> desc = Util.parseDesc(m.desc());
227
228
sb.append(format(
229
"default %s %s %s(%s)",
230
printAcc(m.acc()),
231
Util.decodeClassName(desc.second),
232
m.name(),
233
Util.intersperse(", ", desc.first)));
234
235
if (m.sig() != null) {
236
sb.append("<").append(m.sig()).append(">");
237
}
238
239
sb.append(" { ");
240
m.body().visit(this);
241
sb.append(" }");
242
}
243
244
/* ====================================================================== */
245
246
@Override
247
public void visitThrowExBody(ThrowExBody body) {
248
sb.append(String.format(
249
"throw new %s();", body.getExc().name()));
250
}
251
252
@Override
253
public void visitReturnIntBody(ReturnIntBody body) {
254
sb.append(String.format(
255
"return %d;", body.getValue()));
256
}
257
258
@Override
259
public void visitReturnNullBody(ReturnNullBody body) {
260
sb.append("return null;");
261
}
262
263
@Override
264
public void visitEmptyBody(EmptyBody aThis) {
265
}
266
267
/* ====================================================================== */
268
269
@Override
270
public void visitResultIgnore() {
271
sb.append("/* result ignored */");
272
}
273
274
@Override
275
public void visitResultInt(IntResult res) {
276
sb.append("== ").append(res.getExpected());
277
}
278
279
@Override
280
public void visitResultThrowExc(ThrowExResult res) {
281
sb.append(String.format(
282
"throws %s%s",
283
abbreviateExcName(res.getExc().name()),
284
res.getMessage() != null ? "(\"" + res.getMessage() + "\")" : ""));
285
}
286
287
private String abbreviateExcName(String name) {
288
switch(name) {
289
case "java.lang.AbstractMethodError" : return "AME";
290
case "java.lang.NoSuchMethodError" : return "NSME";
291
default: return name.replaceAll("java\\.lang\\.", "");
292
}
293
}
294
/* ====================================================================== */
295
296
@Override
297
public void visitParamInt(IntParam param) {
298
sb.append(param.value());
299
}
300
301
@Override
302
public void visitParamString(StringParam param) {
303
sb.append(param.value());
304
}
305
306
@Override
307
public void visitParamNull() {
308
sb.append("null");
309
}
310
@Override
311
public void visitParamLong(LongParam param) {
312
sb.append(param.value());
313
}
314
315
@Override
316
public void visitParamFloat(FloatParam param) {
317
sb.append(param.value());
318
}
319
320
@Override
321
public void visitParamDouble(DoubleParam param) {
322
sb.append(param.value());
323
}
324
325
@Override
326
public void visitParamNewInstance(NewInstanceParam param) {
327
sb.append(String.format(
328
"new %s()",
329
param.clazz().name()));
330
}
331
332
@Override
333
public void visitCallMethod(CallMethod call) {
334
String[] paramTypes = Util.parseDesc(call.methodDesc()).first;
335
336
if (paramTypes.length != call.params().length) {
337
throw new IllegalStateException();
338
}
339
340
//sb.append("{ ");
341
if (!call.popReturnValue()) {
342
sb.append("return ");
343
}
344
345
switch (call.invokeInsn()) {
346
case VIRTUAL: case INTERFACE:
347
sb.append(String.format(
348
"((%s)%s).%s(",
349
call.staticClass().name(),
350
call.receiverClass() != null ? call.receiverClass().name() : "this",
351
call.methodName()));
352
break;
353
case STATIC:
354
sb.append(String.format(
355
"%s.%s(",
356
call.staticClass().name(),
357
call.methodName()));
358
break;
359
case SPECIAL:
360
sb.append(String.format(
361
"%s.super.%s(",
362
call.staticClass().name(),
363
call.methodName()));
364
break;
365
default:
366
throw new IllegalStateException();
367
}
368
369
for (int i = 0; i<paramTypes.length; i++) {
370
sb.append(String.format(
371
"(%s)", paramTypes[i]));
372
373
call.params()[i].visit(this);
374
375
if (i+1 < paramTypes.length) {
376
sb.append(", ");
377
}
378
}
379
380
//sb.append("); }");
381
sb.append(");");
382
}
383
384
@Override
385
public void visitReturnNewInstanceBody(ReturnNewInstanceBody body) {
386
sb.append(String.format(
387
"return new %s();",
388
body.getType().name()));
389
}
390
}
391
392