src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/AheadOfTimeVerificationPhase.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/AheadOfTimeVerificationPhase.java Thu Mar 28 11:06:00 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/AheadOfTimeVerificationPhase.java Thu Mar 28 19:39:14 2019 +0100
@@ -44,17 +44,21 @@
public class AheadOfTimeVerificationPhase extends VerifyPhase<PhaseContext> {
@Override
- protected boolean verify(StructuredGraph graph, PhaseContext context) {
+ protected void verify(StructuredGraph graph, PhaseContext context) {
for (ConstantNode node : getConstantNodes(graph)) {
if (isIllegalObjectConstant(node)) {
throw new VerificationError("illegal object constant: " + node);
}
}
- return true;
}
public static boolean isIllegalObjectConstant(ConstantNode node) {
- return isObject(node) && !isNullReference(node) && !isInternedString(node) && !isDirectMethodHandle(node) && !isBoundMethodHandle(node);
+ return isObject(node) &&
+ !isNullReference(node) &&
+ !isInternedString(node) &&
+ !isDirectMethodHandle(node) &&
+ !isBoundMethodHandle(node) &&
+ !isVarHandle(node);
}
private static boolean isObject(ConstantNode node) {
@@ -79,6 +83,14 @@
return StampTool.typeOrNull(node).getName().startsWith("Ljava/lang/invoke/BoundMethodHandle");
}
+ private static boolean isVarHandle(ConstantNode node) {
+ if (!isObject(node)) {
+ return false;
+ }
+ String name = StampTool.typeOrNull(node).getName();
+ return name.equals("Ljava/lang/invoke/VarHandle$AccessDescriptor;");
+ }
+
private static boolean isInternedString(ConstantNode node) {
if (!isObject(node)) {
return false;