changeset 39867:67c6a0f59621

javacomp-script, javacomp: Add support for Java 11. * m4/javacomp.m4 (gt_JAVACOMP): Accept source-version 11 and target-version 11. * lib/javaversion.h: Update comments. * lib/javacomp.c (default_target_version, SOURCE_VERSION_BOUND, source_version_index, get_goodcode_snippet, get_failcode_snippet, TARGET_VERSION_BOUND, target_version_index, corresponding_classfile_version): Accept source_version 11 and target_version 11. * lib/javacomp.h: Update comments accordingly.
author Bruno Haible <bruno@clisp.org>
date Wed, 26 Sep 2018 11:21:30 +0200
parents 97ddb1ab5d88
children 9ee2bf01ba7e
files ChangeLog lib/javacomp.c lib/javacomp.h lib/javaversion.h m4/javacomp.m4
diffstat 5 files changed, 52 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Sep 23 14:13:52 2018 +0200
+++ b/ChangeLog	Wed Sep 26 11:21:30 2018 +0200
@@ -1,3 +1,16 @@
+2018-09-26  Bruno Haible  <bruno@clisp.org>
+
+	javacomp-script, javacomp: Add support for Java 11.
+	* m4/javacomp.m4 (gt_JAVACOMP): Accept source-version 11 and
+	target-version 11.
+	* lib/javaversion.h: Update comments.
+	* lib/javacomp.c (default_target_version, SOURCE_VERSION_BOUND,
+	source_version_index, get_goodcode_snippet, get_failcode_snippet,
+	TARGET_VERSION_BOUND, target_version_index,
+	corresponding_classfile_version): Accept source_version 11 and
+	target_version 11.
+	* lib/javacomp.h: Update comments accordingly.
+
 2018-09-23  Bruno Haible  <bruno@clisp.org>
 
 	vasnprintf: Fix heap memory overrun bug.
--- a/lib/javacomp.c	Sun Sep 23 14:13:52 2018 +0200
+++ b/lib/javacomp.c	Wed Sep 26 11:21:30 2018 +0200
@@ -106,7 +106,8 @@
                || (java_version_cache[0] == '9'
                    && java_version_cache[1] == '\0')
                || (java_version_cache[0] == '1'
-                   && java_version_cache[1] == '0'
+                   && (java_version_cache[1] >= '0'
+                       && java_version_cache[1] <= '1')
                    && java_version_cache[2] == '\0')))
         java_version_cache = "1.1";
     }
@@ -116,7 +117,7 @@
 /* ======================= Source version dependent ======================= */
 
 /* Convert a source version to an index.  */
-#define SOURCE_VERSION_BOUND 7 /* exclusive upper bound */
+#define SOURCE_VERSION_BOUND 8 /* exclusive upper bound */
 static unsigned int
 source_version_index (const char *source_version)
 {
@@ -131,9 +132,10 @@
     }
   else if (source_version[0] == '9' && source_version[1] == '\0')
     return 5;
-  else if (source_version[0] == '1' && source_version[1] == '0'
+  else if (source_version[0] == '1'
+           && (source_version[1] >= '0' && source_version[1] <= '1')
            && source_version[2] == '\0')
-    return 6;
+    return source_version[1] - '0' + 6;
   error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
   return 0;
 }
@@ -156,6 +158,8 @@
     return "interface conftest { private void foo () {} }\n";
   if (strcmp (source_version, "10") == 0)
     return "class conftest { public void m() { var i = new Integer(0); } }\n";
+  if (strcmp (source_version, "11") == 0)
+    return "class conftest { Readable r = (var b) -> 0; }\n";
   error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
   return NULL;
 }
@@ -179,6 +183,8 @@
   if (strcmp (source_version, "9") == 0)
     return "class conftestfail { public void m() { var i = new Integer(0); } }\n";
   if (strcmp (source_version, "10") == 0)
+    return "class conftestfail { Readable r = (var b) -> 0; }\n";
+  if (strcmp (source_version, "11") == 0)
     return NULL;
   error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
   return NULL;
@@ -187,7 +193,7 @@
 /* ======================= Target version dependent ======================= */
 
 /* Convert a target version to an index.  */
-#define TARGET_VERSION_BOUND 10 /* exclusive upper bound */
+#define TARGET_VERSION_BOUND 11 /* exclusive upper bound */
 static unsigned int
 target_version_index (const char *target_version)
 {
@@ -197,9 +203,10 @@
     return target_version[2] - '1';
   else if (target_version[0] == '9' && target_version[1] == '\0')
     return 8;
-  else if (target_version[0] == '1' && target_version[1] == '0'
+  else if (target_version[0] == '1'
+           && (target_version[1] >= '0' && target_version[1] <= '1')
            && target_version[2] == '\0')
-    return 9;
+    return target_version[1] - '0' + 9;
   error (EXIT_FAILURE, 0, _("invalid target_version argument to compile_java_class"));
   return 0;
 }
@@ -229,6 +236,8 @@
     return 53;
   if (strcmp (target_version, "10") == 0)
     return 54;
+  if (strcmp (target_version, "11") == 0)
+    return 55;
   error (EXIT_FAILURE, 0, _("invalid target_version argument to compile_java_class"));
   return 0;
 }
--- a/lib/javacomp.h	Sun Sep 23 14:13:52 2018 +0200
+++ b/lib/javacomp.h	Wed Sep 26 11:21:30 2018 +0200
@@ -33,6 +33,7 @@
              1.8             lambdas
              9               private interface methods
             10               type inference for local variables
+            11               'var' in parameters of lambda expressions
    target_version can be:  classfile version:
              1.1                 45.3
              1.2                 46.0
