+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.
|| (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";
}
/* ======================= 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)
{
}
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;
}
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;
}
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;
/* ======================= 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)
{
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;
}
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;
}
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
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
- 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
/* 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);
-# 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
# 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
# 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".
# 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,
# - 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
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 ;;
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
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.
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