# HG changeset patch # User dnsimon # Date 1499193909 25200 # Node ID b1cb90cad7d326f0121906216b6b2791d3111d41 # Parent f739cf1a4ab85aaae7aa8d725b78c4bbf5546897 8183401: compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/NativeCallTest.java fails with The VM does not support the minimum JVMCI API version required by Graal Summary: fix version check in Graal Reviewed-by: kvn, redestad diff -r f739cf1a4ab8 -r b1cb90cad7d3 src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/JVMCIVersionCheck.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/JVMCIVersionCheck.java Tue Jul 04 15:58:15 2017 +0200 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/JVMCIVersionCheck.java Tue Jul 04 11:45:09 2017 -0700 @@ -23,6 +23,7 @@ package org.graalvm.compiler.hotspot; import java.util.Formatter; +import java.util.Objects; /** * Mechanism for checking that the current Java runtime environment supports the minimum JVMCI API @@ -37,10 +38,11 @@ class JVMCIVersionCheck { private static final int JVMCI8_MIN_MAJOR_VERSION = 0; - private static final int JVMCI8_MIN_MINOR_VERSION = 23; + private static final int JVMCI8_MIN_MINOR_VERSION = 26; - // Will be updated once an ea build with the required JVMCI API is available. - private static final int JVMCI9_MIN_EA_BUILD = 143; + // MAX_VALUE indicates that no current EA version is compatible with Graal. + // Note: Keep README.md in sync with the EA version support checked here. + private static final int JVMCI9_MIN_EA_BUILD = 176; private static void failVersionCheck(boolean exit, String reason, Object... args) { Formatter errorMessage = new Formatter().format(reason, args); @@ -77,13 +79,27 @@ start += "-jvmci-".length(); int end = vmVersion.indexOf('.', start); if (end > 0) { - int major = Integer.parseInt(vmVersion.substring(start, end)); + int major; + try { + major = Integer.parseInt(vmVersion.substring(start, end)); + } catch (NumberFormatException e) { + failVersionCheck(exitOnFailure, "The VM does not support the minimum JVMCI API version required by Graal.%n" + + "Cannot read JVMCI major version from java.vm.version property: %s.%n", vmVersion); + return; + } start = end + 1; end = start; while (end < vmVersion.length() && Character.isDigit(vmVersion.charAt(end))) { end++; } - int minor = Integer.parseInt(vmVersion.substring(start, end)); + int minor; + try { + minor = Integer.parseInt(vmVersion.substring(start, end)); + } catch (NumberFormatException e) { + failVersionCheck(exitOnFailure, "The VM does not support the minimum JVMCI API version required by Graal.%n" + + "Cannot read JVMCI minor version from java.vm.version property: %s.%n", vmVersion); + return; + } if (major >= JVMCI8_MIN_MAJOR_VERSION && minor >= JVMCI8_MIN_MINOR_VERSION) { return; } @@ -96,7 +112,7 @@ "Cannot read JVMCI version from java.vm.version property: %s.%n", vmVersion); } else { if (vmVersion.contains("SNAPSHOT")) { - // The snapshot of http://hg.openjdk.java.net/jdk9/hs tip is expected to work + // The snapshot of http://hg.openjdk.java.net/jdk9/dev tip is expected to work return; } if (vmVersion.contains("internal")) { @@ -104,23 +120,36 @@ return; } // http://openjdk.java.net/jeps/223 - // Only support EA builds until GA is available - if (vmVersion.startsWith("9-ea+")) { - int start = "9-ea+".length(); + if (vmVersion.startsWith("9+")) { + int start = "9+".length(); int end = start; end = start; while (end < vmVersion.length() && Character.isDigit(vmVersion.charAt(end))) { end++; } - int build = Integer.parseInt(vmVersion.substring(start, end)); + int build; + try { + build = Integer.parseInt(vmVersion.substring(start, end)); + } catch (NumberFormatException e) { + failVersionCheck(exitOnFailure, "The VM does not support the minimum JVMCI API version required by Graal.%n" + + "Cannot read JDK9 EA build number from java.vm.version property: %s.%n", vmVersion); + return; + } if (build >= JVMCI9_MIN_EA_BUILD) { return; } - failVersionCheck(exitOnFailure, "The VM is an insufficiently recent EA JDK9 build for Graal: %d < %d.%n", build, JVMCI9_MIN_EA_BUILD); + // Using Object.equals suppresses Eclipse's "Dead code" warning. + // Unfortunately @SuppressWarnings("unused") can only be applied at method level. + if (Objects.equals(JVMCI9_MIN_EA_BUILD, Integer.MAX_VALUE)) { + failVersionCheck(exitOnFailure, "This version of Graal is not compatible with any JDK 9 Early Access build.%n"); + } else { + failVersionCheck(exitOnFailure, "The VM is an insufficiently recent EA JDK9 build for Graal: %d < %d.%n", build, JVMCI9_MIN_EA_BUILD); + } return; + } else { + // Graal will be compatible with all JDK versions as of 9 GA + // until a JVMCI API change is made in a 9u or later release. } - failVersionCheck(exitOnFailure, "The VM does not support the minimum JVMCI API version required by Graal.%n" + - "Cannot read JDK9 EA build number from java.vm.version property: %s.%n", vmVersion); } }