src/java.base/share/classes/jdk/internal/module/ModuleInfo.java
changeset 48203 4fd79561f38f
parent 47216 71c04702a3d5
child 48355 4944950606ef
--- a/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java	Tue Dec 05 16:34:03 2017 +0100
+++ b/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java	Thu Dec 07 16:45:19 2017 +0000
@@ -63,6 +63,9 @@
 
 public final class ModuleInfo {
 
+    private final int JAVA_MIN_SUPPORTED_VERSION = 53;
+    private final int JAVA_MAX_SUPPORTED_VERSION = 54;
+
     private static final JavaLangModuleAccess JLMA
         = SharedSecrets.getJavaLangModuleAccess();
 
@@ -188,8 +191,10 @@
 
         int minor_version = in.readUnsignedShort();
         int major_version = in.readUnsignedShort();
-        if (major_version < 53) {
-            throw invalidModuleDescriptor("Must be >= 53.0");
+        if (major_version < JAVA_MIN_SUPPORTED_VERSION ||
+                major_version > JAVA_MAX_SUPPORTED_VERSION) {
+            throw invalidModuleDescriptor("Unsupported major.minor version "
+                                          + major_version + "." + minor_version);
         }
 
         ConstantPool cpool = new ConstantPool(in);
@@ -245,7 +250,7 @@
             switch (attribute_name) {
 
                 case MODULE :
-                    builder = readModuleAttribute(in, cpool);
+                    builder = readModuleAttribute(in, cpool, major_version);
                     break;
 
                 case MODULE_PACKAGES :
@@ -334,7 +339,7 @@
      * Reads the Module attribute, returning the ModuleDescriptor.Builder to
      * build the corresponding ModuleDescriptor.
      */
-    private Builder readModuleAttribute(DataInput in, ConstantPool cpool)
+    private Builder readModuleAttribute(DataInput in, ConstantPool cpool, int major)
         throws IOException
     {
         // module_name
@@ -390,8 +395,21 @@
                 JLMA.requires(builder, mods, dn, vs);
             }
 
-            if (dn.equals("java.base"))
+            if (dn.equals("java.base")) {
+                if (major >= 54
+                    && (mods.contains(Requires.Modifier.TRANSITIVE)
+                        || mods.contains(Requires.Modifier.STATIC))) {
+                    String flagName;
+                    if (mods.contains(Requires.Modifier.TRANSITIVE)) {
+                        flagName = "ACC_TRANSITIVE";
+                    } else {
+                        flagName = "ACC_STATIC_PHASE";
+                    }
+                    throw invalidModuleDescriptor("The requires entry for java.base"
+                                                  + " has " + flagName + " set");
+                }
                 requiresJavaBase = true;
+            }
         }
         if (mn.equals("java.base")) {
             if (requires_count > 0) {