@@ -44,6 +45,7 @@
              1.8                 52.0
              9                   53.0
             10                   54.0
+            11                   55.0
    target_version can also be given as NULL. In this case, the required
    target_version is determined from the found JVM (see javaversion.h).
    Specifying target_version is useful when building a library (.jar) that is
@@ -56,7 +58,8 @@
      - target_version < 1.7 with source_version >= 1.7, or
      - target_version < 1.8 with source_version >= 1.8, or
      - target_version < 9 with source_version >= 9, or
-     - target_version < 10 with source_version >= 10,
+     - target_version < 10 with source_version >= 10, or
+     - target_version < 11 with source_version >= 11,
    because even Sun's/Oracle's javac doesn't support these combinations.
    It is redundant to ask for a target_version > source_version, since the
    smaller target_version = source_version will also always work and newer JVMs
--- a/lib/javaversion.h	Sun Sep 23 14:13:52 2018 +0200
+++ b/lib/javaversion.h	Wed Sep 26 11:21:30 2018 +0200
@@ -26,7 +26,7 @@
 
 /* Return information about the Java version used by execute_java_class().
    This is the value of System.getProperty("java.specification.version").
-   Some possible values are: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 9, 10.
+   Some possible values are: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 9, 10, 11.
    Return NULL if the Java version cannot be determined.  */
 extern char * javaexec_version (void);
 
--- a/m4/javacomp.m4	Sun Sep 23 14:13:52 2018 +0200
+++ b/m4/javacomp.m4	Wed Sep 26 11:21:30 2018 +0200
@@ -1,4 +1,4 @@
-# javacomp.m4 serial 16
+# javacomp.m4 serial 17
 dnl Copyright (C) 2001-2003, 2006-2007, 2009-2018 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
@@ -20,6 +20,7 @@
 #           1.8             lambdas
 #           9               private interface methods
 #          10               type inference for local variables
+#          11               'var' in parameters of lambda expressions
 # Instead of source-version 1.6, use 1.5, since Java 6 did not introduce any
 # language changes. See
 # https://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html
@@ -35,6 +36,7 @@
 #           1.8                 52.0
 #           9                   53.0
 #          10                   54.0
+#          11                   55.0
 # The classfile version of a .class file can be determined through the "file"
 # command. More portably, the classfile major version can be determined through
 # "od -A n -t d1 -j 7 -N 1 classfile".
@@ -51,6 +53,7 @@
 #           1.8         JDK/JRE 8
 #           9           JDK/JRE 9
 #          10           JDK/JRE 10
+#          11           JDK/JRE 11
 # Note: gij >= 3.3 can in some cases handle classes compiled with -target 1.4,
 # and gij >= 4.1 can in some cases partially handle classes compiled with
 # -target 1.5, but I have no idea how complete this support is. Similarly,
@@ -68,7 +71,8 @@
 #   - target_version < 1.7 with source_version >= 1.7, or
 #   - target_version < 1.8 with source_version >= 1.8, or
 #   - target_version < 9 with source_version >= 9, or
-#   - target_version < 10 with source_version >= 10,
+#   - target_version < 10 with source_version >= 10, or
+#   - target_version < 11 with source_version >= 11,
 # because even Sun's/Oracle's javac doesn't support these combinations.
 #
 # It is redundant to ask for a target-version > source-version, since the
@@ -122,7 +126,7 @@
          CLASSPATH=.${CLASSPATH:+$CLASSPATH_SEPARATOR$CLASSPATH} $CONF_JAVA conftestver 2>&AS_MESSAGE_LOG_FD
        }`
        case "$target_version" in
-         1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 | 9 | 10) ;;
+         1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 | 9 | 10 | 11) ;;
          null)
            dnl JDK 1.1.X returns null.
            target_version=1.1 ;;
@@ -148,6 +152,8 @@
     9)   goodcode='interface conftest     { private void foo () {} }'
          failcode='class conftestfail { public void m() { var i = new Integer(0); } }' ;;
     10)  goodcode='class conftest     { public void m() { var i = new Integer(0); } }'
+         failcode='class conftestfail { Readable r = (var b) -> 0; }' ;;
+    11)  goodcode='class conftest     { Readable r = (var b) -> 0; }'
          failcode='class conftestfail syntax error' ;;
     *) AC_MSG_ERROR([invalid source-version argument to gt_@&t@JAVACOMP: $source_version]) ;;
   esac
@@ -162,6 +168,7 @@
     1.8) cfversion=52 ;;
     9)   cfversion=53 ;;
     10)  cfversion=54 ;;
+    11)  cfversion=55 ;;
     *) AC_MSG_ERROR([invalid target-version argument to gt_@&t@JAVACOMP: $target_version]) ;;
   esac
   # Function to output the classfile version of a file (8th byte) in decimal.
@@ -245,6 +252,14 @@
   dnl                -target 1.8 only possible with -source 1.6/1.7/1.8
   dnl                -target 9 only possible with -source 1.6/1.7/1.8/9
   dnl
+  dnl   javac 11:    -target 1.6 1.7 1.8 9 10 11  default: 11
+  dnl                -source 1.6 1.7 1.8 9 10 11  default: 11
+  dnl                -target 1.6 only possible with -source 1.6
+  dnl                -target 1.7 only possible with -source 1.6/1.7
+  dnl                -target 1.8 only possible with -source 1.6/1.7/1.8
+  dnl                -target 9 only possible with -source 1.6/1.7/1.8/9
+  dnl                -target 10 only possible with -source 1.6/1.7/1.8/9/10
+  dnl
   dnl The support of jikes for target-version and source-version:
   dnl
   dnl   jikes 1.14 does not have a way to specify the target-version. It