1 diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java |
|
2 index 88403c3..728297d 100644 |
|
3 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java |
|
4 +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java |
|
5 @@ -138,7 +138,11 @@ public final class ClassfileBytecodeProvider implements BytecodeProvider { |
|
6 return classfile; |
|
7 } |
|
8 |
|
9 - synchronized Class<?> resolveToClass(String descriptor) { |
|
10 + Class<?> resolveToClass(String descriptor) { |
|
11 + return resolveToClass(descriptor, false); |
|
12 + } |
|
13 + |
|
14 + synchronized Class<?> resolveToClass(String descriptor, boolean initialize) { |
|
15 Class<?> c = classes.get(descriptor); |
|
16 if (c == null) { |
|
17 if (descriptor.length() == 1) { |
|
18 @@ -155,7 +159,7 @@ public final class ClassfileBytecodeProvider implements BytecodeProvider { |
|
19 name = descriptor.replace('/', '.'); |
|
20 } |
|
21 try { |
|
22 - c = Class.forName(name, true, loader); |
|
23 + c = Class.forName(name, initialize, loader); |
|
24 classes.put(descriptor, c); |
|
25 } catch (ClassNotFoundException e) { |
|
26 throw new NoClassDefFoundError(descriptor); |
|
27 diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java |
|
28 index 087f78b..bde2dd4 100644 |
|
29 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java |
|
30 +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java |
|
31 @@ -70,8 +70,9 @@ abstract class ClassfileConstant { |
|
32 * @param cp |
|
33 * @param index |
|
34 * @param opcode |
|
35 + * @param initialize |
|
36 */ |
|
37 - public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode) { |
|
38 + public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode, boolean initialize) { |
|
39 } |
|
40 |
|
41 @Override |
|
42 @@ -90,15 +91,19 @@ abstract class ClassfileConstant { |
|
43 } |
|
44 |
|
45 @Override |
|
46 - public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode) { |
|
47 - resolve(cp); |
|
48 + public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode, boolean initialize) { |
|
49 + resolve(cp, initialize); |
|
50 } |
|
51 |
|
52 public ResolvedJavaType resolve(ClassfileConstantPool cp) throws GraalError { |
|
53 + return resolve(cp, false /* initialize */); |
|
54 + } |
|
55 + |
|
56 + public ResolvedJavaType resolve(ClassfileConstantPool cp, boolean initialize) throws GraalError { |
|
57 if (type == null) { |
|
58 String typeDescriptor = cp.get(Utf8.class, nameIndex).value; |
|
59 ClassfileBytecodeProvider context = cp.context; |
|
60 - type = context.metaAccess.lookupJavaType(context.resolveToClass(typeDescriptor)); |
|
61 + type = context.metaAccess.lookupJavaType(context.resolveToClass(typeDescriptor, initialize)); |
|
62 } |
|
63 return type; |
|
64 } |
|
65 @@ -116,8 +121,8 @@ abstract class ClassfileConstant { |
|
66 } |
|
67 |
|
68 @Override |
|
69 - public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode) { |
|
70 - cp.get(ClassRef.class, classIndex).loadReferencedType(cp, classIndex, opcode); |
|
71 + public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode, boolean initialize) { |
|
72 + cp.get(ClassRef.class, classIndex).loadReferencedType(cp, classIndex, opcode, initialize); |
|
73 } |
|
74 } |
|
75 |
|
76 @@ -269,7 +274,7 @@ abstract class ClassfileConstant { |
|
77 } |
|
78 |
|
79 @Override |
|
80 - public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode) { |
|
81 + public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode, boolean initialize) { |
|
82 throw new GraalError("Resolution of " + name + " constant pool entries not supported by " + ClassfileBytecodeProvider.class.getSimpleName()); |
|
83 } |
|
84 } |
|
85 diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java |
|
86 index 218df10..a54779b 100644 |
|
87 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java |
|
88 +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java |
|
89 @@ -133,11 +133,11 @@ class ClassfileConstantPool implements ConstantPool { |
|
90 } |
|
91 |
|
92 @Override |
|
93 - public void loadReferencedType(int index, int opcode) { |
|
94 + public void loadReferencedType(int index, int opcode, boolean initialize) { |
|
95 if (opcode == Bytecodes.INVOKEDYNAMIC) { |
|
96 throw new GraalError("INVOKEDYNAMIC not supported by " + ClassfileBytecodeProvider.class.getSimpleName()); |
|
97 } |
|
98 - entries[index].loadReferencedType(this, index, opcode); |
|
99 + entries[index].loadReferencedType(this, index, opcode, initialize); |
|
100 } |
|
101 |
|
102 @Override |
|