Merge
This commit is contained in:
commit
c8c8cd7238
3
.hgtags
3
.hgtags
@ -460,5 +460,6 @@ a2008587c13fa05fa2dbfcb09fe987576fbedfd1 jdk-10+32
|
||||
bbd692ad4fa300ecca7939ffbe3b1d5e52a28cc6 jdk-10+33
|
||||
89deac44e51517841491ba86ff44aa82a5ca96b3 jdk-10+34
|
||||
d8c634b016c628622c9abbdc6bf50509e5dedbec jdk-10+35
|
||||
cb54a299aa91419cb7caef3992592e7b22488163 jdk-10+36
|
||||
0ee20aad71c4f33c426372b4c8bcc1235ce2ec08 jdk-11+0
|
||||
959f2f7cbaa6d2ee45d50029744efb219721576c jdk-10+36
|
||||
4f830b447edf04fb4a52151a5ad44d9bb60723cd jdk-10+37
|
||||
|
@ -637,7 +637,7 @@ else
|
||||
# Declare dependencies between hotspot-<variant>* targets
|
||||
$(foreach v, $(JVM_VARIANTS), \
|
||||
$(eval hotspot-$v: hotspot-$v-gensrc hotspot-$v-libs) \
|
||||
$(eval hotspot-$v-libs: hotspot-$v-gensrc) \
|
||||
$(eval hotspot-$v-libs: hotspot-$v-gensrc java.base-copy) \
|
||||
)
|
||||
|
||||
hotspot-ide-project: hotspot exploded-image
|
||||
@ -691,8 +691,9 @@ else
|
||||
jdk.jdwp.agent-libs: jdk.jdwp.agent-gensrc
|
||||
|
||||
# The swing beans need to have java base properly generated to avoid errors
|
||||
# in javadoc.
|
||||
java.desktop-gensrc-src: java.base-gensrc
|
||||
# in javadoc. The X11 wrappers need the java.base include files to have been
|
||||
# copied and processed.
|
||||
java.desktop-gensrc-src: java.base-gensrc java.base-copy
|
||||
|
||||
# The annotation processing for jdk.internal.vm.ci and jdk.internal.vm.compiler
|
||||
# needs classes from the current JDK.
|
||||
|
@ -55,6 +55,7 @@ OPENJDK_TARGET_CPU_ARCH := @OPENJDK_BUILD_CPU_ARCH@
|
||||
OPENJDK_TARGET_CPU_BITS := @OPENJDK_BUILD_CPU_BITS@
|
||||
OPENJDK_TARGET_CPU_ENDIAN := @OPENJDK_BUILD_CPU_ENDIAN@
|
||||
OPENJDK_TARGET_CPU_LEGACY := @OPENJDK_BUILD_CPU_LEGACY@
|
||||
OPENJDK_TARGET_OS_INCLUDE_SUBDIR := @OPENJDK_BUILD_OS_INCLUDE_SUBDIR@
|
||||
|
||||
HOTSPOT_TARGET_OS := @HOTSPOT_BUILD_OS@
|
||||
HOTSPOT_TARGET_OS_TYPE := @HOTSPOT_BUILD_OS_TYPE@
|
||||
|
@ -1162,9 +1162,7 @@ AC_DEFUN([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK_HELPER],
|
||||
# Setup some hard coded includes
|
||||
$2COMMON_CCXXFLAGS_JDK="[$]$2COMMON_CCXXFLAGS_JDK \
|
||||
-I\$(SUPPORT_OUTPUTDIR)/modules_include/java.base \
|
||||
-I${TOPDIR}/src/java.base/share/native/include \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_$1_OS/native/include \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_$1_OS_TYPE/native/include \
|
||||
-I\$(SUPPORT_OUTPUTDIR)/modules_include/java.base/\$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR) \
|
||||
-I${TOPDIR}/src/java.base/share/native/libjava \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_$1_OS_TYPE/native/libjava \
|
||||
-I${TOPDIR}/src/hotspot/share/include \
|
||||
|
@ -886,6 +886,8 @@ JAVA
|
||||
BOOT_JDK
|
||||
JAVA_CHECK
|
||||
JAVAC_CHECK
|
||||
VERSION_CLASSFILE_MINOR
|
||||
VERSION_CLASSFILE_MAJOR
|
||||
VENDOR_VERSION_STRING
|
||||
VERSION_DATE
|
||||
VERSION_IS_GA
|
||||
@ -967,6 +969,7 @@ JDK_VARIANT
|
||||
USERNAME
|
||||
TOPDIR
|
||||
PATH_SEP
|
||||
OPENJDK_BUILD_OS_INCLUDE_SUBDIR
|
||||
HOTSPOT_BUILD_CPU_DEFINE
|
||||
HOTSPOT_BUILD_CPU_ARCH
|
||||
HOTSPOT_BUILD_CPU
|
||||
@ -977,6 +980,7 @@ OPENJDK_BUILD_CPU_OSARCH
|
||||
OPENJDK_BUILD_CPU_ISADIR
|
||||
OPENJDK_BUILD_CPU_LEGACY_LIB
|
||||
OPENJDK_BUILD_CPU_LEGACY
|
||||
OPENJDK_TARGET_OS_INCLUDE_SUBDIR
|
||||
HOTSPOT_TARGET_CPU_DEFINE
|
||||
HOTSPOT_TARGET_CPU_ARCH
|
||||
HOTSPOT_TARGET_CPU
|
||||
@ -16303,6 +16307,14 @@ $as_echo "$COMPILE_TYPE" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
# For historical reasons, the OS include directories have odd names.
|
||||
OPENJDK_TARGET_OS_INCLUDE_SUBDIR="$OPENJDK_TARGET_OS"
|
||||
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
||||
OPENJDK_TARGET_OS_INCLUDE_SUBDIR="win32"
|
||||
elif test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
|
||||
OPENJDK_TARGET_OS_INCLUDE_SUBDIR="darwin"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Also store the legacy naming of the cpu.
|
||||
@ -16454,6 +16466,14 @@ $as_echo "$COMPILE_TYPE" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
# For historical reasons, the OS include directories have odd names.
|
||||
OPENJDK_BUILD_OS_INCLUDE_SUBDIR="$OPENJDK_TARGET_OS"
|
||||
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
||||
OPENJDK_BUILD_OS_INCLUDE_SUBDIR="win32"
|
||||
elif test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
|
||||
OPENJDK_BUILD_OS_INCLUDE_SUBDIR="darwin"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
@ -25459,6 +25479,10 @@ fi
|
||||
VENDOR_VERSION_STRING="$with_vendor_version_string"
|
||||
fi
|
||||
|
||||
# We could define --with flags for these, if really needed
|
||||
VERSION_CLASSFILE_MAJOR="$DEFAULT_VERSION_CLASSFILE_MAJOR"
|
||||
VERSION_CLASSFILE_MINOR="$DEFAULT_VERSION_CLASSFILE_MINOR"
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for version string" >&5
|
||||
$as_echo_n "checking for version string... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $VERSION_STRING" >&5
|
||||
@ -25480,6 +25504,9 @@ $as_echo "$VERSION_STRING" >&6; }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Setup BootJDK, used to bootstrap the build.
|
||||
@ -52752,9 +52779,7 @@ fi
|
||||
# Setup some hard coded includes
|
||||
COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \
|
||||
-I\$(SUPPORT_OUTPUTDIR)/modules_include/java.base \
|
||||
-I${TOPDIR}/src/java.base/share/native/include \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_TARGET_OS/native/include \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_TARGET_OS_TYPE/native/include \
|
||||
-I\$(SUPPORT_OUTPUTDIR)/modules_include/java.base/\$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR) \
|
||||
-I${TOPDIR}/src/java.base/share/native/libjava \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_TARGET_OS_TYPE/native/libjava \
|
||||
-I${TOPDIR}/src/hotspot/share/include \
|
||||
@ -53635,9 +53660,7 @@ fi
|
||||
# Setup some hard coded includes
|
||||
OPENJDK_BUILD_COMMON_CCXXFLAGS_JDK="$OPENJDK_BUILD_COMMON_CCXXFLAGS_JDK \
|
||||
-I\$(SUPPORT_OUTPUTDIR)/modules_include/java.base \
|
||||
-I${TOPDIR}/src/java.base/share/native/include \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_BUILD_OS/native/include \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_BUILD_OS_TYPE/native/include \
|
||||
-I\$(SUPPORT_OUTPUTDIR)/modules_include/java.base/\$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR) \
|
||||
-I${TOPDIR}/src/java.base/share/native/libjava \
|
||||
-I${TOPDIR}/src/java.base/$OPENJDK_BUILD_OS_TYPE/native/libjava \
|
||||
-I${TOPDIR}/src/hotspot/share/include \
|
||||
|
@ -342,6 +342,10 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS],
|
||||
VENDOR_VERSION_STRING="$with_vendor_version_string"
|
||||
fi
|
||||
|
||||
# We could define --with flags for these, if really needed
|
||||
VERSION_CLASSFILE_MAJOR="$DEFAULT_VERSION_CLASSFILE_MAJOR"
|
||||
VERSION_CLASSFILE_MINOR="$DEFAULT_VERSION_CLASSFILE_MINOR"
|
||||
|
||||
AC_MSG_CHECKING([for version string])
|
||||
AC_MSG_RESULT([$VERSION_STRING])
|
||||
|
||||
@ -359,4 +363,7 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS],
|
||||
AC_SUBST(VERSION_IS_GA)
|
||||
AC_SUBST(VERSION_DATE)
|
||||
AC_SUBST(VENDOR_VERSION_STRING)
|
||||
AC_SUBST(VERSION_CLASSFILE_MAJOR)
|
||||
AC_SUBST(VERSION_CLASSFILE_MINOR)
|
||||
|
||||
])
|
||||
|
@ -478,6 +478,14 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HELPER],
|
||||
fi
|
||||
AC_SUBST(HOTSPOT_$1_CPU_DEFINE)
|
||||
|
||||
# For historical reasons, the OS include directories have odd names.
|
||||
OPENJDK_$1_OS_INCLUDE_SUBDIR="$OPENJDK_TARGET_OS"
|
||||
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
||||
OPENJDK_$1_OS_INCLUDE_SUBDIR="win32"
|
||||
elif test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
|
||||
OPENJDK_$1_OS_INCLUDE_SUBDIR="darwin"
|
||||
fi
|
||||
AC_SUBST(OPENJDK_$1_OS_INCLUDE_SUBDIR)
|
||||
])
|
||||
|
||||
AC_DEFUN([PLATFORM_SET_RELEASE_FILE_OS_VALUES],
|
||||
|
@ -78,6 +78,7 @@ OPENJDK_TARGET_CPU_ISADIR:=@OPENJDK_TARGET_CPU_ISADIR@
|
||||
OPENJDK_TARGET_CPU_LEGACY:=@OPENJDK_TARGET_CPU_LEGACY@
|
||||
OPENJDK_TARGET_CPU_LEGACY_LIB:=@OPENJDK_TARGET_CPU_LEGACY_LIB@
|
||||
OPENJDK_TARGET_CPU_OSARCH:=@OPENJDK_TARGET_CPU_OSARCH@
|
||||
OPENJDK_TARGET_OS_INCLUDE_SUBIDR:=@OPENJDK_TARGET_OS_INCLUDE_SUBDIR@
|
||||
|
||||
HOTSPOT_TARGET_OS := @HOTSPOT_TARGET_OS@
|
||||
HOTSPOT_TARGET_OS_TYPE := @HOTSPOT_TARGET_OS_TYPE@
|
||||
@ -100,6 +101,8 @@ OPENJDK_BUILD_CPU_ARCH:=@OPENJDK_BUILD_CPU_ARCH@
|
||||
OPENJDK_BUILD_CPU_BITS:=@OPENJDK_BUILD_CPU_BITS@
|
||||
OPENJDK_BUILD_CPU_ENDIAN:=@OPENJDK_BUILD_CPU_ENDIAN@
|
||||
|
||||
OPENJDK_BUILD_OS_INCLUDE_SUBIDR:=@OPENJDK_TARGET_OS_INCLUDE_SUBDIR@
|
||||
|
||||
# Target platform value in ModuleTarget class file attribute.
|
||||
OPENJDK_MODULE_TARGET_PLATFORM:=@OPENJDK_MODULE_TARGET_PLATFORM@
|
||||
|
||||
@ -175,6 +178,10 @@ VERSION_DATE := @VERSION_DATE@
|
||||
# Vendor version string
|
||||
VENDOR_VERSION_STRING := @VENDOR_VERSION_STRING@
|
||||
|
||||
# Class-file version
|
||||
VERSION_CLASSFILE_MAJOR := @VERSION_CLASSFILE_MAJOR@
|
||||
VERSION_CLASSFILE_MINOR := @VERSION_CLASSFILE_MINOR@
|
||||
|
||||
# Convenience CFLAGS settings for passing version information into native programs.
|
||||
VERSION_CFLAGS := \
|
||||
-DVERSION_FEATURE=$(VERSION_FEATURE) \
|
||||
@ -190,6 +197,8 @@ VERSION_CFLAGS := \
|
||||
-DVERSION_SPECIFICATION='"$(VERSION_SPECIFICATION)"' \
|
||||
-DVERSION_DATE='"$(VERSION_DATE)"' \
|
||||
-DVENDOR_VERSION_STRING='"$(VENDOR_VERSION_STRING)"' \
|
||||
-DVERSION_CLASSFILE_MAJOR=$(VERSION_CLASSFILE_MAJOR) \
|
||||
-DVERSION_CLASSFILE_MINOR=$(VERSION_CLASSFILE_MINOR) \
|
||||
#
|
||||
|
||||
# Platform naming variables
|
||||
|
@ -30,6 +30,8 @@ DEFAULT_VERSION_INTERIM=0
|
||||
DEFAULT_VERSION_UPDATE=0
|
||||
DEFAULT_VERSION_PATCH=0
|
||||
DEFAULT_VERSION_DATE=2018-03-20
|
||||
DEFAULT_VERSION_CLASSFILE_MAJOR=55 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||
|
||||
LAUNCHER_NAME=openjdk
|
||||
PRODUCT_NAME=OpenJDK
|
||||
|
@ -69,7 +69,7 @@ $(eval $(call SetupJavaCompiler,GENERATE_OLDBYTECODE, \
|
||||
$(eval $(call SetupJavaCompiler,GENERATE_JDKBYTECODE, \
|
||||
JVM := $(JAVA_JAVAC), \
|
||||
JAVAC := $(NEW_JAVAC), \
|
||||
FLAGS := -source 10 -target 10 --doclint-format html5 \
|
||||
FLAGS := -source 11 -target 11 --doclint-format html5 \
|
||||
-encoding ascii -XDignore.symbol.file=true $(JAVAC_WARNINGS), \
|
||||
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
|
||||
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
|
||||
@ -79,7 +79,7 @@ $(eval $(call SetupJavaCompiler,GENERATE_JDKBYTECODE, \
|
||||
$(eval $(call SetupJavaCompiler,GENERATE_JDKBYTECODE_NOWARNINGS, \
|
||||
JVM := $(JAVA_JAVAC), \
|
||||
JAVAC := $(NEW_JAVAC), \
|
||||
FLAGS := -source 10 -target 10 \
|
||||
FLAGS := -source 11 -target 11 \
|
||||
-encoding ascii -XDignore.symbol.file=true $(DISABLE_WARNINGS), \
|
||||
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
|
||||
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
|
||||
|
@ -829,7 +829,7 @@ var getJibProfilesDependencies = function (input, common) {
|
||||
jtreg: {
|
||||
server: "javare",
|
||||
revision: "4.2",
|
||||
build_number: "b10",
|
||||
build_number: "b11",
|
||||
checksum_file: "MD5_VALUES",
|
||||
file: "jtreg_bin-4.2.zip",
|
||||
environment_name: "JT_HOME",
|
||||
|
@ -24,6 +24,7 @@
|
||||
#
|
||||
|
||||
include CopyCommon.gmk
|
||||
include TextFileProcessing.gmk
|
||||
|
||||
$(eval $(call IncludeCustomExtension, copy/Copy-java.base.gmk))
|
||||
|
||||
@ -244,3 +245,16 @@ ifeq ($(ENABLE_LIBFFI_BUNDLING), true)
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
# Generate classfile_constants.h
|
||||
|
||||
$(eval $(call SetupTextFileProcessing, CREATE_CLASSFILE_CONSTANTS_H, \
|
||||
SOURCE_FILES := $(TOPDIR)/src/java.base/share/native/include/classfile_constants.h.template, \
|
||||
OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/modules_include/java.base/classfile_constants.h, \
|
||||
REPLACEMENTS := \
|
||||
@@VERSION_CLASSFILE_MAJOR@@ => $(VERSION_CLASSFILE_MAJOR) ; \
|
||||
@@VERSION_CLASSFILE_MINOR@@ => $(VERSION_CLASSFILE_MINOR) ; , \
|
||||
))
|
||||
|
||||
TARGETS += $(CREATE_CLASSFILE_CONSTANTS_H)
|
||||
|
||||
################################################################################
|
||||
|
@ -39,20 +39,12 @@ ifneq ($(wildcard $(INCLUDE_SOURCE_DIR)/*), )
|
||||
$(eval $(call SetupCopyFiles, COPY_EXPORTED_INCLUDE, \
|
||||
SRC := $(INCLUDE_SOURCE_DIR), \
|
||||
DEST := $(INCLUDE_TARGET_DIR), \
|
||||
FILES := $(shell $(FIND) $(INCLUDE_SOURCE_DIR) -type f), \
|
||||
FILES := $(filter %.h, $(call CacheFind, $(INCLUDE_SOURCE_DIR))), \
|
||||
))
|
||||
|
||||
TARGETS += $(COPY_EXPORTED_INCLUDE)
|
||||
endif
|
||||
|
||||
# For historical reasons, the OS include directories have odd names.
|
||||
INCLUDE_TARGET_OS_SUBDIR := $(OPENJDK_TARGET_OS)
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
INCLUDE_TARGET_OS_SUBDIR := win32
|
||||
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
INCLUDE_TARGET_OS_SUBDIR := darwin
|
||||
endif
|
||||
|
||||
# Use the most specific of OS and OS_TYPE.
|
||||
INCLUDE_SOURCE_OS_DIR := $(TOPDIR)/src/$(MODULE)/$(OPENJDK_TARGET_OS)/native/include
|
||||
ifeq ($(wildcard $(INCLUDE_SOURCE_OS_DIR)/*), )
|
||||
@ -62,8 +54,8 @@ endif
|
||||
ifneq ($(wildcard $(INCLUDE_SOURCE_OS_DIR)/*), )
|
||||
$(eval $(call SetupCopyFiles, COPY_EXPORTED_INCLUDE_OS, \
|
||||
SRC := $(INCLUDE_SOURCE_OS_DIR), \
|
||||
DEST := $(INCLUDE_TARGET_DIR)/$(INCLUDE_TARGET_OS_SUBDIR), \
|
||||
FILES := $(shell $(FIND) $(INCLUDE_SOURCE_OS_DIR) -type f), \
|
||||
DEST := $(INCLUDE_TARGET_DIR)/$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR), \
|
||||
FILES := $(filter %.h, $(call CacheFind, $(INCLUDE_SOURCE_OS_DIR))), \
|
||||
))
|
||||
|
||||
TARGETS += $(COPY_EXPORTED_INCLUDE_OS)
|
||||
|
@ -92,10 +92,10 @@ ifneq ($(COMPILE_TYPE), cross)
|
||||
endif
|
||||
|
||||
SIZER_CFLAGS := \
|
||||
-I${TOPDIR}/src/hotspot/share/include \
|
||||
-I${TOPDIR}/src/hotspot/os/$(HOTSPOT_TARGET_OS_TYPE)/include \
|
||||
-I$(TOPDIR)/src/java.base/share/native/include \
|
||||
-I$(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/native/include \
|
||||
-I$(TOPDIR)/src/hotspot/share/include \
|
||||
-I$(TOPDIR)/src/hotspot/os/$(HOTSPOT_TARGET_OS_TYPE)/include \
|
||||
-I$(SUPPORT_OUTPUTDIR)/modules_include/java.base \
|
||||
-I$(SUPPORT_OUTPUTDIR)/modules_include/java.base/$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR) \
|
||||
-I$(TOPDIR)/src/java.base/share/native/libjava \
|
||||
-I$(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/native/libjava \
|
||||
-I$(TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/awt \
|
||||
|
@ -59,8 +59,8 @@ JVM_CFLAGS_INCLUDES += \
|
||||
-I$(TOPDIR)/src/hotspot/share/precompiled \
|
||||
-I$(TOPDIR)/src/hotspot/share/include \
|
||||
-I$(TOPDIR)/src/hotspot/os/$(HOTSPOT_TARGET_OS_TYPE)/include \
|
||||
-I$(TOPDIR)/src/java.base/share/native/include \
|
||||
-I$(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/native/include \
|
||||
-I$(SUPPORT_OUTPUTDIR)/modules_include/java.base \
|
||||
-I$(SUPPORT_OUTPUTDIR)/modules_include/java.base/$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR) \
|
||||
-I$(TOPDIR)/src/java.base/share/native/libjimage \
|
||||
#
|
||||
|
||||
|
@ -86,8 +86,6 @@
|
||||
|
||||
#define JAVA_CLASSFILE_MAGIC 0xCAFEBABE
|
||||
#define JAVA_MIN_SUPPORTED_VERSION 45
|
||||
#define JAVA_MAX_SUPPORTED_VERSION 54
|
||||
#define JAVA_MAX_SUPPORTED_MINOR_VERSION 0
|
||||
|
||||
// Used for two backward compatibility reasons:
|
||||
// - to check for new additions to the class file format in JDK1.5
|
||||
@ -110,6 +108,8 @@
|
||||
|
||||
#define JAVA_10_VERSION 54
|
||||
|
||||
#define JAVA_11_VERSION 55
|
||||
|
||||
void ClassFileParser::set_class_bad_constant_seen(short bad_constant) {
|
||||
assert((bad_constant == 19 || bad_constant == 20) && _major_version >= JAVA_9_VERSION,
|
||||
"Unexpected bad constant pool entry");
|
||||
@ -4642,11 +4642,11 @@ static bool has_illegal_visibility(jint flags) {
|
||||
}
|
||||
|
||||
static bool is_supported_version(u2 major, u2 minor){
|
||||
const u2 max_version = JAVA_MAX_SUPPORTED_VERSION;
|
||||
const u2 max_version = JVM_CLASSFILE_MAJOR_VERSION;
|
||||
return (major >= JAVA_MIN_SUPPORTED_VERSION) &&
|
||||
(major <= max_version) &&
|
||||
((major != max_version) ||
|
||||
(minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION));
|
||||
(minor <= JVM_CLASSFILE_MINOR_VERSION));
|
||||
}
|
||||
|
||||
void ClassFileParser::verify_legal_field_modifiers(jint flags,
|
||||
@ -5808,8 +5808,8 @@ void ClassFileParser::parse_stream(const ClassFileStream* const stream,
|
||||
_class_name->as_C_string(),
|
||||
_major_version,
|
||||
_minor_version,
|
||||
JAVA_MAX_SUPPORTED_VERSION,
|
||||
JAVA_MAX_SUPPORTED_MINOR_VERSION);
|
||||
JVM_CLASSFILE_MAJOR_VERSION,
|
||||
JVM_CLASSFILE_MINOR_VERSION);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -996,8 +996,8 @@
|
||||
do_name( montgomerySquare_name, "implMontgomerySquare") \
|
||||
do_signature(montgomerySquare_signature, "([I[IIJ[I)[I") \
|
||||
\
|
||||
do_class(java_util_ArraysSupport, "java/util/ArraysSupport") \
|
||||
do_intrinsic(_vectorizedMismatch, java_util_ArraysSupport, vectorizedMismatch_name, vectorizedMismatch_signature, F_S)\
|
||||
do_class(jdk_internal_util_ArraysSupport, "jdk/internal/util/ArraysSupport") \
|
||||
do_intrinsic(_vectorizedMismatch, jdk_internal_util_ArraysSupport, vectorizedMismatch_name, vectorizedMismatch_signature, F_S)\
|
||||
do_name(vectorizedMismatch_name, "vectorizedMismatch") \
|
||||
do_signature(vectorizedMismatch_signature, "(Ljava/lang/Object;JLjava/lang/Object;JII)I") \
|
||||
\
|
||||
|
@ -497,7 +497,7 @@ static SpecialFlag const special_jvm_flags[] = {
|
||||
{ "MaxRAMFraction", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() },
|
||||
{ "MinRAMFraction", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() },
|
||||
{ "InitialRAMFraction", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() },
|
||||
{ "UseMembar", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) },
|
||||
{ "UseMembar", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() },
|
||||
{ "FastTLABRefill", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) },
|
||||
{ "SafepointSpinBeforeYield", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) },
|
||||
{ "DeferThrSuspendLoopCount", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) },
|
||||
@ -674,6 +674,14 @@ static bool lookup_special_flag(const char *flag_name, size_t skip_index) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Verifies the correctness of the entries in the special_jvm_flags table.
|
||||
// If there is a semantic error (i.e. a bug in the table) such as the obsoletion
|
||||
// version being earlier than the deprecation version, then a warning is issued
|
||||
// and verification fails - by returning false. If it is detected that the table
|
||||
// is out of date, with respect to the current version, then a warning is issued
|
||||
// but verification does not fail. This allows the VM to operate when the version
|
||||
// is first updated, without needing to update all the impacted flags at the
|
||||
// same time.
|
||||
static bool verify_special_jvm_flags() {
|
||||
bool success = true;
|
||||
for (size_t i = 0; special_jvm_flags[i].name != NULL; i++) {
|
||||
@ -710,7 +718,6 @@ static bool verify_special_jvm_flags() {
|
||||
if (!version_less_than(JDK_Version::current(), flag.obsolete_in)) {
|
||||
if (Flag::find_flag(flag.name) != NULL) {
|
||||
warning("Global variable for obsolete special flag entry \"%s\" should be removed", flag.name);
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -720,7 +727,6 @@ static bool verify_special_jvm_flags() {
|
||||
if (!version_less_than(JDK_Version::current(), flag.expired_in)) {
|
||||
if (Flag::find_flag(flag.name) != NULL) {
|
||||
warning("Global variable for expired flag entry \"%s\" should be removed", flag.name);
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -48,6 +48,7 @@ class Constants {
|
||||
1.8 to 1.8.X 52,0
|
||||
1.9 to 1.9.X 53,0
|
||||
1.10 to 1.10.X 54,0
|
||||
1.11 to 1.11.X 55,0
|
||||
*/
|
||||
|
||||
public static final Package.Version JAVA_MIN_CLASS_VERSION =
|
||||
@ -71,6 +72,9 @@ class Constants {
|
||||
public static final Package.Version JAVA10_MAX_CLASS_VERSION =
|
||||
Package.Version.of(54, 00);
|
||||
|
||||
public static final Package.Version JAVA11_MAX_CLASS_VERSION =
|
||||
Package.Version.of(55, 00);
|
||||
|
||||
public static final int JAVA_PACKAGE_MAGIC = 0xCAFED00D;
|
||||
|
||||
public static final Package.Version JAVA5_PACKAGE_VERSION =
|
||||
@ -87,7 +91,7 @@ class Constants {
|
||||
|
||||
// upper limit, should point to the latest class version
|
||||
public static final Package.Version JAVA_MAX_CLASS_VERSION =
|
||||
JAVA10_MAX_CLASS_VERSION;
|
||||
JAVA11_MAX_CLASS_VERSION;
|
||||
|
||||
// upper limit should point to the latest package version, for version info!.
|
||||
public static final Package.Version MAX_PACKAGE_VERSION =
|
||||
|
@ -25,7 +25,9 @@
|
||||
|
||||
package java.io;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
@ -229,30 +231,55 @@ public abstract class InputStream implements Closeable {
|
||||
* @since 9
|
||||
*/
|
||||
public byte[] readAllBytes() throws IOException {
|
||||
byte[] buf = new byte[DEFAULT_BUFFER_SIZE];
|
||||
int capacity = buf.length;
|
||||
int nread = 0;
|
||||
List<byte[]> bufs = null;
|
||||
byte[] result = null;
|
||||
int total = 0;
|
||||
int n;
|
||||
for (;;) {
|
||||
// read to EOF which may read more or less than initial buffer size
|
||||
while ((n = read(buf, nread, capacity - nread)) > 0)
|
||||
do {
|
||||
byte[] buf = new byte[DEFAULT_BUFFER_SIZE];
|
||||
int nread = 0;
|
||||
|
||||
// read to EOF which may read more or less than buffer size
|
||||
while ((n = read(buf, nread, buf.length - nread)) > 0) {
|
||||
nread += n;
|
||||
|
||||
// if the last call to read returned -1, then we're done
|
||||
if (n < 0)
|
||||
break;
|
||||
|
||||
// need to allocate a larger buffer
|
||||
if (capacity <= MAX_BUFFER_SIZE - capacity) {
|
||||
capacity = capacity << 1;
|
||||
} else {
|
||||
if (capacity == MAX_BUFFER_SIZE)
|
||||
throw new OutOfMemoryError("Required array size too large");
|
||||
capacity = MAX_BUFFER_SIZE;
|
||||
}
|
||||
buf = Arrays.copyOf(buf, capacity);
|
||||
|
||||
if (nread > 0) {
|
||||
if (MAX_BUFFER_SIZE - total < nread) {
|
||||
throw new OutOfMemoryError("Required array size too large");
|
||||
}
|
||||
total += nread;
|
||||
if (result == null) {
|
||||
result = buf;
|
||||
} else {
|
||||
if (bufs == null) {
|
||||
bufs = new ArrayList<>();
|
||||
bufs.add(result);
|
||||
}
|
||||
bufs.add(buf);
|
||||
}
|
||||
}
|
||||
} while (n >= 0); // if the last call to read returned -1, then break
|
||||
|
||||
if (bufs == null) {
|
||||
if (result == null) {
|
||||
return new byte[0];
|
||||
}
|
||||
return result.length == total ?
|
||||
result : Arrays.copyOf(result, total);
|
||||
}
|
||||
return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
|
||||
|
||||
result = new byte[total];
|
||||
int offset = 0;
|
||||
int remaining = total;
|
||||
for (byte[] b : bufs) {
|
||||
int len = Math.min(b.length, remaining);
|
||||
System.arraycopy(b, 0, result, offset, len);
|
||||
offset += len;
|
||||
remaining -= len;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -140,14 +140,6 @@ public abstract class Reference<T> {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* system property to disable clearing before enqueuing.
|
||||
*/
|
||||
private static final class ClearBeforeEnqueue {
|
||||
static final boolean DISABLE =
|
||||
Boolean.getBoolean("jdk.lang.ref.disableClearBeforeEnqueue");
|
||||
}
|
||||
|
||||
/*
|
||||
* Atomically get and clear (set to null) the VM's pending list.
|
||||
*/
|
||||
@ -299,8 +291,7 @@ public abstract class Reference<T> {
|
||||
* it was not registered with a queue when it was created
|
||||
*/
|
||||
public boolean enqueue() {
|
||||
if (!ClearBeforeEnqueue.DISABLE)
|
||||
this.referent = null;
|
||||
this.referent = null;
|
||||
return this.queue.enqueue(this);
|
||||
}
|
||||
|
||||
|
@ -63,38 +63,38 @@ class Bits { // package-private
|
||||
|
||||
// -- Unsafe access --
|
||||
|
||||
private static final Unsafe unsafe = Unsafe.getUnsafe();
|
||||
private static final Unsafe UNSAFE = Unsafe.getUnsafe();
|
||||
|
||||
static Unsafe unsafe() {
|
||||
return unsafe;
|
||||
return UNSAFE;
|
||||
}
|
||||
|
||||
|
||||
// -- Processor and memory-system properties --
|
||||
|
||||
private static final ByteOrder byteOrder
|
||||
= unsafe.isBigEndian() ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
|
||||
private static final ByteOrder BYTE_ORDER
|
||||
= UNSAFE.isBigEndian() ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
|
||||
|
||||
static ByteOrder byteOrder() {
|
||||
return byteOrder;
|
||||
return BYTE_ORDER;
|
||||
}
|
||||
|
||||
private static int pageSize = -1;
|
||||
private static int PAGE_SIZE = -1;
|
||||
|
||||
static int pageSize() {
|
||||
if (pageSize == -1)
|
||||
pageSize = unsafe().pageSize();
|
||||
return pageSize;
|
||||
if (PAGE_SIZE == -1)
|
||||
PAGE_SIZE = unsafe().pageSize();
|
||||
return PAGE_SIZE;
|
||||
}
|
||||
|
||||
static int pageCount(long size) {
|
||||
return (int)(size + (long)pageSize() - 1L) / pageSize();
|
||||
}
|
||||
|
||||
private static boolean unaligned = unsafe.unalignedAccess();
|
||||
private static boolean UNALIGNED = UNSAFE.unalignedAccess();
|
||||
|
||||
static boolean unaligned() {
|
||||
return unaligned;
|
||||
return UNALIGNED;
|
||||
}
|
||||
|
||||
|
||||
@ -103,11 +103,11 @@ class Bits { // package-private
|
||||
// A user-settable upper limit on the maximum amount of allocatable
|
||||
// direct buffer memory. This value may be changed during VM
|
||||
// initialization if it is launched with "-XX:MaxDirectMemorySize=<size>".
|
||||
private static volatile long maxMemory = VM.maxDirectMemory();
|
||||
private static final AtomicLong reservedMemory = new AtomicLong();
|
||||
private static final AtomicLong totalCapacity = new AtomicLong();
|
||||
private static final AtomicLong count = new AtomicLong();
|
||||
private static volatile boolean memoryLimitSet;
|
||||
private static volatile long MAX_MEMORY = VM.maxDirectMemory();
|
||||
private static final AtomicLong RESERVED_MEMORY = new AtomicLong();
|
||||
private static final AtomicLong TOTAL_CAPACITY = new AtomicLong();
|
||||
private static final AtomicLong COUNT = new AtomicLong();
|
||||
private static volatile boolean MEMORY_LIMIT_SET;
|
||||
|
||||
// max. number of sleeps during try-reserving with exponentially
|
||||
// increasing delay before throwing OutOfMemoryError:
|
||||
@ -120,9 +120,9 @@ class Bits { // package-private
|
||||
// which a process may access. All sizes are specified in bytes.
|
||||
static void reserveMemory(long size, int cap) {
|
||||
|
||||
if (!memoryLimitSet && VM.initLevel() >= 1) {
|
||||
maxMemory = VM.maxDirectMemory();
|
||||
memoryLimitSet = true;
|
||||
if (!MEMORY_LIMIT_SET && VM.initLevel() >= 1) {
|
||||
MAX_MEMORY = VM.maxDirectMemory();
|
||||
MEMORY_LIMIT_SET = true;
|
||||
}
|
||||
|
||||
// optimist!
|
||||
@ -200,10 +200,10 @@ class Bits { // package-private
|
||||
// actual memory usage, which will differ when buffers are page
|
||||
// aligned.
|
||||
long totalCap;
|
||||
while (cap <= maxMemory - (totalCap = totalCapacity.get())) {
|
||||
if (totalCapacity.compareAndSet(totalCap, totalCap + cap)) {
|
||||
reservedMemory.addAndGet(size);
|
||||
count.incrementAndGet();
|
||||
while (cap <= MAX_MEMORY - (totalCap = TOTAL_CAPACITY.get())) {
|
||||
if (TOTAL_CAPACITY.compareAndSet(totalCap, totalCap + cap)) {
|
||||
RESERVED_MEMORY.addAndGet(size);
|
||||
COUNT.incrementAndGet();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -213,9 +213,9 @@ class Bits { // package-private
|
||||
|
||||
|
||||
static void unreserveMemory(long size, int cap) {
|
||||
long cnt = count.decrementAndGet();
|
||||
long reservedMem = reservedMemory.addAndGet(-size);
|
||||
long totalCap = totalCapacity.addAndGet(-cap);
|
||||
long cnt = COUNT.decrementAndGet();
|
||||
long reservedMem = RESERVED_MEMORY.addAndGet(-size);
|
||||
long totalCap = TOTAL_CAPACITY.addAndGet(-cap);
|
||||
assert cnt >= 0 && reservedMem >= 0 && totalCap >= 0;
|
||||
}
|
||||
|
||||
@ -234,15 +234,15 @@ class Bits { // package-private
|
||||
}
|
||||
@Override
|
||||
public long getCount() {
|
||||
return Bits.count.get();
|
||||
return Bits.COUNT.get();
|
||||
}
|
||||
@Override
|
||||
public long getTotalCapacity() {
|
||||
return Bits.totalCapacity.get();
|
||||
return Bits.TOTAL_CAPACITY.get();
|
||||
}
|
||||
@Override
|
||||
public long getMemoryUsed() {
|
||||
return Bits.reservedMemory.get();
|
||||
return Bits.RESERVED_MEMORY.get();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -26,6 +26,7 @@
|
||||
package java.nio;
|
||||
|
||||
import jdk.internal.HotSpotIntrinsicCandidate;
|
||||
import jdk.internal.misc.Unsafe;
|
||||
|
||||
import java.util.Spliterator;
|
||||
|
||||
@ -181,6 +182,8 @@ import java.util.Spliterator;
|
||||
*/
|
||||
|
||||
public abstract class Buffer {
|
||||
// Cached unsafe-access object
|
||||
static final Unsafe UNSAFE = Bits.unsafe();
|
||||
|
||||
/**
|
||||
* The characteristics of Spliterators that traverse and split elements
|
||||
@ -616,6 +619,14 @@ public abstract class Buffer {
|
||||
|
||||
// -- Package-private methods for bounds checking, etc. --
|
||||
|
||||
/**
|
||||
*
|
||||
* @return the base reference, paired with the address
|
||||
* field, which in combination can be used for unsafe access into a heap
|
||||
* buffer or direct byte buffer (and views of).
|
||||
*/
|
||||
abstract Object base();
|
||||
|
||||
/**
|
||||
* Checks the current position against the limit, throwing a {@link
|
||||
* BufferUnderflowException} if it is not smaller than the limit, and then
|
||||
|
198
src/java.base/share/classes/java/nio/BufferMismatch.java
Normal file
198
src/java.base/share/classes/java/nio/BufferMismatch.java
Normal file
@ -0,0 +1,198 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.nio;
|
||||
|
||||
import jdk.internal.util.ArraysSupport;
|
||||
|
||||
/**
|
||||
* Mismatch methods for buffers
|
||||
*/
|
||||
final class BufferMismatch {
|
||||
|
||||
static int mismatch(ByteBuffer a, int aOff, ByteBuffer b, int bOff, int length) {
|
||||
int i = 0;
|
||||
if (length > 7) {
|
||||
i = ArraysSupport.vectorizedMismatch(
|
||||
a.base(), a.address + aOff,
|
||||
b.base(), b.address + bOff,
|
||||
length,
|
||||
ArraysSupport.LOG2_ARRAY_BYTE_INDEX_SCALE);
|
||||
if (i >= 0) return i;
|
||||
i = length - ~i;
|
||||
}
|
||||
for (; i < length; i++) {
|
||||
if (a.get(aOff + i) != b.get(bOff + i))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(CharBuffer a, int aOff, CharBuffer b, int bOff, int length) {
|
||||
int i = 0;
|
||||
// Ensure only heap or off-heap buffer instances use the
|
||||
// vectorized mismatch. If either buffer is a StringCharBuffer
|
||||
// (order is null) then the slow path is taken
|
||||
if (length > 3 && a.charRegionOrder() == b.charRegionOrder()
|
||||
&& a.charRegionOrder() != null && b.charRegionOrder() != null) {
|
||||
i = ArraysSupport.vectorizedMismatch(
|
||||
a.base(), a.address + (aOff << ArraysSupport.LOG2_ARRAY_CHAR_INDEX_SCALE),
|
||||
b.base(), b.address + (bOff << ArraysSupport.LOG2_ARRAY_CHAR_INDEX_SCALE),
|
||||
length,
|
||||
ArraysSupport.LOG2_ARRAY_CHAR_INDEX_SCALE);
|
||||
if (i >= 0) return i;
|
||||
i = length - ~i;
|
||||
}
|
||||
for (; i < length; i++) {
|
||||
if (a.get(aOff + i) != b.get(bOff + i))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(ShortBuffer a, int aOff, ShortBuffer b, int bOff, int length) {
|
||||
int i = 0;
|
||||
if (length > 3 && a.order() == b.order()) {
|
||||
i = ArraysSupport.vectorizedMismatch(
|
||||
a.base(), a.address + (aOff << ArraysSupport.LOG2_ARRAY_SHORT_INDEX_SCALE),
|
||||
b.base(), b.address + (bOff << ArraysSupport.LOG2_ARRAY_SHORT_INDEX_SCALE),
|
||||
length,
|
||||
ArraysSupport.LOG2_ARRAY_SHORT_INDEX_SCALE);
|
||||
if (i >= 0) return i;
|
||||
i = length - ~i;
|
||||
}
|
||||
for (; i < length; i++) {
|
||||
if (a.get(aOff + i) != b.get(bOff + i))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(IntBuffer a, int aOff, IntBuffer b, int bOff, int length) {
|
||||
int i = 0;
|
||||
if (length > 1 && a.order() == b.order()) {
|
||||
i = ArraysSupport.vectorizedMismatch(
|
||||
a.base(), a.address + (aOff << ArraysSupport.LOG2_ARRAY_INT_INDEX_SCALE),
|
||||
b.base(), b.address + (bOff << ArraysSupport.LOG2_ARRAY_INT_INDEX_SCALE),
|
||||
length,
|
||||
ArraysSupport.LOG2_ARRAY_INT_INDEX_SCALE);
|
||||
if (i >= 0) return i;
|
||||
i = length - ~i;
|
||||
}
|
||||
for (; i < length; i++) {
|
||||
if (a.get(aOff + i) != b.get(bOff + i))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(FloatBuffer a, int aOff, FloatBuffer b, int bOff, int length) {
|
||||
int i = 0;
|
||||
if (length > 1 && a.order() == b.order()) {
|
||||
i = ArraysSupport.vectorizedMismatch(
|
||||
a.base(), a.address + (aOff << ArraysSupport.LOG2_ARRAY_FLOAT_INDEX_SCALE),
|
||||
b.base(), b.address + (bOff << ArraysSupport.LOG2_ARRAY_FLOAT_INDEX_SCALE),
|
||||
length,
|
||||
ArraysSupport.LOG2_ARRAY_FLOAT_INDEX_SCALE);
|
||||
// Mismatched
|
||||
if (i >= 0) {
|
||||
// Check if mismatch is not associated with two NaN values; and
|
||||
// is not associated with +0 and -0
|
||||
float av = a.get(aOff + i);
|
||||
float bv = b.get(bOff + i);
|
||||
if (av != bv && (!Float.isNaN(av) || !Float.isNaN(bv)))
|
||||
return i;
|
||||
|
||||
// Fall back to slow mechanism
|
||||
// ISSUE: Consider looping over vectorizedMismatch adjusting ranges
|
||||
// However, requires that returned value be relative to input ranges
|
||||
i++;
|
||||
}
|
||||
// Matched
|
||||
else {
|
||||
i = length - ~i;
|
||||
}
|
||||
}
|
||||
for (; i < length; i++) {
|
||||
float av = a.get(aOff + i);
|
||||
float bv = b.get(bOff + i);
|
||||
if (av != bv && (!Float.isNaN(av) || !Float.isNaN(bv)))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(LongBuffer a, int aOff, LongBuffer b, int bOff, int length) {
|
||||
int i = 0;
|
||||
if (length > 0 && a.order() == b.order()) {
|
||||
i = ArraysSupport.vectorizedMismatch(
|
||||
a.base(), a.address + (aOff << ArraysSupport.LOG2_ARRAY_LONG_INDEX_SCALE),
|
||||
b.base(), b.address + (bOff << ArraysSupport.LOG2_ARRAY_LONG_INDEX_SCALE),
|
||||
length,
|
||||
ArraysSupport.LOG2_ARRAY_LONG_INDEX_SCALE);
|
||||
return i >= 0 ? i : -1;
|
||||
}
|
||||
for (; i < length; i++) {
|
||||
if (a.get(aOff + i) != b.get(bOff + i))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(DoubleBuffer a, int aOff, DoubleBuffer b, int bOff, int length) {
|
||||
int i = 0;
|
||||
if (length > 0 && a.order() == b.order()) {
|
||||
i = ArraysSupport.vectorizedMismatch(
|
||||
a.base(), a.address + (aOff << ArraysSupport.LOG2_ARRAY_DOUBLE_INDEX_SCALE),
|
||||
b.base(), b.address + (bOff << ArraysSupport.LOG2_ARRAY_DOUBLE_INDEX_SCALE),
|
||||
length,
|
||||
ArraysSupport.LOG2_ARRAY_DOUBLE_INDEX_SCALE);
|
||||
// Mismatched
|
||||
if (i >= 0) {
|
||||
// Check if mismatch is not associated with two NaN values; and
|
||||
// is not associated with +0 and -0
|
||||
double av = a.get(aOff + i);
|
||||
double bv = b.get(bOff + i);
|
||||
if (av != bv && (!Double.isNaN(av) || !Double.isNaN(bv)))
|
||||
return i;
|
||||
|
||||
// Fall back to slow mechanism
|
||||
// ISSUE: Consider looping over vectorizedMismatch adjusting ranges
|
||||
// However, requires that returned value be relative to input ranges
|
||||
i++;
|
||||
}
|
||||
// Matched
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
for (; i < length; i++) {
|
||||
double av = a.get(aOff + i);
|
||||
double bv = b.get(bOff + i);
|
||||
if (av != bv && (!Double.isNaN(av) || !Double.isNaN(bv)))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
@ -36,9 +36,6 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private
|
||||
|
||||
#if[rw]
|
||||
|
||||
// Cached unsafe-access object
|
||||
private static final Unsafe unsafe = Bits.unsafe();
|
||||
|
||||
protected final ByteBuffer bb;
|
||||
|
||||
#end[rw]
|
||||
@ -74,6 +71,11 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private
|
||||
#end[rw]
|
||||
}
|
||||
|
||||
@Override
|
||||
Object base() {
|
||||
return bb.hb;
|
||||
}
|
||||
|
||||
public $Type$Buffer slice() {
|
||||
int pos = this.position();
|
||||
int lim = this.limit();
|
||||
@ -117,20 +119,20 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private
|
||||
}
|
||||
|
||||
public $type$ get() {
|
||||
$memtype$ x = unsafe.get$Memtype$Unaligned(bb.hb, byteOffset(nextGetIndex()),
|
||||
$memtype$ x = UNSAFE.get$Memtype$Unaligned(bb.hb, byteOffset(nextGetIndex()),
|
||||
{#if[boB]?true:false});
|
||||
return $fromBits$(x);
|
||||
}
|
||||
|
||||
public $type$ get(int i) {
|
||||
$memtype$ x = unsafe.get$Memtype$Unaligned(bb.hb, byteOffset(checkIndex(i)),
|
||||
$memtype$ x = UNSAFE.get$Memtype$Unaligned(bb.hb, byteOffset(checkIndex(i)),
|
||||
{#if[boB]?true:false});
|
||||
return $fromBits$(x);
|
||||
}
|
||||
|
||||
#if[streamableType]
|
||||
$type$ getUnchecked(int i) {
|
||||
$memtype$ x = unsafe.get$Memtype$Unaligned(bb.hb, byteOffset(i),
|
||||
$memtype$ x = UNSAFE.get$Memtype$Unaligned(bb.hb, byteOffset(i),
|
||||
{#if[boB]?true:false});
|
||||
return $fromBits$(x);
|
||||
}
|
||||
@ -141,7 +143,7 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private
|
||||
public $Type$Buffer put($type$ x) {
|
||||
#if[rw]
|
||||
$memtype$ y = $toBits$(x);
|
||||
unsafe.put$Memtype$Unaligned(bb.hb, byteOffset(nextPutIndex()), y,
|
||||
UNSAFE.put$Memtype$Unaligned(bb.hb, byteOffset(nextPutIndex()), y,
|
||||
{#if[boB]?true:false});
|
||||
return this;
|
||||
#else[rw]
|
||||
@ -152,7 +154,7 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private
|
||||
public $Type$Buffer put(int i, $type$ x) {
|
||||
#if[rw]
|
||||
$memtype$ y = $toBits$(x);
|
||||
unsafe.put$Memtype$Unaligned(bb.hb, byteOffset(checkIndex(i)), y,
|
||||
UNSAFE.put$Memtype$Unaligned(bb.hb, byteOffset(checkIndex(i)), y,
|
||||
{#if[boB]?true:false});
|
||||
return this;
|
||||
#else[rw]
|
||||
@ -241,4 +243,9 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private
|
||||
#end[boL]
|
||||
}
|
||||
|
||||
#if[char]
|
||||
ByteOrder charRegionOrder() {
|
||||
return order();
|
||||
}
|
||||
#end[char]
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ class XXX {
|
||||
#if[rw]
|
||||
|
||||
private $type$ get$Type$(long a) {
|
||||
$memtype$ x = unsafe.get$Memtype$Unaligned(null, a, bigEndian);
|
||||
$memtype$ x = UNSAFE.get$Memtype$Unaligned(null, a, bigEndian);
|
||||
return $fromBits$(x);
|
||||
}
|
||||
|
||||
@ -49,7 +49,7 @@ class XXX {
|
||||
private ByteBuffer put$Type$(long a, $type$ x) {
|
||||
#if[rw]
|
||||
$memtype$ y = $toBits$(x);
|
||||
unsafe.put$Memtype$Unaligned(null, a, y, bigEndian);
|
||||
UNSAFE.put$Memtype$Unaligned(null, a, y, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -81,7 +81,7 @@ class XXX {
|
||||
int rem = (off <= lim ? lim - off : 0);
|
||||
|
||||
int size = rem >> $LG_BYTES_PER_VALUE$;
|
||||
if (!unaligned && ((address + off) % $BYTES_PER_VALUE$ != 0)) {
|
||||
if (!UNALIGNED && ((address + off) % $BYTES_PER_VALUE$ != 0)) {
|
||||
return (bigEndian
|
||||
? ($Type$Buffer)(new ByteBufferAs$Type$Buffer$RW$B(this,
|
||||
-1,
|
||||
|
@ -28,7 +28,6 @@
|
||||
package java.nio;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
import jdk.internal.misc.Unsafe;
|
||||
import jdk.internal.misc.VM;
|
||||
import jdk.internal.ref.Cleaner;
|
||||
import sun.nio.ch.DirectBuffer;
|
||||
@ -45,14 +44,11 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
|
||||
#if[rw]
|
||||
|
||||
// Cached unsafe-access object
|
||||
protected static final Unsafe unsafe = Bits.unsafe();
|
||||
|
||||
// Cached array base offset
|
||||
private static final long arrayBaseOffset = (long)unsafe.arrayBaseOffset($type$[].class);
|
||||
private static final long ARRAY_BASE_OFFSET = UNSAFE.arrayBaseOffset($type$[].class);
|
||||
|
||||
// Cached unaligned-access capability
|
||||
protected static final boolean unaligned = Bits.unaligned();
|
||||
protected static final boolean UNALIGNED = Bits.unaligned();
|
||||
|
||||
// Base address, used in all indexing calculations
|
||||
// NOTE: moved up to Buffer.java for speed in JNI GetDirectBufferAddress
|
||||
@ -73,8 +69,6 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
implements Runnable
|
||||
{
|
||||
|
||||
private static Unsafe unsafe = Unsafe.getUnsafe();
|
||||
|
||||
private long address;
|
||||
private long size;
|
||||
private int capacity;
|
||||
@ -91,7 +85,7 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
// Paranoia
|
||||
return;
|
||||
}
|
||||
unsafe.freeMemory(address);
|
||||
UNSAFE.freeMemory(address);
|
||||
address = 0;
|
||||
Bits.unreserveMemory(size, capacity);
|
||||
}
|
||||
@ -124,12 +118,12 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
|
||||
long base = 0;
|
||||
try {
|
||||
base = unsafe.allocateMemory(size);
|
||||
base = UNSAFE.allocateMemory(size);
|
||||
} catch (OutOfMemoryError x) {
|
||||
Bits.unreserveMemory(size, cap);
|
||||
throw x;
|
||||
}
|
||||
unsafe.setMemory(base, size, (byte) 0);
|
||||
UNSAFE.setMemory(base, size, (byte) 0);
|
||||
if (pa && (base % ps != 0)) {
|
||||
// Round up to page boundary
|
||||
address = base + ps - (base & (ps - 1));
|
||||
@ -206,6 +200,11 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
#end[rw]
|
||||
}
|
||||
|
||||
@Override
|
||||
Object base() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public $Type$Buffer slice() {
|
||||
int pos = this.position();
|
||||
int lim = this.limit();
|
||||
@ -258,16 +257,16 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
}
|
||||
|
||||
public $type$ get() {
|
||||
return $fromBits$($swap$(unsafe.get$Swaptype$(ix(nextGetIndex()))));
|
||||
return $fromBits$($swap$(UNSAFE.get$Swaptype$(ix(nextGetIndex()))));
|
||||
}
|
||||
|
||||
public $type$ get(int i) {
|
||||
return $fromBits$($swap$(unsafe.get$Swaptype$(ix(checkIndex(i)))));
|
||||
return $fromBits$($swap$(UNSAFE.get$Swaptype$(ix(checkIndex(i)))));
|
||||
}
|
||||
|
||||
#if[streamableType]
|
||||
$type$ getUnchecked(int i) {
|
||||
return $fromBits$($swap$(unsafe.get$Swaptype$(ix(i))));
|
||||
return $fromBits$($swap$(UNSAFE.get$Swaptype$(ix(i))));
|
||||
}
|
||||
#end[streamableType]
|
||||
|
||||
@ -282,10 +281,10 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
if (length > rem)
|
||||
throw new BufferUnderflowException();
|
||||
|
||||
long dstOffset = arrayBaseOffset + ((long)offset << $LG_BYTES_PER_VALUE$);
|
||||
long dstOffset = ARRAY_BASE_OFFSET + ((long)offset << $LG_BYTES_PER_VALUE$);
|
||||
#if[!byte]
|
||||
if (order() != ByteOrder.nativeOrder())
|
||||
unsafe.copySwapMemory(null,
|
||||
UNSAFE.copySwapMemory(null,
|
||||
ix(pos),
|
||||
dst,
|
||||
dstOffset,
|
||||
@ -293,7 +292,7 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
(long)1 << $LG_BYTES_PER_VALUE$);
|
||||
else
|
||||
#end[!byte]
|
||||
unsafe.copyMemory(null,
|
||||
UNSAFE.copyMemory(null,
|
||||
ix(pos),
|
||||
dst,
|
||||
dstOffset,
|
||||
@ -312,7 +311,7 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
|
||||
public $Type$Buffer put($type$ x) {
|
||||
#if[rw]
|
||||
unsafe.put$Swaptype$(ix(nextPutIndex()), $swap$($toBits$(x)));
|
||||
UNSAFE.put$Swaptype$(ix(nextPutIndex()), $swap$($toBits$(x)));
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -321,7 +320,7 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
|
||||
public $Type$Buffer put(int i, $type$ x) {
|
||||
#if[rw]
|
||||
unsafe.put$Swaptype$(ix(checkIndex(i)), $swap$($toBits$(x)));
|
||||
UNSAFE.put$Swaptype$(ix(checkIndex(i)), $swap$($toBits$(x)));
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -347,7 +346,7 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
|
||||
if (srem > rem)
|
||||
throw new BufferOverflowException();
|
||||
unsafe.copyMemory(sb.ix(spos), ix(pos), (long)srem << $LG_BYTES_PER_VALUE$);
|
||||
UNSAFE.copyMemory(sb.ix(spos), ix(pos), (long)srem << $LG_BYTES_PER_VALUE$);
|
||||
sb.position(spos + srem);
|
||||
position(pos + srem);
|
||||
} else if (src.hb != null) {
|
||||
@ -380,10 +379,10 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
if (length > rem)
|
||||
throw new BufferOverflowException();
|
||||
|
||||
long srcOffset = arrayBaseOffset + ((long)offset << $LG_BYTES_PER_VALUE$);
|
||||
long srcOffset = ARRAY_BASE_OFFSET + ((long)offset << $LG_BYTES_PER_VALUE$);
|
||||
#if[!byte]
|
||||
if (order() != ByteOrder.nativeOrder())
|
||||
unsafe.copySwapMemory(src,
|
||||
UNSAFE.copySwapMemory(src,
|
||||
srcOffset,
|
||||
null,
|
||||
ix(pos),
|
||||
@ -391,7 +390,7 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
(long)1 << $LG_BYTES_PER_VALUE$);
|
||||
else
|
||||
#end[!byte]
|
||||
unsafe.copyMemory(src,
|
||||
UNSAFE.copyMemory(src,
|
||||
srcOffset,
|
||||
null,
|
||||
ix(pos),
|
||||
@ -413,7 +412,7 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
assert (pos <= lim);
|
||||
int rem = (pos <= lim ? lim - pos : 0);
|
||||
|
||||
unsafe.copyMemory(ix(pos), ix(0), (long)rem << $LG_BYTES_PER_VALUE$);
|
||||
UNSAFE.copyMemory(ix(pos), ix(0), (long)rem << $LG_BYTES_PER_VALUE$);
|
||||
position(rem);
|
||||
limit(capacity());
|
||||
discardMark();
|
||||
@ -490,17 +489,22 @@ class Direct$Type$Buffer$RW$$BO$
|
||||
|
||||
#end[!byte]
|
||||
|
||||
#if[char]
|
||||
ByteOrder charRegionOrder() {
|
||||
return order();
|
||||
}
|
||||
#end[char]
|
||||
|
||||
|
||||
#if[byte]
|
||||
|
||||
byte _get(int i) { // package-private
|
||||
return unsafe.getByte(address + i);
|
||||
return UNSAFE.getByte(address + i);
|
||||
}
|
||||
|
||||
void _put(int i, byte b) { // package-private
|
||||
#if[rw]
|
||||
unsafe.putByte(address + i, b);
|
||||
UNSAFE.putByte(address + i, b);
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
#end[rw]
|
||||
|
@ -27,8 +27,6 @@
|
||||
|
||||
package java.nio;
|
||||
|
||||
import jdk.internal.misc.Unsafe;
|
||||
|
||||
/**
|
||||
#if[rw]
|
||||
* A read/write Heap$Type$Buffer.
|
||||
@ -43,6 +41,11 @@ import jdk.internal.misc.Unsafe;
|
||||
class Heap$Type$Buffer$RW$
|
||||
extends {#if[ro]?Heap}$Type$Buffer
|
||||
{
|
||||
// Cached array base offset
|
||||
private static final long ARRAY_BASE_OFFSET = UNSAFE.arrayBaseOffset($type$[].class);
|
||||
|
||||
// Cached array base offset
|
||||
private static final long ARRAY_INDEX_SCALE = UNSAFE.arrayIndexScale($type$[].class);
|
||||
|
||||
// For speed these fields are actually declared in X-Buffer;
|
||||
// these declarations are here as documentation
|
||||
@ -53,16 +56,6 @@ class Heap$Type$Buffer$RW$
|
||||
#end[rw]
|
||||
*/
|
||||
|
||||
#if[byte]
|
||||
|
||||
// Cached unsafe-access object
|
||||
private static final Unsafe unsafe = Bits.unsafe();
|
||||
|
||||
// Cached array base offset
|
||||
private static final long arrayBaseOffset = unsafe.arrayBaseOffset($type$[].class);
|
||||
|
||||
#end[byte]
|
||||
|
||||
Heap$Type$Buffer$RW$(int cap, int lim) { // package-private
|
||||
#if[rw]
|
||||
super(-1, 0, lim, cap, new $type$[cap], 0);
|
||||
@ -70,13 +63,11 @@ class Heap$Type$Buffer$RW$
|
||||
hb = new $type$[cap];
|
||||
offset = 0;
|
||||
*/
|
||||
this.address = ARRAY_BASE_OFFSET;
|
||||
#else[rw]
|
||||
super(cap, lim);
|
||||
this.isReadOnly = true;
|
||||
#end[rw]
|
||||
#if[byte]
|
||||
this.address = arrayBaseOffset;
|
||||
#end[byte]
|
||||
}
|
||||
|
||||
Heap$Type$Buffer$RW$($type$[] buf, int off, int len) { // package-private
|
||||
@ -86,13 +77,11 @@ class Heap$Type$Buffer$RW$
|
||||
hb = buf;
|
||||
offset = 0;
|
||||
*/
|
||||
this.address = ARRAY_BASE_OFFSET;
|
||||
#else[rw]
|
||||
super(buf, off, len);
|
||||
this.isReadOnly = true;
|
||||
#end[rw]
|
||||
#if[byte]
|
||||
this.address = arrayBaseOffset;
|
||||
#end[byte]
|
||||
}
|
||||
|
||||
protected Heap$Type$Buffer$RW$($type$[] buf,
|
||||
@ -105,13 +94,11 @@ class Heap$Type$Buffer$RW$
|
||||
hb = buf;
|
||||
offset = off;
|
||||
*/
|
||||
this.address = ARRAY_BASE_OFFSET + off * ARRAY_INDEX_SCALE;
|
||||
#else[rw]
|
||||
super(buf, mark, pos, lim, cap, off);
|
||||
this.isReadOnly = true;
|
||||
#end[rw]
|
||||
#if[byte]
|
||||
this.address = arrayBaseOffset + off;
|
||||
#end[byte]
|
||||
}
|
||||
|
||||
public $Type$Buffer slice() {
|
||||
@ -296,18 +283,18 @@ class Heap$Type$Buffer$RW$
|
||||
#if[rw]
|
||||
|
||||
public char getChar() {
|
||||
return unsafe.getCharUnaligned(hb, byteOffset(nextGetIndex(2)), bigEndian);
|
||||
return UNSAFE.getCharUnaligned(hb, byteOffset(nextGetIndex(2)), bigEndian);
|
||||
}
|
||||
|
||||
public char getChar(int i) {
|
||||
return unsafe.getCharUnaligned(hb, byteOffset(checkIndex(i, 2)), bigEndian);
|
||||
return UNSAFE.getCharUnaligned(hb, byteOffset(checkIndex(i, 2)), bigEndian);
|
||||
}
|
||||
|
||||
#end[rw]
|
||||
|
||||
public $Type$Buffer putChar(char x) {
|
||||
#if[rw]
|
||||
unsafe.putCharUnaligned(hb, byteOffset(nextPutIndex(2)), x, bigEndian);
|
||||
UNSAFE.putCharUnaligned(hb, byteOffset(nextPutIndex(2)), x, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -316,7 +303,7 @@ class Heap$Type$Buffer$RW$
|
||||
|
||||
public $Type$Buffer putChar(int i, char x) {
|
||||
#if[rw]
|
||||
unsafe.putCharUnaligned(hb, byteOffset(checkIndex(i, 2)), x, bigEndian);
|
||||
UNSAFE.putCharUnaligned(hb, byteOffset(checkIndex(i, 2)), x, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -347,18 +334,18 @@ class Heap$Type$Buffer$RW$
|
||||
#if[rw]
|
||||
|
||||
public short getShort() {
|
||||
return unsafe.getShortUnaligned(hb, byteOffset(nextGetIndex(2)), bigEndian);
|
||||
return UNSAFE.getShortUnaligned(hb, byteOffset(nextGetIndex(2)), bigEndian);
|
||||
}
|
||||
|
||||
public short getShort(int i) {
|
||||
return unsafe.getShortUnaligned(hb, byteOffset(checkIndex(i, 2)), bigEndian);
|
||||
return UNSAFE.getShortUnaligned(hb, byteOffset(checkIndex(i, 2)), bigEndian);
|
||||
}
|
||||
|
||||
#end[rw]
|
||||
|
||||
public $Type$Buffer putShort(short x) {
|
||||
#if[rw]
|
||||
unsafe.putShortUnaligned(hb, byteOffset(nextPutIndex(2)), x, bigEndian);
|
||||
UNSAFE.putShortUnaligned(hb, byteOffset(nextPutIndex(2)), x, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -367,7 +354,7 @@ class Heap$Type$Buffer$RW$
|
||||
|
||||
public $Type$Buffer putShort(int i, short x) {
|
||||
#if[rw]
|
||||
unsafe.putShortUnaligned(hb, byteOffset(checkIndex(i, 2)), x, bigEndian);
|
||||
UNSAFE.putShortUnaligned(hb, byteOffset(checkIndex(i, 2)), x, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -398,18 +385,18 @@ class Heap$Type$Buffer$RW$
|
||||
#if[rw]
|
||||
|
||||
public int getInt() {
|
||||
return unsafe.getIntUnaligned(hb, byteOffset(nextGetIndex(4)), bigEndian);
|
||||
return UNSAFE.getIntUnaligned(hb, byteOffset(nextGetIndex(4)), bigEndian);
|
||||
}
|
||||
|
||||
public int getInt(int i) {
|
||||
return unsafe.getIntUnaligned(hb, byteOffset(checkIndex(i, 4)), bigEndian);
|
||||
return UNSAFE.getIntUnaligned(hb, byteOffset(checkIndex(i, 4)), bigEndian);
|
||||
}
|
||||
|
||||
#end[rw]
|
||||
|
||||
public $Type$Buffer putInt(int x) {
|
||||
#if[rw]
|
||||
unsafe.putIntUnaligned(hb, byteOffset(nextPutIndex(4)), x, bigEndian);
|
||||
UNSAFE.putIntUnaligned(hb, byteOffset(nextPutIndex(4)), x, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -418,7 +405,7 @@ class Heap$Type$Buffer$RW$
|
||||
|
||||
public $Type$Buffer putInt(int i, int x) {
|
||||
#if[rw]
|
||||
unsafe.putIntUnaligned(hb, byteOffset(checkIndex(i, 4)), x, bigEndian);
|
||||
UNSAFE.putIntUnaligned(hb, byteOffset(checkIndex(i, 4)), x, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -449,18 +436,18 @@ class Heap$Type$Buffer$RW$
|
||||
#if[rw]
|
||||
|
||||
public long getLong() {
|
||||
return unsafe.getLongUnaligned(hb, byteOffset(nextGetIndex(8)), bigEndian);
|
||||
return UNSAFE.getLongUnaligned(hb, byteOffset(nextGetIndex(8)), bigEndian);
|
||||
}
|
||||
|
||||
public long getLong(int i) {
|
||||
return unsafe.getLongUnaligned(hb, byteOffset(checkIndex(i, 8)), bigEndian);
|
||||
return UNSAFE.getLongUnaligned(hb, byteOffset(checkIndex(i, 8)), bigEndian);
|
||||
}
|
||||
|
||||
#end[rw]
|
||||
|
||||
public $Type$Buffer putLong(long x) {
|
||||
#if[rw]
|
||||
unsafe.putLongUnaligned(hb, byteOffset(nextPutIndex(8)), x, bigEndian);
|
||||
UNSAFE.putLongUnaligned(hb, byteOffset(nextPutIndex(8)), x, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -469,7 +456,7 @@ class Heap$Type$Buffer$RW$
|
||||
|
||||
public $Type$Buffer putLong(int i, long x) {
|
||||
#if[rw]
|
||||
unsafe.putLongUnaligned(hb, byteOffset(checkIndex(i, 8)), x, bigEndian);
|
||||
UNSAFE.putLongUnaligned(hb, byteOffset(checkIndex(i, 8)), x, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -500,12 +487,12 @@ class Heap$Type$Buffer$RW$
|
||||
#if[rw]
|
||||
|
||||
public float getFloat() {
|
||||
int x = unsafe.getIntUnaligned(hb, byteOffset(nextGetIndex(4)), bigEndian);
|
||||
int x = UNSAFE.getIntUnaligned(hb, byteOffset(nextGetIndex(4)), bigEndian);
|
||||
return Float.intBitsToFloat(x);
|
||||
}
|
||||
|
||||
public float getFloat(int i) {
|
||||
int x = unsafe.getIntUnaligned(hb, byteOffset(checkIndex(i, 4)), bigEndian);
|
||||
int x = UNSAFE.getIntUnaligned(hb, byteOffset(checkIndex(i, 4)), bigEndian);
|
||||
return Float.intBitsToFloat(x);
|
||||
}
|
||||
|
||||
@ -514,7 +501,7 @@ class Heap$Type$Buffer$RW$
|
||||
public $Type$Buffer putFloat(float x) {
|
||||
#if[rw]
|
||||
int y = Float.floatToRawIntBits(x);
|
||||
unsafe.putIntUnaligned(hb, byteOffset(nextPutIndex(4)), y, bigEndian);
|
||||
UNSAFE.putIntUnaligned(hb, byteOffset(nextPutIndex(4)), y, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -524,7 +511,7 @@ class Heap$Type$Buffer$RW$
|
||||
public $Type$Buffer putFloat(int i, float x) {
|
||||
#if[rw]
|
||||
int y = Float.floatToRawIntBits(x);
|
||||
unsafe.putIntUnaligned(hb, byteOffset(checkIndex(i, 4)), y, bigEndian);
|
||||
UNSAFE.putIntUnaligned(hb, byteOffset(checkIndex(i, 4)), y, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -555,12 +542,12 @@ class Heap$Type$Buffer$RW$
|
||||
#if[rw]
|
||||
|
||||
public double getDouble() {
|
||||
long x = unsafe.getLongUnaligned(hb, byteOffset(nextGetIndex(8)), bigEndian);
|
||||
long x = UNSAFE.getLongUnaligned(hb, byteOffset(nextGetIndex(8)), bigEndian);
|
||||
return Double.longBitsToDouble(x);
|
||||
}
|
||||
|
||||
public double getDouble(int i) {
|
||||
long x = unsafe.getLongUnaligned(hb, byteOffset(checkIndex(i, 8)), bigEndian);
|
||||
long x = UNSAFE.getLongUnaligned(hb, byteOffset(checkIndex(i, 8)), bigEndian);
|
||||
return Double.longBitsToDouble(x);
|
||||
}
|
||||
|
||||
@ -569,7 +556,7 @@ class Heap$Type$Buffer$RW$
|
||||
public $Type$Buffer putDouble(double x) {
|
||||
#if[rw]
|
||||
long y = Double.doubleToRawLongBits(x);
|
||||
unsafe.putLongUnaligned(hb, byteOffset(nextPutIndex(8)), y, bigEndian);
|
||||
UNSAFE.putLongUnaligned(hb, byteOffset(nextPutIndex(8)), y, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -579,7 +566,7 @@ class Heap$Type$Buffer$RW$
|
||||
public $Type$Buffer putDouble(int i, double x) {
|
||||
#if[rw]
|
||||
long y = Double.doubleToRawLongBits(x);
|
||||
unsafe.putLongUnaligned(hb, byteOffset(checkIndex(i, 8)), y, bigEndian);
|
||||
UNSAFE.putLongUnaligned(hb, byteOffset(checkIndex(i, 8)), y, bigEndian);
|
||||
return this;
|
||||
#else[rw]
|
||||
throw new ReadOnlyBufferException();
|
||||
@ -643,7 +630,11 @@ class Heap$Type$Buffer$RW$
|
||||
public ByteOrder order() {
|
||||
return ByteOrder.nativeOrder();
|
||||
}
|
||||
|
||||
#end[!byte]
|
||||
#if[char]
|
||||
|
||||
ByteOrder charRegionOrder() {
|
||||
return order();
|
||||
}
|
||||
#end[char]
|
||||
}
|
||||
|
@ -127,4 +127,30 @@ class StringCharBuffer // package-private
|
||||
return ByteOrder.nativeOrder();
|
||||
}
|
||||
|
||||
ByteOrder charRegionOrder() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean equals(Object ob) {
|
||||
if (this == ob)
|
||||
return true;
|
||||
if (!(ob instanceof CharBuffer))
|
||||
return false;
|
||||
CharBuffer that = (CharBuffer)ob;
|
||||
if (this.remaining() != that.remaining())
|
||||
return false;
|
||||
return BufferMismatch.mismatch(this, this.position(),
|
||||
that, that.position(),
|
||||
this.remaining()) < 0;
|
||||
}
|
||||
|
||||
public int compareTo(CharBuffer that) {
|
||||
int i = BufferMismatch.mismatch(this, this.position(),
|
||||
that, that.position(),
|
||||
Math.min(this.remaining(), that.remaining()));
|
||||
if (i >= 0) {
|
||||
return Character.compare(this.get(this.position() + i), that.get(this.position() + i));
|
||||
}
|
||||
return this.remaining() - that.remaining();
|
||||
}
|
||||
}
|
||||
|
@ -36,6 +36,8 @@ import java.util.stream.StreamSupport;
|
||||
import java.util.stream.$Streamtype$Stream;
|
||||
#end[streamableType]
|
||||
|
||||
import jdk.internal.util.ArraysSupport;
|
||||
|
||||
/**
|
||||
* $A$ $type$ buffer.
|
||||
*
|
||||
@ -287,6 +289,11 @@ public abstract class $Type$Buffer
|
||||
this(mark, pos, lim, cap, null, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
Object base() {
|
||||
return hb;
|
||||
}
|
||||
|
||||
#if[byte]
|
||||
|
||||
/**
|
||||
@ -1297,19 +1304,9 @@ public abstract class $Type$Buffer
|
||||
$Type$Buffer that = ($Type$Buffer)ob;
|
||||
if (this.remaining() != that.remaining())
|
||||
return false;
|
||||
int p = this.position();
|
||||
for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--)
|
||||
if (!equals(this.get(i), that.get(j)))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean equals($type$ x, $type$ y) {
|
||||
#if[floatingPointType]
|
||||
return (x == y) || ($Fulltype$.isNaN(x) && $Fulltype$.isNaN(y));
|
||||
#else[floatingPointType]
|
||||
return x == y;
|
||||
#end[floatingPointType]
|
||||
return BufferMismatch.mismatch(this, this.position(),
|
||||
that, that.position(),
|
||||
this.remaining()) < 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1336,11 +1333,11 @@ public abstract class $Type$Buffer
|
||||
* is less than, equal to, or greater than the given buffer
|
||||
*/
|
||||
public int compareTo($Type$Buffer that) {
|
||||
int n = this.position() + Math.min(this.remaining(), that.remaining());
|
||||
for (int i = this.position(), j = that.position(); i < n; i++, j++) {
|
||||
int cmp = compare(this.get(i), that.get(j));
|
||||
if (cmp != 0)
|
||||
return cmp;
|
||||
int i = BufferMismatch.mismatch(this, this.position(),
|
||||
that, that.position(),
|
||||
Math.min(this.remaining(), that.remaining()));
|
||||
if (i >= 0) {
|
||||
return compare(this.get(this.position() + i), that.get(this.position() + i));
|
||||
}
|
||||
return this.remaining() - that.remaining();
|
||||
}
|
||||
@ -1571,6 +1568,12 @@ public abstract class $Type$Buffer
|
||||
|
||||
#end[!byte]
|
||||
|
||||
#if[char]
|
||||
// The order or null if the buffer does not cover a memory region,
|
||||
// such as StringCharBuffer
|
||||
abstract ByteOrder charRegionOrder();
|
||||
#end[char]
|
||||
|
||||
#if[byte]
|
||||
|
||||
boolean bigEndian // package-private
|
||||
|
@ -2954,22 +2954,6 @@ public final class Files {
|
||||
return newBufferedWriter(path, StandardCharsets.UTF_8, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads all bytes from an input stream and writes them to an output stream.
|
||||
*/
|
||||
private static long copy(InputStream source, OutputStream sink)
|
||||
throws IOException
|
||||
{
|
||||
long nread = 0L;
|
||||
byte[] buf = new byte[BUFFER_SIZE];
|
||||
int n;
|
||||
while ((n = source.read(buf)) > 0) {
|
||||
sink.write(buf, 0, n);
|
||||
nread += n;
|
||||
}
|
||||
return nread;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies all bytes from an input stream to a file. On return, the input
|
||||
* stream will be at end of stream.
|
||||
@ -3082,7 +3066,7 @@ public final class Files {
|
||||
|
||||
// do the copy
|
||||
try (OutputStream out = ostream) {
|
||||
return copy(in, out);
|
||||
return in.transferTo(out);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3124,7 +3108,7 @@ public final class Files {
|
||||
Objects.requireNonNull(out);
|
||||
|
||||
try (InputStream in = newInputStream(source)) {
|
||||
return copy(in, out);
|
||||
return in.transferTo(out);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
package java.util;
|
||||
|
||||
import jdk.internal.HotSpotIntrinsicCandidate;
|
||||
import jdk.internal.util.ArraysSupport;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
|
@ -204,58 +204,70 @@ import static sun.security.util.SecurityConstants.GET_CLASSLOADER_PERMISSION;
|
||||
* known concrete subclasses {@code ListResourceBundle} and
|
||||
* {@code PropertyResourceBundle} are thread-safe.
|
||||
*
|
||||
* <h3><a id="bundleprovider">Resource Bundles in Named Modules</a></h3>
|
||||
* <h3><a id="resource-bundle-modules">Resource Bundles and Named Modules</a></h3>
|
||||
*
|
||||
* When resource bundles are deployed in named modules, the following
|
||||
* module-specific requirements and restrictions are applied.
|
||||
* Resource bundles can be deployed in modules in the following ways:
|
||||
*
|
||||
* <ul>
|
||||
* <li>Code in a named module that calls {@link #getBundle(String, Locale)}
|
||||
* will locate resource bundles in the caller's module (<em>caller module</em>).</li>
|
||||
* <li>If resource bundles are deployed in named modules separate from
|
||||
* the caller module, those resource bundles need to be loaded from service
|
||||
* providers of {@link ResourceBundleProvider}. The caller module must declare
|
||||
* "{@code uses}" and the service interface name is the concatenation of the
|
||||
* package name of the base name, string "{@code .spi.}", the simple class
|
||||
* name of the base name, and the string "{@code Provider}". The
|
||||
* <em>bundle provider modules</em> containing resource bundles must
|
||||
* declare "{@code provides}" with the service interface name and
|
||||
* its implementation class name. For example, if the base name is
|
||||
* "{@code com.example.app.MyResources}", the caller module must declare
|
||||
* "{@code uses com.example.app.spi.MyResourcesProvider;}" and a module containing resource
|
||||
* bundles must declare "{@code provides com.example.app.spi.MyResourcesProvider
|
||||
* with com.example.app.internal.MyResourcesProviderImpl;}"
|
||||
* where {@code com.example.app.internal.MyResourcesProviderImpl} is an
|
||||
* implementation class of {@code com.example.app.spi.MyResourcesProvider}.</li>
|
||||
* <li>If you want to use non-standard formats in named modules, such as XML,
|
||||
* {@link ResourceBundleProvider} needs to be used.</li>
|
||||
* <li>The {@code getBundle} method with a {@code ClassLoader} may not be able to
|
||||
* find resource bundles using the given {@code ClassLoader} in named modules.
|
||||
* The {@code getBundle} method with a {@code Module} can be used, instead.</li>
|
||||
* <li>{@code ResourceBundle.Control} is <em>not</em> supported in named modules.
|
||||
* If the {@code getBundle} method with a {@code ResourceBundle.Control} is called
|
||||
* in a named module, the method will throw an {@code UnsupportedOperationException}.
|
||||
* Any service providers of {@link ResourceBundleControlProvider} are ignored in
|
||||
* named modules.
|
||||
* </li>
|
||||
* </ul>
|
||||
* <h4>Resource bundles together with an application</h4>
|
||||
*
|
||||
* <h3><a id="RBP_support">ResourceBundleProvider Service Providers</a></h3>
|
||||
* Resource bundles can be deployed together with an application in the same
|
||||
* module. In that case, the resource bundles are loaded
|
||||
* by code in the module by calling the {@link #getBundle(String)}
|
||||
* or {@link #getBundle(String, Locale)} method.
|
||||
*
|
||||
* The {@code getBundle} factory methods load service providers of
|
||||
* {@link ResourceBundleProvider}, if available, using {@link ServiceLoader}.
|
||||
* The service type is designated by
|
||||
* {@code <package name> + ".spi." + <simple name> + "Provider"}. For
|
||||
* example, if the base name is "{@code com.example.app.MyResources}", the service
|
||||
* type is {@code com.example.app.spi.MyResourcesProvider}.
|
||||
* <p>
|
||||
* In named modules, the loaded service providers for the given base name are
|
||||
* used to load resource bundles. If no service provider is available, or if
|
||||
* none of the service providers returns a resource bundle and the caller module
|
||||
* doesn't have its own service provider, the {@code getBundle} factory method
|
||||
* searches for resource bundles that are local in the caller module and that
|
||||
* are visible to the class loader of the caller module. The resource bundle
|
||||
* formats for local module searching are "java.class" and "java.properties".
|
||||
* <h4><a id="service-providers">Resource bundles as service providers</a></h4>
|
||||
*
|
||||
* Resource bundles can be deployed in one or more <em>service provider modules</em>
|
||||
* and they can be located using {@link ServiceLoader}.
|
||||
* A {@linkplain ResourceBundleProvider service} interface or class must be
|
||||
* defined. The caller module declares that it uses the service, the service
|
||||
* provider modules declare that they provide implementations of the service.
|
||||
* Refer to {@link ResourceBundleProvider} for developing resource bundle
|
||||
* services and deploying resource bundle providers.
|
||||
* The module obtaining the resource bundle can be a resource bundle
|
||||
* provider itself; in which case this module only locates the resource bundle
|
||||
* via service provider mechanism.
|
||||
*
|
||||
* <p>A {@linkplain ResourceBundleProvider resource bundle provider} can
|
||||
* provide resource bundles in any format such XML which replaces the need
|
||||
* of {@link Control ResourceBundle.Control}.
|
||||
*
|
||||
* <h4><a id="other-modules">Resource bundles in other modules and class path</a></h4>
|
||||
*
|
||||
* Resource bundles in a named module may be <em>encapsulated</em> so that
|
||||
* it cannot be located by code in other modules. Resource bundles
|
||||
* in unnamed modules and class path are open for any module to access.
|
||||
* Resource bundle follows the resource encapsulation rules as specified
|
||||
* in {@link Module#getResourceAsStream(String)}.
|
||||
*
|
||||
* <p>The {@code getBundle} factory methods with no {@code Control} parameter
|
||||
* locate and load resource bundles from
|
||||
* {@linkplain ResourceBundleProvider service providers}.
|
||||
* It may continue the search as if calling {@link Module#getResourceAsStream(String)}
|
||||
* to find the named resource from a given module and calling
|
||||
* {@link ClassLoader#getResourceAsStream(String)}; refer to
|
||||
* the specification of the {@code getBundle} method for details.
|
||||
* Only non-encapsulated resource bundles of "{@code java.class}"
|
||||
* or "{@code java.properties}" format are searched.
|
||||
*
|
||||
* <p>If the caller module is a
|
||||
* <a href="{@docRoot}/java/util/spi/ResourceBundleProvider.html#obtain-resource-bundle">
|
||||
* resource bundle provider</a>, it does not fall back to the
|
||||
* class loader search.
|
||||
*
|
||||
* <h4>Resource bundles in automatic modules</h4>
|
||||
*
|
||||
* A common format of resource bundles is in {@linkplain PropertyResourceBundle
|
||||
* .properties} file format. Typically {@code .properties} resource bundles
|
||||
* are packaged in a JAR file. Resource bundle only JAR file can be readily
|
||||
* deployed as an <a href="{@docRoot}/java/lang/module/ModuleFinder.html#automatic-modules">
|
||||
* automatic module</a>. For example, if the JAR file contains the
|
||||
* entry "{@code p/q/Foo_ja.properties}" and no {@code .class} entry,
|
||||
* when resolved and defined as an automatic module, no package is derived
|
||||
* for this module. This allows resource bundles in {@code .properties}
|
||||
* format packaged in one or more JAR files that may contain entries
|
||||
* in the same directory and can be resolved successfully as
|
||||
* automatic modules.
|
||||
*
|
||||
* <h3>ResourceBundle.Control</h3>
|
||||
*
|
||||
@ -268,6 +280,14 @@ import static sun.security.util.SecurityConstants.GET_CLASSLOADER_PERMISSION;
|
||||
* {@link #getBundle(String, Locale, ClassLoader, Control) getBundle}
|
||||
* factory method for details.
|
||||
*
|
||||
* <p> {@link ResourceBundle.Control} is designed for an application deployed
|
||||
* in an unnamed module, for example to support resource bundles in
|
||||
* non-standard formats or package localized resources in a non-traditional
|
||||
* convention. {@link ResourceBundleProvider} is the replacement for
|
||||
* {@code ResourceBundle.Control} when migrating to modules.
|
||||
* {@code UnsupportedOperationException} will be thrown when a factory
|
||||
* method that takes the {@code ResourceBundle.Control} parameter is called.
|
||||
*
|
||||
* <p><a id="modify_default_behavior">For the {@code getBundle} factory</a>
|
||||
* methods that take no {@link Control} instance, their <a
|
||||
* href="#default_behavior"> default behavior</a> of resource bundle loading
|
||||
@ -815,14 +835,10 @@ public abstract class ResourceBundle {
|
||||
|
||||
/**
|
||||
* Gets a resource bundle using the specified base name, the default locale,
|
||||
* and the caller's class loader. Calling this method is equivalent to calling
|
||||
* and the caller module. Calling this method is equivalent to calling
|
||||
* <blockquote>
|
||||
* <code>getBundle(baseName, Locale.getDefault(), this.getClass().getClassLoader())</code>,
|
||||
* <code>getBundle(baseName, Locale.getDefault(), callerModule)</code>,
|
||||
* </blockquote>
|
||||
* except that <code>getClassLoader()</code> is run with the security
|
||||
* privileges of <code>ResourceBundle</code>.
|
||||
* See {@link #getBundle(String, Locale, ClassLoader) getBundle}
|
||||
* for a complete description of the search and instantiation strategy.
|
||||
*
|
||||
* @param baseName the base name of the resource bundle, a fully qualified class name
|
||||
* @exception java.lang.NullPointerException
|
||||
@ -830,6 +846,9 @@ public abstract class ResourceBundle {
|
||||
* @exception MissingResourceException
|
||||
* if no resource bundle for the specified base name can be found
|
||||
* @return a resource bundle for the given base name and the default locale
|
||||
*
|
||||
* @see <a href="#default_behavior">Resource Bundle Search and Loading Strategy</a>
|
||||
* @see <a href="#resource-bundle-modules">Resource Bundles and Named Modules</a>
|
||||
*/
|
||||
@CallerSensitive
|
||||
public static final ResourceBundle getBundle(String baseName)
|
||||
@ -887,14 +906,10 @@ public abstract class ResourceBundle {
|
||||
|
||||
/**
|
||||
* Gets a resource bundle using the specified base name and locale,
|
||||
* and the caller's class loader. Calling this method is equivalent to calling
|
||||
* and the caller module. Calling this method is equivalent to calling
|
||||
* <blockquote>
|
||||
* <code>getBundle(baseName, locale, this.getClass().getClassLoader())</code>,
|
||||
* <code>getBundle(baseName, locale, callerModule)</code>,
|
||||
* </blockquote>
|
||||
* except that <code>getClassLoader()</code> is run with the security
|
||||
* privileges of <code>ResourceBundle</code>.
|
||||
* See {@link #getBundle(String, Locale, ClassLoader) getBundle}
|
||||
* for a complete description of the search and instantiation strategy.
|
||||
*
|
||||
* @param baseName
|
||||
* the base name of the resource bundle, a fully qualified class name
|
||||
@ -905,6 +920,9 @@ public abstract class ResourceBundle {
|
||||
* @exception MissingResourceException
|
||||
* if no resource bundle for the specified base name can be found
|
||||
* @return a resource bundle for the given base name and locale
|
||||
*
|
||||
* @see <a href="#default_behavior">Resource Bundle Search and Loading Strategy</a>
|
||||
* @see <a href="#resource-bundle-modules">Resource Bundles and Named Modules</a>
|
||||
*/
|
||||
@CallerSensitive
|
||||
public static final ResourceBundle getBundle(String baseName,
|
||||
@ -922,19 +940,6 @@ public abstract class ResourceBundle {
|
||||
* <code>getBundle(baseName, Locale.getDefault(), module)</code>
|
||||
* </blockquote>
|
||||
*
|
||||
* <p> Resource bundles in named modules may be encapsulated. When
|
||||
* the resource bundle is loaded from a provider, the caller module
|
||||
* must have an appropriate <i>uses</i> clause in its <i>module descriptor</i>
|
||||
* to declare that the module uses implementations of
|
||||
* {@code <package name> + ".spi." + <simple name> + "Provider"}.
|
||||
* Otherwise, it will load the resource bundles that are local in the
|
||||
* given module or that are visible to the class loader of the given module
|
||||
* (refer to the <a href="#bundleprovider">Resource Bundles in Named Modules</a>
|
||||
* section for details).
|
||||
* When the resource bundle is loaded from the specified module, it is
|
||||
* subject to the encapsulation rules specified by
|
||||
* {@link Module#getResourceAsStream Module.getResourceAsStream}.
|
||||
*
|
||||
* @param baseName the base name of the resource bundle,
|
||||
* a fully qualified class name
|
||||
* @param module the module for which the resource bundle is searched
|
||||
@ -950,6 +955,8 @@ public abstract class ResourceBundle {
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
* @see ResourceBundleProvider
|
||||
* @see <a href="#default_behavior">Resource Bundle Search and Loading Strategy</a>
|
||||
* @see <a href="#resource-bundle-modules">Resource Bundles and Named Modules</a>
|
||||
*/
|
||||
@CallerSensitive
|
||||
public static ResourceBundle getBundle(String baseName, Module module) {
|
||||
@ -963,14 +970,15 @@ public abstract class ResourceBundle {
|
||||
* on behalf of the specified module.
|
||||
*
|
||||
* <p> Resource bundles in named modules may be encapsulated. When
|
||||
* the resource bundle is loaded from a provider, the caller module
|
||||
* the resource bundle is loaded from a
|
||||
* {@linkplain ResourceBundleProvider service provider}, the caller module
|
||||
* must have an appropriate <i>uses</i> clause in its <i>module descriptor</i>
|
||||
* to declare that the module uses implementations of
|
||||
* {@code <package name> + ".spi." + <simple name> + "Provider"}.
|
||||
* to declare that the module uses of {@link ResourceBundleProvider}
|
||||
* for the named resource bundle.
|
||||
* Otherwise, it will load the resource bundles that are local in the
|
||||
* given module or that are visible to the class loader of the given module
|
||||
* (refer to the <a href="#bundleprovider">Resource Bundles in Named Modules</a>
|
||||
* section for details).
|
||||
* given module as if calling {@link Module#getResourceAsStream(String)}
|
||||
* or that are visible to the class loader of the given module
|
||||
* as if calling {@link ClassLoader#getResourceAsStream(String)}.
|
||||
* When the resource bundle is loaded from the specified module, it is
|
||||
* subject to the encapsulation rules specified by
|
||||
* {@link Module#getResourceAsStream Module.getResourceAsStream}.
|
||||
@ -1000,6 +1008,8 @@ public abstract class ResourceBundle {
|
||||
* @return a resource bundle for the given base name and locale in the module
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
* @see <a href="#default_behavior">Resource Bundle Search and Loading Strategy</a>
|
||||
* @see <a href="#resource-bundle-modules">Resource Bundles and Named Modules</a>
|
||||
*/
|
||||
@CallerSensitive
|
||||
public static ResourceBundle getBundle(String baseName, Locale targetLocale, Module module) {
|
||||
@ -1060,28 +1070,25 @@ public abstract class ResourceBundle {
|
||||
* Gets a resource bundle using the specified base name, locale, and class
|
||||
* loader.
|
||||
*
|
||||
* <p>This method behaves the same as calling
|
||||
* {@link #getBundle(String, Locale, ClassLoader, Control)} passing a
|
||||
* default instance of {@link Control} unless another {@link Control} is
|
||||
* provided with the {@link ResourceBundleControlProvider} SPI. Refer to the
|
||||
* description of <a href="#modify_default_behavior">modifying the default
|
||||
* behavior</a>.
|
||||
* <p>When this method is called from a named module and the given
|
||||
* loader is the class loader of the caller module, this is equivalent
|
||||
* to calling:
|
||||
* <blockquote><pre>
|
||||
* getBundle(baseName, targetLocale, callerModule)
|
||||
* </pre></blockquote>
|
||||
*
|
||||
* <p><a id="default_behavior">The following describes the default
|
||||
* behavior</a>.
|
||||
* otherwise, this is equivalent to calling:
|
||||
* <blockquote><pre>
|
||||
* getBundle(baseName, targetLocale, loader, control)
|
||||
* </pre></blockquote>
|
||||
* where {@code control} is the default instance of {@link Control} unless
|
||||
* a {@code Control} instance is provided by
|
||||
* {@link ResourceBundleControlProvider} SPI. Refer to the
|
||||
* description of <a href="#modify_default_behavior">modifying the default
|
||||
* behavior</a>. The following describes the default behavior.
|
||||
*
|
||||
* <p>
|
||||
* Resource bundles in a named module are private to that module. If
|
||||
* the caller is in a named module, this method will find resource bundles
|
||||
* from the service providers of {@link java.util.spi.ResourceBundleProvider}
|
||||
* if any. Otherwise, it will load the resource bundles that are visible to
|
||||
* the given {@code loader} (refer to the
|
||||
* <a href="#bundleprovider">Resource Bundles in Named Modules</a> section
|
||||
* for details).
|
||||
* If the caller is in a named module and the given {@code loader} is
|
||||
* different than the caller's class loader, or if the caller is not in
|
||||
* a named module, this method will not find resource bundles from named
|
||||
* modules.
|
||||
* <b><a id="default_behavior">Resource Bundle Search and Loading Strategy</a></b>
|
||||
*
|
||||
* <p><code>getBundle</code> uses the base name, the specified locale, and
|
||||
* the default locale (obtained from {@link java.util.Locale#getDefault()
|
||||
@ -1201,7 +1208,7 @@ public abstract class ResourceBundle {
|
||||
*
|
||||
* <p><b>Note:</b>The <code>baseName</code> argument should be a fully
|
||||
* qualified class name. However, for compatibility with earlier versions,
|
||||
* Sun's Java SE Runtime Environments do not verify this, and so it is
|
||||
* Java SE Runtime Environments do not verify this, and so it is
|
||||
* possible to access <code>PropertyResourceBundle</code>s by specifying a
|
||||
* path name (using "/") instead of a fully qualified class name (using
|
||||
* ".").
|
||||
@ -1248,7 +1255,7 @@ public abstract class ResourceBundle {
|
||||
*
|
||||
* @apiNote If the caller module is a named module and the given
|
||||
* {@code loader} is the caller module's class loader, this method is
|
||||
* equivalent to {@code getBundle(baseName, locale)}; otherwise, it will not
|
||||
* equivalent to {@code getBundle(baseName, locale)}; otherwise, it may not
|
||||
* find resource bundles from named modules.
|
||||
* Use {@link #getBundle(String, Locale, Module)} to load resource bundles
|
||||
* on behalf on a specific module instead.
|
||||
@ -1264,6 +1271,7 @@ public abstract class ResourceBundle {
|
||||
* @since 1.2
|
||||
* @revised 9
|
||||
* @spec JPMS
|
||||
* @see <a href="#resource-bundle-modules">Resource Bundles and Named Modules</a>
|
||||
*/
|
||||
@CallerSensitive
|
||||
public static ResourceBundle getBundle(String baseName, Locale locale,
|
||||
@ -1278,9 +1286,9 @@ public abstract class ResourceBundle {
|
||||
|
||||
/**
|
||||
* Returns a resource bundle using the specified base name, target
|
||||
* locale, class loader and control. Unlike the {@linkplain
|
||||
* #getBundle(String, Locale, ClassLoader) <code>getBundle</code>
|
||||
* factory methods with no <code>control</code> argument}, the given
|
||||
* locale, class loader and control. Unlike the {@link
|
||||
* #getBundle(String, Locale, ClassLoader) getBundle}
|
||||
* factory methods with no {@code control} argument, the given
|
||||
* <code>control</code> specifies how to locate and instantiate resource
|
||||
* bundles. Conceptually, the bundle loading process with the given
|
||||
* <code>control</code> is performed in the following steps.
|
||||
@ -2365,7 +2373,14 @@ public abstract class ResourceBundle {
|
||||
* the callback methods provides the information necessary for the
|
||||
* factory methods to perform the <a
|
||||
* href="./ResourceBundle.html#default_behavior">default behavior</a>.
|
||||
* <a href="#note">Note that this class is not supported in named modules.</a>
|
||||
*
|
||||
* <p> {@link ResourceBundle.Control} is designed for an application deployed
|
||||
* in an unnamed module, for example to support resource bundles in
|
||||
* non-standard formats or package localized resources in a non-traditional
|
||||
* convention. {@link ResourceBundleProvider} is the replacement for
|
||||
* {@code ResourceBundle.Control} when migrating to modules.
|
||||
* {@code UnsupportedOperationException} will be thrown when a factory
|
||||
* method that takes the {@code ResourceBundle.Control} parameter is called.
|
||||
*
|
||||
* <p>In addition to the callback methods, the {@link
|
||||
* #toBundleName(String, Locale) toBundleName} and {@link
|
||||
@ -2501,8 +2516,8 @@ public abstract class ResourceBundle {
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @apiNote <a id="note">{@code ResourceBundle.Control} is not supported
|
||||
* in named modules.</a> If the {@code ResourceBundle.getBundle} method with
|
||||
* @apiNote {@code ResourceBundle.Control} is not supported
|
||||
* in named modules. If the {@code ResourceBundle.getBundle} method with
|
||||
* a {@code ResourceBundle.Control} is called in a named module, the method
|
||||
* will throw an {@link UnsupportedOperationException}. Any service providers
|
||||
* of {@link ResourceBundleControlProvider} are ignored in named modules.
|
||||
|
@ -45,42 +45,46 @@ import static sun.security.util.SecurityConstants.GET_CLASSLOADER_PERMISSION;
|
||||
*
|
||||
* <p>
|
||||
* Resource bundles can be packaged in one or more
|
||||
* named modules, <em>bundle modules</em>. The <em>consumer</em> of the
|
||||
* named modules, <em>service provider modules</em>. The <em>consumer</em> of the
|
||||
* resource bundle is the one calling {@link ResourceBundle#getBundle(String)}.
|
||||
* In order for the consumer module to load a resource bundle
|
||||
* "{@code com.example.app.MyResources}" provided by another module,
|
||||
* it will use the {@linkplain java.util.ServiceLoader service loader}
|
||||
* mechanism. A service interface named "{@code com.example.app.MyResourcesProvider}"
|
||||
* must be defined and a <em>bundle provider module</em> will provide an
|
||||
* implementation class of "{@code com.example.app.MyResourcesProvider}"
|
||||
* mechanism. A service interface named "{@code com.example.app.spi.MyResourcesProvider}"
|
||||
* must be defined and a <em>service provider module</em> will provide an
|
||||
* implementation class of "{@code com.example.app.spi.MyResourcesProvider}"
|
||||
* as follows:
|
||||
*
|
||||
* <pre><code>
|
||||
* import com.example.app.MyResourcesProvider;
|
||||
* <blockquote><pre>
|
||||
* {@code import com.example.app.spi.MyResourcesProvider;
|
||||
* class MyResourcesProviderImpl extends AbstractResourceBundleProvider
|
||||
* implements MyResourcesProvider
|
||||
* {
|
||||
* public MyResourcesProviderImpl() {
|
||||
* super("java.properties");
|
||||
* }
|
||||
* // this provider maps the resource bundle to per-language package
|
||||
* protected String toBundleName(String baseName, Locale locale) {
|
||||
* // return the bundle name per the naming of the resource bundle
|
||||
* :
|
||||
* return "p." + locale.getLanguage() + "." + baseName;
|
||||
* }
|
||||
*
|
||||
* public ResourceBundle getBundle(String baseName, Locale locale) {
|
||||
* // this module only provides bundles in french
|
||||
* // this module only provides bundles in French
|
||||
* if (locale.equals(Locale.FRENCH)) {
|
||||
* return super.getBundle(baseName, locale);
|
||||
* }
|
||||
* // otherwise return null
|
||||
* return null;
|
||||
* }
|
||||
* }</code></pre>
|
||||
* }}</pre></blockquote>
|
||||
*
|
||||
* @see <a href="../ResourceBundle.html#bundleprovider">
|
||||
* Resource Bundles in Named Modules</a>
|
||||
* @see <a href="../ResourceBundle.html#RBP_support">
|
||||
* ResourceBundleProvider Service Providers</a>
|
||||
* Refer to {@link ResourceBundleProvider} for details.
|
||||
*
|
||||
* @see <a href="../ResourceBundle.html#resource-bundle-modules">
|
||||
* Resource Bundles and Named Modules</a>
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
|
||||
*/
|
||||
public abstract class AbstractResourceBundleProvider implements ResourceBundleProvider {
|
||||
private static final JavaUtilResourceBundleAccess RB_ACCESS =
|
||||
|
@ -29,33 +29,117 @@ import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
/**
|
||||
* {@code ResourceBundleProvider} is a provider interface that is used for
|
||||
* loading resource bundles for named modules. Implementation classes of
|
||||
* this interface are loaded with {@link java.util.ServiceLoader ServiceLoader}
|
||||
* during a call to the
|
||||
* {@link ResourceBundle#getBundle(String, Locale, ClassLoader)
|
||||
* ResourceBundle.getBundle} method. The provider service type is determined by
|
||||
* {@code <package name> + ".spi." + <simple name> + "Provider"}.
|
||||
* {@code ResourceBundleProvider} is a service provider interface for
|
||||
* resource bundles. It is used by
|
||||
* {@link ResourceBundle#getBundle(String) ResourceBundle.getBundle}
|
||||
* factory methods to locate and load the service providers that are deployed as
|
||||
* modules via {@link java.util.ServiceLoader ServiceLoader}.
|
||||
*
|
||||
* <p>
|
||||
* For example, if the base name is "com.example.app.MyResources",
|
||||
* {@code com.example.app.spi.MyResourcesProvider} will be the provider service type:
|
||||
* <pre>{@code
|
||||
* <h3>Developing resource bundle services</h3>
|
||||
*
|
||||
* A service for a resource bundle of a given <em>{@code baseName}</em> must have
|
||||
* a fully-qualified class name of the form:
|
||||
* <blockquote>
|
||||
* {@code <package of baseName> + ".spi." + <simple name of baseName> + "Provider"}
|
||||
* </blockquote>
|
||||
*
|
||||
* The service type is in a {@code spi} subpackage as it may be packaged in
|
||||
* a module separate from the resource bundle providers.
|
||||
* For example, the service for a resource bundle named
|
||||
* {@code com.example.app.MyResources} must be
|
||||
* {@code com.example.app.spi.MyResourcesProvider}:
|
||||
*
|
||||
* <blockquote><pre>
|
||||
* {@code package com.example.app.spi;
|
||||
* public interface MyResourcesProvider extends ResourceBundleProvider {
|
||||
* }
|
||||
* }</pre>
|
||||
* }</pre></blockquote>
|
||||
*
|
||||
* <p>
|
||||
* This providers's {@link #getBundle(String, Locale) getBundle} method is called
|
||||
* through the resource bundle loading process instead of {@link
|
||||
* java.util.ResourceBundle.Control#newBundle(String, Locale, String, ClassLoader, boolean)
|
||||
* ResourceBundle.Control.newBundle()}. Refer to {@link ResourceBundle} for
|
||||
* details.
|
||||
* <h3>Deploying resource bundle service providers</h3>
|
||||
*
|
||||
* @see <a href="../ResourceBundle.html#bundleprovider">
|
||||
* Resource Bundles in Named Modules</a>
|
||||
* @see <a href="../ResourceBundle.html#RBP_support">
|
||||
* ResourceBundleProvider Service Providers</a>
|
||||
* Resource bundles can be deployed in one or more service providers
|
||||
* in modules. For example, a provider for a service
|
||||
* named "{@code com.example.app.spi.MyResourcesProvider}"
|
||||
* has the following implementation class:
|
||||
*
|
||||
* <blockquote><pre>
|
||||
* {@code import com.example.app.spi.MyResourcesProvider;
|
||||
* class MyResourcesProviderImpl extends AbstractResourceBundleProvider
|
||||
* implements MyResourcesProvider
|
||||
* {
|
||||
* public MyResourcesProviderImpl() {
|
||||
* super("java.properties");
|
||||
* }
|
||||
* // this provider maps the resource bundle to per-language package
|
||||
* protected String toBundleName(String baseName, Locale locale) {
|
||||
* return "p." + locale.getLanguage() + "." + baseName;
|
||||
* }
|
||||
*
|
||||
* public ResourceBundle getBundle(String baseName, Locale locale) {
|
||||
* // this module only provides bundles in French
|
||||
* if (locale.equals(Locale.FRENCH)) {
|
||||
* return super.getBundle(baseName, locale);
|
||||
* }
|
||||
* // otherwise return null
|
||||
* return null;
|
||||
* }
|
||||
* }}</pre></blockquote>
|
||||
*
|
||||
* This example provides "{@code com.example.app.MyResources}"
|
||||
* resource bundle of the French locale. Traditionally resource bundles of
|
||||
* all locales are packaged in the same package as the resource bundle base name.
|
||||
* When deploying resource bundles in more than one modules and two modules
|
||||
* containing a package of the same name, <em>split package</em>,
|
||||
* is not supported, resource bundles in each module can be packaged in
|
||||
* a different package as shown in this example where this provider packages
|
||||
* the resource bundles in per-language package, i.e. {@code com.example.app.fr}
|
||||
* for French locale.
|
||||
*
|
||||
* <p> A provider can provide more than one services, each of which is a service
|
||||
* for a resource bundle of a different base name.
|
||||
*
|
||||
* <p>{@link AbstractResourceBundleProvider}
|
||||
* provides the basic implementation for {@code ResourceBundleProvider}
|
||||
* and a subclass can override the {@link
|
||||
* AbstractResourceBundleProvider#toBundleName(String, Locale) toBundleName}
|
||||
* method to return a provider-specific location of the resource to be loaded,
|
||||
* for example, per-language package.
|
||||
* A provider can override {@link #getBundle ResourceBundleProvider.getBundle}
|
||||
* method for example to only search the known supported locales or
|
||||
* return resource bundles in other formats such as XML.
|
||||
*
|
||||
* <p>The module declaration of this provider module specifies the following
|
||||
* directive:
|
||||
* <pre>
|
||||
* provides com.example.app.spi.MyResourcesProvider with com.example.impl.MyResourcesProviderImpl;
|
||||
* </pre>
|
||||
*
|
||||
* <h3><a id="obtain-resource-bundle">Obtaining resource bundles from providers</a></h3>
|
||||
*
|
||||
* The module declaration of the <em>consumer module</em> that calls one of the
|
||||
* {@code ResourceBundle.getBundle} factory methods to obtain a resource
|
||||
* bundle from service providers must specify the following directive:
|
||||
* <pre>
|
||||
* uses com.example.app.spi.MyResourcesProvider;
|
||||
* </pre>
|
||||
*
|
||||
* {@link ResourceBundle#getBundle(String, Locale)
|
||||
* ResourceBundle.getBundle("com.example.app.MyResource", locale)}
|
||||
* locates and loads the providers for {@code com.example.app.spi.MyResourcesProvider}
|
||||
* service and then invokes {@link #getBundle(String, Locale)
|
||||
* ResourceBundleProvider.getBundle("com.example.app.MyResource", locale)} to
|
||||
* find the resource bundle of the given base name and locale.
|
||||
* If the consumer module is a resource bundle service provider for
|
||||
* {@code com.example.app.spi.MyResourcesProvider}, {@code ResourceBundle.getBundle}
|
||||
* will locate resource bundles only from service providers.
|
||||
* Otherwise, {@code ResourceBundle.getBundle} may continue the search of
|
||||
* the resource bundle in other modules and class path per the specification
|
||||
* of the {@code ResourceBundle.getBundle} method being called.
|
||||
*
|
||||
* @see AbstractResourceBundleProvider
|
||||
* @see <a href="../ResourceBundle.html#resource-bundle-modules">
|
||||
* Resource Bundles and Named Modules</a>
|
||||
* @see java.util.ServiceLoader
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
*/
|
||||
|
@ -64,7 +64,7 @@ import static jdk.internal.module.ClassFileConstants.*;
|
||||
public final class ModuleInfo {
|
||||
|
||||
private final int JAVA_MIN_SUPPORTED_VERSION = 53;
|
||||
private final int JAVA_MAX_SUPPORTED_VERSION = 54;
|
||||
private final int JAVA_MAX_SUPPORTED_VERSION = 55;
|
||||
|
||||
private static final JavaLangModuleAccess JLMA
|
||||
= SharedSecrets.getJavaLangModuleAccess();
|
||||
|
@ -185,7 +185,7 @@ public class ClassReader {
|
||||
public ClassReader(final byte[] b, final int off, final int len) {
|
||||
this.b = b;
|
||||
// checks the class version
|
||||
if (readShort(off + 6) > Opcodes.V10) {
|
||||
if (readShort(off + 6) > Opcodes.V11) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
// parses the constant pool
|
||||
|
@ -90,6 +90,7 @@ public interface Opcodes {
|
||||
int V1_8 = 0 << 16 | 52;
|
||||
int V9 = 0 << 16 | 53;
|
||||
int V10 = 0 << 16 | 54;
|
||||
int V11 = 0 << 16 | 55;
|
||||
|
||||
// access flags
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017 Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -22,7 +22,7 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.util;
|
||||
package jdk.internal.util;
|
||||
|
||||
import jdk.internal.HotSpotIntrinsicCandidate;
|
||||
import jdk.internal.misc.Unsafe;
|
||||
@ -50,19 +50,19 @@ import jdk.internal.misc.Unsafe;
|
||||
* responsibility of the caller (direct or otherwise) to perform such checks
|
||||
* before calling this method.
|
||||
*/
|
||||
class ArraysSupport {
|
||||
public class ArraysSupport {
|
||||
static final Unsafe U = Unsafe.getUnsafe();
|
||||
|
||||
private static final boolean BIG_ENDIAN = U.isBigEndian();
|
||||
|
||||
private static final int LOG2_ARRAY_BOOLEAN_INDEX_SCALE = exactLog2(Unsafe.ARRAY_BOOLEAN_INDEX_SCALE);
|
||||
private static final int LOG2_ARRAY_BYTE_INDEX_SCALE = exactLog2(Unsafe.ARRAY_BYTE_INDEX_SCALE);
|
||||
private static final int LOG2_ARRAY_CHAR_INDEX_SCALE = exactLog2(Unsafe.ARRAY_CHAR_INDEX_SCALE);
|
||||
private static final int LOG2_ARRAY_SHORT_INDEX_SCALE = exactLog2(Unsafe.ARRAY_SHORT_INDEX_SCALE);
|
||||
private static final int LOG2_ARRAY_INT_INDEX_SCALE = exactLog2(Unsafe.ARRAY_INT_INDEX_SCALE);
|
||||
private static final int LOG2_ARRAY_LONG_INDEX_SCALE = exactLog2(Unsafe.ARRAY_LONG_INDEX_SCALE);
|
||||
private static final int LOG2_ARRAY_FLOAT_INDEX_SCALE = exactLog2(Unsafe.ARRAY_FLOAT_INDEX_SCALE);
|
||||
private static final int LOG2_ARRAY_DOUBLE_INDEX_SCALE = exactLog2(Unsafe.ARRAY_DOUBLE_INDEX_SCALE);
|
||||
public static final int LOG2_ARRAY_BOOLEAN_INDEX_SCALE = exactLog2(Unsafe.ARRAY_BOOLEAN_INDEX_SCALE);
|
||||
public static final int LOG2_ARRAY_BYTE_INDEX_SCALE = exactLog2(Unsafe.ARRAY_BYTE_INDEX_SCALE);
|
||||
public static final int LOG2_ARRAY_CHAR_INDEX_SCALE = exactLog2(Unsafe.ARRAY_CHAR_INDEX_SCALE);
|
||||
public static final int LOG2_ARRAY_SHORT_INDEX_SCALE = exactLog2(Unsafe.ARRAY_SHORT_INDEX_SCALE);
|
||||
public static final int LOG2_ARRAY_INT_INDEX_SCALE = exactLog2(Unsafe.ARRAY_INT_INDEX_SCALE);
|
||||
public static final int LOG2_ARRAY_LONG_INDEX_SCALE = exactLog2(Unsafe.ARRAY_LONG_INDEX_SCALE);
|
||||
public static final int LOG2_ARRAY_FLOAT_INDEX_SCALE = exactLog2(Unsafe.ARRAY_FLOAT_INDEX_SCALE);
|
||||
public static final int LOG2_ARRAY_DOUBLE_INDEX_SCALE = exactLog2(Unsafe.ARRAY_DOUBLE_INDEX_SCALE);
|
||||
|
||||
private static final int LOG2_BYTE_BIT_SIZE = exactLog2(Byte.SIZE);
|
||||
|
||||
@ -107,10 +107,10 @@ class ArraysSupport {
|
||||
* the tail of the two arrays.
|
||||
*/
|
||||
@HotSpotIntrinsicCandidate
|
||||
static int vectorizedMismatch(Object a, long aOffset,
|
||||
Object b, long bOffset,
|
||||
int length,
|
||||
int log2ArrayIndexScale) {
|
||||
public static int vectorizedMismatch(Object a, long aOffset,
|
||||
Object b, long bOffset,
|
||||
int length,
|
||||
int log2ArrayIndexScale) {
|
||||
// assert a.getClass().isArray();
|
||||
// assert b.getClass().isArray();
|
||||
// assert 0 <= length <= sizeOf(a)
|
||||
@ -161,9 +161,9 @@ class ArraysSupport {
|
||||
// Booleans
|
||||
// Each boolean element takes up one byte
|
||||
|
||||
static int mismatch(boolean[] a,
|
||||
boolean[] b,
|
||||
int length) {
|
||||
public static int mismatch(boolean[] a,
|
||||
boolean[] b,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 7) {
|
||||
i = vectorizedMismatch(
|
||||
@ -181,9 +181,9 @@ class ArraysSupport {
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(boolean[] a, int aFromIndex,
|
||||
boolean[] b, int bFromIndex,
|
||||
int length) {
|
||||
public static int mismatch(boolean[] a, int aFromIndex,
|
||||
boolean[] b, int bFromIndex,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 7) {
|
||||
int aOffset = Unsafe.ARRAY_BOOLEAN_BASE_OFFSET + aFromIndex;
|
||||
@ -219,9 +219,9 @@ class ArraysSupport {
|
||||
* no mismatch. The index will be within the range of (inclusive) 0 to
|
||||
* (exclusive) the smaller of the two array lengths.
|
||||
*/
|
||||
static int mismatch(byte[] a,
|
||||
byte[] b,
|
||||
int length) {
|
||||
public static int mismatch(byte[] a,
|
||||
byte[] b,
|
||||
int length) {
|
||||
// ISSUE: defer to index receiving methods if performance is good
|
||||
// assert length <= a.length
|
||||
// assert length <= b.length
|
||||
@ -264,9 +264,9 @@ class ArraysSupport {
|
||||
* otherwise -1 if no mismatch. The index will be within the range of
|
||||
* (inclusive) 0 to (exclusive) the smaller of the two array bounds.
|
||||
*/
|
||||
static int mismatch(byte[] a, int aFromIndex,
|
||||
byte[] b, int bFromIndex,
|
||||
int length) {
|
||||
public static int mismatch(byte[] a, int aFromIndex,
|
||||
byte[] b, int bFromIndex,
|
||||
int length) {
|
||||
// assert 0 <= aFromIndex < a.length
|
||||
// assert 0 <= aFromIndex + length <= a.length
|
||||
// assert 0 <= bFromIndex < b.length
|
||||
@ -295,9 +295,9 @@ class ArraysSupport {
|
||||
|
||||
// Chars
|
||||
|
||||
static int mismatch(char[] a,
|
||||
char[] b,
|
||||
int length) {
|
||||
public static int mismatch(char[] a,
|
||||
char[] b,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 3) {
|
||||
i = vectorizedMismatch(
|
||||
@ -315,9 +315,9 @@ class ArraysSupport {
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(char[] a, int aFromIndex,
|
||||
char[] b, int bFromIndex,
|
||||
int length) {
|
||||
public static int mismatch(char[] a, int aFromIndex,
|
||||
char[] b, int bFromIndex,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 3) {
|
||||
int aOffset = Unsafe.ARRAY_CHAR_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_CHAR_INDEX_SCALE);
|
||||
@ -340,9 +340,9 @@ class ArraysSupport {
|
||||
|
||||
// Shorts
|
||||
|
||||
static int mismatch(short[] a,
|
||||
short[] b,
|
||||
int length) {
|
||||
public static int mismatch(short[] a,
|
||||
short[] b,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 3) {
|
||||
i = vectorizedMismatch(
|
||||
@ -360,9 +360,9 @@ class ArraysSupport {
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(short[] a, int aFromIndex,
|
||||
short[] b, int bFromIndex,
|
||||
int length) {
|
||||
public static int mismatch(short[] a, int aFromIndex,
|
||||
short[] b, int bFromIndex,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 3) {
|
||||
int aOffset = Unsafe.ARRAY_SHORT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_SHORT_INDEX_SCALE);
|
||||
@ -385,9 +385,9 @@ class ArraysSupport {
|
||||
|
||||
// Ints
|
||||
|
||||
static int mismatch(int[] a,
|
||||
int[] b,
|
||||
int length) {
|
||||
public static int mismatch(int[] a,
|
||||
int[] b,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 1) {
|
||||
i = vectorizedMismatch(
|
||||
@ -405,9 +405,9 @@ class ArraysSupport {
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mismatch(int[] a, int aFromIndex,
|
||||
int[] b, int bFromIndex,
|
||||
int length) {
|
||||
public static int mismatch(int[] a, int aFromIndex,
|
||||
int[] b, int bFromIndex,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 1) {
|
||||
int aOffset = Unsafe.ARRAY_INT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_INT_INDEX_SCALE);
|
||||
@ -430,15 +430,15 @@ class ArraysSupport {
|
||||
|
||||
// Floats
|
||||
|
||||
static int mismatch(float[] a,
|
||||
float[] b,
|
||||
int length) {
|
||||
public static int mismatch(float[] a,
|
||||
float[] b,
|
||||
int length) {
|
||||
return mismatch(a, 0, b, 0, length);
|
||||
}
|
||||
|
||||
static int mismatch(float[] a, int aFromIndex,
|
||||
float[] b, int bFromIndex,
|
||||
int length) {
|
||||
public static int mismatch(float[] a, int aFromIndex,
|
||||
float[] b, int bFromIndex,
|
||||
int length) {
|
||||
int i = 0;
|
||||
if (length > 1) {
|
||||
int aOffset = Unsafe.ARRAY_FLOAT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_FLOAT_INDEX_SCALE);
|
||||
@ -475,9 +475,9 @@ class ArraysSupport {
|
||||
|
||||
// Long
|
||||
|
||||
static int mismatch(long[] a,
|
||||
long[] b,
|
||||
int length) {
|
||||
public static int mismatch(long[] a,
|
||||
long[] b,
|
||||
int length) {
|
||||
if (length == 0) {
|
||||
return -1;
|
||||
}
|
||||
@ -488,9 +488,9 @@ class ArraysSupport {
|
||||
return i >= 0 ? i : -1;
|
||||
}
|
||||
|
||||
static int mismatch(long[] a, int aFromIndex,
|
||||
long[] b, int bFromIndex,
|
||||
int length) {
|
||||
public static int mismatch(long[] a, int aFromIndex,
|
||||
long[] b, int bFromIndex,
|
||||
int length) {
|
||||
if (length == 0) {
|
||||
return -1;
|
||||
}
|
||||
@ -506,15 +506,15 @@ class ArraysSupport {
|
||||
|
||||
// Double
|
||||
|
||||
static int mismatch(double[] a,
|
||||
double[] b,
|
||||
int length) {
|
||||
public static int mismatch(double[] a,
|
||||
double[] b,
|
||||
int length) {
|
||||
return mismatch(a, 0, b, 0, length);
|
||||
}
|
||||
|
||||
static int mismatch(double[] a, int aFromIndex,
|
||||
double[] b, int bFromIndex,
|
||||
int length) {
|
||||
public static int mismatch(double[] a, int aFromIndex,
|
||||
double[] b, int bFromIndex,
|
||||
int length) {
|
||||
if (length == 0) {
|
||||
return -1;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -108,7 +108,29 @@ final class HandshakeHash {
|
||||
* a hash for the certificate verify message is required.
|
||||
*/
|
||||
HandshakeHash(boolean needCertificateVerify) {
|
||||
clonesNeeded = needCertificateVerify ? 4 : 3;
|
||||
// We may rework the code later, but for now we use hard-coded number
|
||||
// of clones if the underlying MessageDigests are not cloneable.
|
||||
//
|
||||
// The number used here is based on the current handshake protocols and
|
||||
// implementation. It may be changed if the handshake processe gets
|
||||
// changed in the future, for example adding a new extension that
|
||||
// requires handshake hash. Please be careful about the number of
|
||||
// clones if additional handshak hash is required in the future.
|
||||
//
|
||||
// For the current implementation, the handshake hash is required for
|
||||
// the following items:
|
||||
// . CertificateVerify handshake message (optional)
|
||||
// . client Finished handshake message
|
||||
// . server Finished Handshake message
|
||||
// . the extended Master Secret extension [RFC 7627]
|
||||
//
|
||||
// Note that a late call to server setNeedClientAuth dose not update
|
||||
// the number of clones. We may address the issue later.
|
||||
//
|
||||
// Note for safety, we allocate one more clone for the current
|
||||
// implementation. We may consider it more carefully in the future
|
||||
// for the exact number or rework the code in a different way.
|
||||
clonesNeeded = needCertificateVerify ? 5 : 4;
|
||||
}
|
||||
|
||||
void reserve(ByteBuffer input) {
|
||||
@ -335,7 +357,8 @@ final class HandshakeHash {
|
||||
if (finMD != null) return;
|
||||
|
||||
try {
|
||||
finMD = CloneableDigest.getDigest(normalizeAlgName(s), 2);
|
||||
// See comment in the contructor.
|
||||
finMD = CloneableDigest.getDigest(normalizeAlgName(s), 4);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,8 +31,8 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
/* Classfile version number for this information */
|
||||
#define JVM_CLASSFILE_MAJOR_VERSION 54
|
||||
#define JVM_CLASSFILE_MINOR_VERSION 0
|
||||
#define JVM_CLASSFILE_MAJOR_VERSION @@VERSION_CLASSFILE_MAJOR@@
|
||||
#define JVM_CLASSFILE_MINOR_VERSION @@VERSION_CLASSFILE_MINOR@@
|
||||
|
||||
/* Flags */
|
||||
|
@ -114,9 +114,6 @@ Java_java_lang_System_identityHashCode(JNIEnv *env, jobject this, jobject x)
|
||||
#define VENDOR_URL_BUG "http://bugreport.java.com/bugreport/"
|
||||
#endif
|
||||
|
||||
#define JAVA_MAX_SUPPORTED_VERSION 54
|
||||
#define JAVA_MAX_SUPPORTED_MINOR_VERSION 0
|
||||
|
||||
#ifdef JAVA_SPECIFICATION_VENDOR /* Third party may NOT overwrite this. */
|
||||
#error "ERROR: No override of JAVA_SPECIFICATION_VENDOR is allowed"
|
||||
#else
|
||||
@ -222,8 +219,8 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
|
||||
PUTPROP(props, "java.vendor.url", VENDOR_URL);
|
||||
PUTPROP(props, "java.vendor.url.bug", VENDOR_URL_BUG);
|
||||
|
||||
jio_snprintf(buf, sizeof(buf), "%d.%d", JAVA_MAX_SUPPORTED_VERSION,
|
||||
JAVA_MAX_SUPPORTED_MINOR_VERSION);
|
||||
jio_snprintf(buf, sizeof(buf), "%d.%d", JVM_CLASSFILE_MAJOR_VERSION,
|
||||
JVM_CLASSFILE_MINOR_VERSION);
|
||||
PUTPROP(props, "java.class.version", buf);
|
||||
|
||||
if (sprops->awt_toolkit) {
|
||||
|
@ -57,6 +57,7 @@ public enum SourceVersion {
|
||||
* 1.8: lambda expressions and default methods
|
||||
* 9: modules, small cleanups to 1.7 and 1.8 changes
|
||||
* 10: local-variable type inference (var)
|
||||
* 11: to be determined changes
|
||||
*/
|
||||
|
||||
/**
|
||||
@ -162,7 +163,15 @@ public enum SourceVersion {
|
||||
*
|
||||
* @since 10
|
||||
*/
|
||||
RELEASE_10;
|
||||
RELEASE_10,
|
||||
|
||||
/**
|
||||
* The version recognized by the Java Platform, Standard Edition
|
||||
* 11.
|
||||
*
|
||||
* @since 11
|
||||
*/
|
||||
RELEASE_11;
|
||||
|
||||
// Note that when adding constants for newer releases, the
|
||||
// behavior of latest() and latestSupported() must be updated too.
|
||||
@ -173,7 +182,7 @@ public enum SourceVersion {
|
||||
* @return the latest source version that can be modeled
|
||||
*/
|
||||
public static SourceVersion latest() {
|
||||
return RELEASE_10;
|
||||
return RELEASE_11;
|
||||
}
|
||||
|
||||
private static final SourceVersion latestSupported = getLatestSupported();
|
||||
@ -183,6 +192,8 @@ public enum SourceVersion {
|
||||
String specVersion = System.getProperty("java.specification.version");
|
||||
|
||||
switch (specVersion) {
|
||||
case "11":
|
||||
return RELEASE_11;
|
||||
case "10":
|
||||
return RELEASE_10;
|
||||
case "9":
|
||||
|
@ -678,6 +678,11 @@ public abstract class Toolkit {
|
||||
* If the connection to the specified URL requires
|
||||
* either {@code URLPermission} or {@code SocketPermission},
|
||||
* then {@code URLPermission} is used for security checks.
|
||||
* For compatibility with pre-1.2 security managers, if the access
|
||||
* is denied with {@code FilePermission} or {@code SocketPermission},
|
||||
* the method throws the {@code SecurityException}
|
||||
* if the corresponding 1.1-style SecurityManager.checkXXX method
|
||||
* also denies permission.
|
||||
* @param url the URL to use in fetching the pixel data.
|
||||
* @return an image which gets its pixel data from
|
||||
* the specified URL.
|
||||
@ -719,6 +724,11 @@ public abstract class Toolkit {
|
||||
* If the connection to the specified URL requires
|
||||
* either {@code URLPermission} or {@code SocketPermission},
|
||||
* then {@code URLPermission} is used for security checks.
|
||||
* For compatibility with pre-1.2 security managers, if the access
|
||||
* is denied with {@code FilePermission} or {@code SocketPermission},
|
||||
* the method throws {@code SecurityException}
|
||||
* if the corresponding 1.1-style SecurityManager.checkXXX method
|
||||
* also denies permission.
|
||||
* @param url the URL to use in fetching the pixel data.
|
||||
* @return an image which gets its pixel data from
|
||||
* the specified URL.
|
||||
|
@ -78,8 +78,11 @@ public enum Source {
|
||||
/** 1.9 modularity. */
|
||||
JDK9("9"),
|
||||
|
||||
/** 1.10 covers the to be determined language features that will be added in JDK 10. */
|
||||
JDK10("10");
|
||||
/** 1.10 local-variable type inference (var). */
|
||||
JDK10("10"),
|
||||
|
||||
/** 1.11 covers the to be determined language features that will be added in JDK 11. */
|
||||
JDK11("11");
|
||||
|
||||
private static final Context.Key<Source> sourceKey = new Context.Key<>();
|
||||
|
||||
@ -108,6 +111,7 @@ public enum Source {
|
||||
tab.put("1.8", JDK8); // Make 8 an alias for 1.8
|
||||
tab.put("1.9", JDK9); // Make 9 an alias for 1.9
|
||||
tab.put("1.10", JDK10); // Make 10 an alias for 1.10
|
||||
// Decline to make 1.11 an alias for 11.
|
||||
}
|
||||
|
||||
private Source(String name) {
|
||||
@ -125,6 +129,7 @@ public enum Source {
|
||||
}
|
||||
|
||||
public Target requiredTarget() {
|
||||
if (this.compareTo(JDK11) >= 0) return Target.JDK1_11;
|
||||
if (this.compareTo(JDK10) >= 0) return Target.JDK1_10;
|
||||
if (this.compareTo(JDK9) >= 0) return Target.JDK1_9;
|
||||
if (this.compareTo(JDK8) >= 0) return Target.JDK1_8;
|
||||
@ -247,6 +252,8 @@ public enum Source {
|
||||
return RELEASE_9;
|
||||
case JDK10:
|
||||
return RELEASE_10;
|
||||
case JDK11:
|
||||
return RELEASE_11;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
@ -1628,9 +1628,6 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
/** The parameters of the method. */
|
||||
public List<VarSymbol> params = null;
|
||||
|
||||
/** The names of the parameters */
|
||||
public List<Name> savedParameterNames;
|
||||
|
||||
/** For an annotation type element, its default value if any.
|
||||
* The value is null if none appeared in the method
|
||||
* declaration.
|
||||
@ -1886,57 +1883,18 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
public List<VarSymbol> params() {
|
||||
owner.complete();
|
||||
if (params == null) {
|
||||
// If ClassReader.saveParameterNames has been set true, then
|
||||
// savedParameterNames will be set to a list of names that
|
||||
// matches the types in type.getParameterTypes(). If any names
|
||||
// were not found in the class file, those names in the list will
|
||||
// be set to the empty name.
|
||||
// If ClassReader.saveParameterNames has been set false, then
|
||||
// savedParameterNames will be null.
|
||||
List<Name> paramNames = savedParameterNames;
|
||||
savedParameterNames = null;
|
||||
// discard the provided names if the list of names is the wrong size.
|
||||
if (paramNames == null || paramNames.size() != type.getParameterTypes().size()) {
|
||||
paramNames = List.nil();
|
||||
}
|
||||
ListBuffer<VarSymbol> buf = new ListBuffer<>();
|
||||
List<Name> remaining = paramNames;
|
||||
// assert: remaining and paramNames are both empty or both
|
||||
// have same cardinality as type.getParameterTypes()
|
||||
ListBuffer<VarSymbol> newParams = new ListBuffer<>();
|
||||
int i = 0;
|
||||
for (Type t : type.getParameterTypes()) {
|
||||
Name paramName;
|
||||
if (remaining.isEmpty()) {
|
||||
// no names for any parameters available
|
||||
paramName = createArgName(i, paramNames);
|
||||
} else {
|
||||
paramName = remaining.head;
|
||||
remaining = remaining.tail;
|
||||
if (paramName.isEmpty()) {
|
||||
// no name for this specific parameter
|
||||
paramName = createArgName(i, paramNames);
|
||||
}
|
||||
}
|
||||
buf.append(new VarSymbol(PARAMETER, paramName, t, this));
|
||||
i++;
|
||||
}
|
||||
params = buf.toList();
|
||||
}
|
||||
return params;
|
||||
}
|
||||
Name paramName = name.table.fromString("arg" + i);
|
||||
VarSymbol param = new VarSymbol(PARAMETER, paramName, t, this);
|
||||
newParams.append(param);
|
||||
|
||||
// Create a name for the argument at position 'index' that is not in
|
||||
// the exclude list. In normal use, either no names will have been
|
||||
// provided, in which case the exclude list is empty, or all the names
|
||||
// will have been provided, in which case this method will not be called.
|
||||
private Name createArgName(int index, List<Name> exclude) {
|
||||
String prefix = "arg";
|
||||
while (true) {
|
||||
Name argName = name.table.fromString(prefix + index);
|
||||
if (!exclude.contains(argName))
|
||||
return argName;
|
||||
prefix += "$";
|
||||
}
|
||||
params = newParams.toList();
|
||||
}
|
||||
Assert.checkNonNull(params);
|
||||
return params;
|
||||
}
|
||||
|
||||
public Symbol asMemberOf(Type site, Types types) {
|
||||
|
@ -1976,8 +1976,8 @@ public class Check {
|
||||
types.covariantReturnType(rt2, rt1, types.noWarnings)) ||
|
||||
checkCommonOverriderIn(s1,s2,site);
|
||||
if (!compat) {
|
||||
log.error(pos, Errors.TypesIncompatibleDiffRet(t1, t2, s2.name +
|
||||
"(" + types.memberType(t2, s2).getParameterTypes() + ")"));
|
||||
log.error(pos, Errors.TypesIncompatible(t1, t2,
|
||||
Fragments.IncompatibleDiffRet(s2.name, types.memberType(t2, s2).getParameterTypes())));
|
||||
return s2;
|
||||
}
|
||||
} else if (checkNameClash((ClassSymbol)site.tsym, s1, s2) &&
|
||||
@ -2563,20 +2563,22 @@ public class Check {
|
||||
//strong semantics - issue an error if two sibling interfaces
|
||||
//have two override-equivalent defaults - or if one is abstract
|
||||
//and the other is default
|
||||
String errKey;
|
||||
Fragment diagKey;
|
||||
Symbol s1 = defaults.first();
|
||||
Symbol s2;
|
||||
if (defaults.size() > 1) {
|
||||
errKey = "types.incompatible.unrelated.defaults";
|
||||
s2 = defaults.toList().tail.head;
|
||||
diagKey = Fragments.IncompatibleUnrelatedDefaults(Kinds.kindName(site.tsym), site,
|
||||
m.name, types.memberType(site, m).getParameterTypes(),
|
||||
s1.location(), s2.location());
|
||||
|
||||
} else {
|
||||
errKey = "types.incompatible.abstract.default";
|
||||
s2 = abstracts.first();
|
||||
diagKey = Fragments.IncompatibleAbstractDefault(Kinds.kindName(site.tsym), site,
|
||||
m.name, types.memberType(site, m).getParameterTypes(),
|
||||
s1.location(), s2.location());
|
||||
}
|
||||
log.error(pos, errKey,
|
||||
Kinds.kindName(site.tsym), site,
|
||||
m.name, types.memberType(site, m).getParameterTypes(),
|
||||
s1.location(), s2.location());
|
||||
log.error(pos, Errors.TypesIncompatible(s1.location().type, s2.location().type, diagKey));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -421,6 +421,12 @@ public class Enter extends JCTree.Visitor {
|
||||
// We are seeing a member class.
|
||||
c = syms.enterClass(env.toplevel.modle, tree.name, (TypeSymbol)owner);
|
||||
if (c.owner != owner) {
|
||||
if (c.name != tree.name) {
|
||||
log.error(tree.pos(), Errors.SameBinaryName(c.name, tree.name));
|
||||
result = types.createErrorType(tree.name, (TypeSymbol)owner, Type.noType);
|
||||
tree.sym = (ClassSymbol)result.tsym;
|
||||
return;
|
||||
}
|
||||
//anonymous class loaded from a classfile may be recreated from source (see below)
|
||||
//if this class is a member of such an anonymous class, fix the owner:
|
||||
Assert.check(owner.owner.kind != TYP, owner::toString);
|
||||
|
@ -111,7 +111,8 @@ public class ClassFile {
|
||||
V51(51, 0), // JDK 1.7
|
||||
V52(52, 0), // JDK 1.8: lambda, type annos, param names
|
||||
V53(53, 0), // JDK 1.9: modules, indy string concat
|
||||
V54(54, 0); // JDK 10
|
||||
V54(54, 0), // JDK 10
|
||||
V55(55, 0); // JDK 11: constant dynamic
|
||||
Version(int major, int minor) {
|
||||
this.major = major;
|
||||
this.minor = minor;
|
||||
|
@ -192,6 +192,26 @@ public class ClassReader {
|
||||
*/
|
||||
int[] parameterNameIndices;
|
||||
|
||||
/**
|
||||
* A table to hold annotations for method parameters.
|
||||
*/
|
||||
ParameterAnnotations[] parameterAnnotations;
|
||||
|
||||
/**
|
||||
* A holder for parameter annotations.
|
||||
*/
|
||||
static class ParameterAnnotations {
|
||||
List<CompoundAnnotationProxy> proxies;
|
||||
|
||||
void add(List<CompoundAnnotationProxy> newAnnotations) {
|
||||
if (proxies == null) {
|
||||
proxies = newAnnotations;
|
||||
} else {
|
||||
proxies = proxies.prependList(newAnnotations);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not any parameter names have been found.
|
||||
*/
|
||||
@ -1218,7 +1238,7 @@ public class ClassReader {
|
||||
|
||||
new AttributeReader(names.RuntimeInvisibleParameterAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
|
||||
protected void read(Symbol sym, int attrLen) {
|
||||
attachParameterAnnotations(sym);
|
||||
readParameterAnnotations(sym);
|
||||
}
|
||||
},
|
||||
|
||||
@ -1230,7 +1250,7 @@ public class ClassReader {
|
||||
|
||||
new AttributeReader(names.RuntimeVisibleParameterAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
|
||||
protected void read(Symbol sym, int attrLen) {
|
||||
attachParameterAnnotations(sym);
|
||||
readParameterAnnotations(sym);
|
||||
}
|
||||
},
|
||||
|
||||
@ -1288,10 +1308,14 @@ public class ClassReader {
|
||||
int numEntries = nextByte();
|
||||
parameterNameIndices = new int[numEntries];
|
||||
haveParameterNameIndices = true;
|
||||
int index = 0;
|
||||
for (int i = 0; i < numEntries; i++) {
|
||||
int nameIndex = nextChar();
|
||||
int flags = nextChar();
|
||||
parameterNameIndices[i] = nameIndex;
|
||||
if ((flags & (Flags.MANDATED | Flags.SYNTHETIC)) != 0) {
|
||||
continue;
|
||||
}
|
||||
parameterNameIndices[index++] = nameIndex;
|
||||
}
|
||||
}
|
||||
bp = newbp;
|
||||
@ -1580,66 +1604,83 @@ public class ClassReader {
|
||||
* Reading Java-language annotations
|
||||
***********************************************************************/
|
||||
|
||||
/**
|
||||
* Save annotations.
|
||||
*/
|
||||
List<CompoundAnnotationProxy> readAnnotations() {
|
||||
int numAttributes = nextChar();
|
||||
ListBuffer<CompoundAnnotationProxy> annotations = new ListBuffer<>();
|
||||
for (int i = 0; i < numAttributes; i++) {
|
||||
annotations.append(readCompoundAnnotation());
|
||||
}
|
||||
return annotations.toList();
|
||||
}
|
||||
|
||||
/** Attach annotations.
|
||||
*/
|
||||
void attachAnnotations(final Symbol sym) {
|
||||
int numAttributes = nextChar();
|
||||
if (numAttributes != 0) {
|
||||
ListBuffer<CompoundAnnotationProxy> proxies = new ListBuffer<>();
|
||||
for (int i = 0; i<numAttributes; i++) {
|
||||
CompoundAnnotationProxy proxy = readCompoundAnnotation();
|
||||
if (proxy.type.tsym == syms.proprietaryType.tsym)
|
||||
sym.flags_field |= PROPRIETARY;
|
||||
else if (proxy.type.tsym == syms.profileType.tsym) {
|
||||
if (profile != Profile.DEFAULT) {
|
||||
for (Pair<Name,Attribute> v: proxy.values) {
|
||||
if (v.fst == names.value && v.snd instanceof Attribute.Constant) {
|
||||
Attribute.Constant c = (Attribute.Constant) v.snd;
|
||||
if (c.type == syms.intType && ((Integer) c.value) > profile.value) {
|
||||
sym.flags_field |= NOT_IN_PROFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (proxy.type.tsym == syms.annotationTargetType.tsym) {
|
||||
target = proxy;
|
||||
} else if (proxy.type.tsym == syms.repeatableType.tsym) {
|
||||
repeatable = proxy;
|
||||
} else if (proxy.type.tsym == syms.deprecatedType.tsym) {
|
||||
sym.flags_field |= (DEPRECATED | DEPRECATED_ANNOTATION);
|
||||
for (Pair<Name, Attribute> v : proxy.values) {
|
||||
if (v.fst == names.forRemoval && v.snd instanceof Attribute.Constant) {
|
||||
Attribute.Constant c = (Attribute.Constant) v.snd;
|
||||
if (c.type == syms.booleanType && ((Integer) c.value) != 0) {
|
||||
sym.flags_field |= DEPRECATED_REMOVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
proxies.append(proxy);
|
||||
}
|
||||
}
|
||||
annotate.normal(new AnnotationCompleter(sym, proxies.toList()));
|
||||
}
|
||||
attachAnnotations(sym, readAnnotations());
|
||||
}
|
||||
|
||||
/** Attach parameter annotations.
|
||||
/**
|
||||
* Attach annotations.
|
||||
*/
|
||||
void attachParameterAnnotations(final Symbol method) {
|
||||
final MethodSymbol meth = (MethodSymbol)method;
|
||||
int numParameters = buf[bp++] & 0xFF;
|
||||
List<VarSymbol> parameters = meth.params();
|
||||
int pnum = 0;
|
||||
while (parameters.tail != null) {
|
||||
attachAnnotations(parameters.head);
|
||||
parameters = parameters.tail;
|
||||
pnum++;
|
||||
void attachAnnotations(final Symbol sym, List<CompoundAnnotationProxy> annotations) {
|
||||
if (annotations.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (pnum != numParameters) {
|
||||
ListBuffer<CompoundAnnotationProxy> proxies = new ListBuffer<>();
|
||||
for (CompoundAnnotationProxy proxy : annotations) {
|
||||
if (proxy.type.tsym == syms.proprietaryType.tsym)
|
||||
sym.flags_field |= PROPRIETARY;
|
||||
else if (proxy.type.tsym == syms.profileType.tsym) {
|
||||
if (profile != Profile.DEFAULT) {
|
||||
for (Pair<Name, Attribute> v : proxy.values) {
|
||||
if (v.fst == names.value && v.snd instanceof Attribute.Constant) {
|
||||
Attribute.Constant c = (Attribute.Constant)v.snd;
|
||||
if (c.type == syms.intType && ((Integer)c.value) > profile.value) {
|
||||
sym.flags_field |= NOT_IN_PROFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (proxy.type.tsym == syms.annotationTargetType.tsym) {
|
||||
target = proxy;
|
||||
} else if (proxy.type.tsym == syms.repeatableType.tsym) {
|
||||
repeatable = proxy;
|
||||
} else if (proxy.type.tsym == syms.deprecatedType.tsym) {
|
||||
sym.flags_field |= (DEPRECATED | DEPRECATED_ANNOTATION);
|
||||
for (Pair<Name, Attribute> v : proxy.values) {
|
||||
if (v.fst == names.forRemoval && v.snd instanceof Attribute.Constant) {
|
||||
Attribute.Constant c = (Attribute.Constant)v.snd;
|
||||
if (c.type == syms.booleanType && ((Integer)c.value) != 0) {
|
||||
sym.flags_field |= DEPRECATED_REMOVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
proxies.append(proxy);
|
||||
}
|
||||
}
|
||||
annotate.normal(new AnnotationCompleter(sym, proxies.toList()));
|
||||
}
|
||||
|
||||
/** Read parameter annotations.
|
||||
*/
|
||||
void readParameterAnnotations(Symbol meth) {
|
||||
int numParameters = buf[bp++] & 0xFF;
|
||||
if (parameterAnnotations == null) {
|
||||
parameterAnnotations = new ParameterAnnotations[numParameters];
|
||||
} else if (parameterAnnotations.length != numParameters) {
|
||||
throw badClassFile("bad.runtime.invisible.param.annotations", meth);
|
||||
}
|
||||
for (int pnum = 0; pnum < numParameters; pnum++) {
|
||||
if (parameterAnnotations[pnum] == null) {
|
||||
parameterAnnotations[pnum] = new ParameterAnnotations();
|
||||
}
|
||||
parameterAnnotations[pnum].add(readAnnotations());
|
||||
}
|
||||
}
|
||||
|
||||
void attachTypeAnnotations(final Symbol sym) {
|
||||
@ -2403,8 +2444,7 @@ public class ClassReader {
|
||||
} finally {
|
||||
currentOwner = prevOwner;
|
||||
}
|
||||
if (saveParameterNames)
|
||||
setParameterNames(m, type);
|
||||
setParameters(m, type);
|
||||
|
||||
if ((flags & VARARGS) != 0) {
|
||||
final Type last = type.getParameterTypes().last();
|
||||
@ -2457,22 +2497,17 @@ public class ClassReader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the parameter names for a symbol from the name index in the
|
||||
* parameterNameIndicies array. The type of the symbol may have changed
|
||||
* while reading the method attributes (see the Signature attribute).
|
||||
* This may be because of generic information or because anonymous
|
||||
* synthetic parameters were added. The original type (as read from
|
||||
* the method descriptor) is used to help guess the existence of
|
||||
* Set the parameters for a method symbol, including any names and
|
||||
* annotations that were read.
|
||||
*
|
||||
* <p>The type of the symbol may have changed while reading the
|
||||
* method attributes (see the Signature attribute). This may be
|
||||
* because of generic information or because anonymous synthetic
|
||||
* parameters were added. The original type (as read from the
|
||||
* method descriptor) is used to help guess the existence of
|
||||
* anonymous synthetic parameters.
|
||||
* On completion, sym.savedParameter names will either be null (if
|
||||
* no parameter names were found in the class file) or will be set to a
|
||||
* list of names, one per entry in sym.type.getParameterTypes, with
|
||||
* any missing names represented by the empty name.
|
||||
*/
|
||||
void setParameterNames(MethodSymbol sym, Type jvmType) {
|
||||
// if no names were found in the class file, there's nothing more to do
|
||||
if (!haveParameterNameIndices)
|
||||
return;
|
||||
void setParameters(MethodSymbol sym, Type jvmType) {
|
||||
// If we get parameter names from MethodParameters, then we
|
||||
// don't need to skip.
|
||||
int firstParam = 0;
|
||||
@ -2483,16 +2518,16 @@ public class ClassReader {
|
||||
// make a corresponding allowance here for the position of
|
||||
// the first parameter. Note that this assumes the
|
||||
// skipped parameter has a width of 1 -- i.e. it is not
|
||||
// a double width type (long or double.)
|
||||
if (sym.name == names.init && currentOwner.hasOuterInstance()) {
|
||||
// Sometimes anonymous classes don't have an outer
|
||||
// instance, however, there is no reliable way to tell so
|
||||
// we never strip this$n
|
||||
if (!currentOwner.name.isEmpty())
|
||||
firstParam += 1;
|
||||
}
|
||||
// a double width type (long or double.)
|
||||
if (sym.name == names.init && currentOwner.hasOuterInstance()) {
|
||||
// Sometimes anonymous classes don't have an outer
|
||||
// instance, however, there is no reliable way to tell so
|
||||
// we never strip this$n
|
||||
if (!currentOwner.name.isEmpty())
|
||||
firstParam += 1;
|
||||
}
|
||||
|
||||
if (sym.type != jvmType) {
|
||||
if (sym.type != jvmType) {
|
||||
// reading the method attributes has caused the
|
||||
// symbol's type to be changed. (i.e. the Signature
|
||||
// attribute.) This may happen if there are hidden
|
||||
@ -2502,21 +2537,55 @@ public class ClassReader {
|
||||
// at the beginning, and so skip over them. The
|
||||
// primary case for this is two hidden parameters
|
||||
// passed into Enum constructors.
|
||||
int skip = Code.width(jvmType.getParameterTypes())
|
||||
- Code.width(sym.type.getParameterTypes());
|
||||
firstParam += skip;
|
||||
}
|
||||
int skip = Code.width(jvmType.getParameterTypes())
|
||||
- Code.width(sym.type.getParameterTypes());
|
||||
firstParam += skip;
|
||||
}
|
||||
}
|
||||
List<Name> paramNames = List.nil();
|
||||
int index = firstParam;
|
||||
ListBuffer<VarSymbol> params = new ListBuffer<>();
|
||||
int nameIndex = firstParam;
|
||||
int annotationIndex = 0;
|
||||
for (Type t: sym.type.getParameterTypes()) {
|
||||
int nameIdx = (index < parameterNameIndices.length
|
||||
? parameterNameIndices[index] : 0);
|
||||
Name name = nameIdx == 0 ? names.empty : readName(nameIdx);
|
||||
Name name = parameterName(nameIndex, paramNames);
|
||||
paramNames = paramNames.prepend(name);
|
||||
index += sawMethodParameters ? 1 : Code.width(t);
|
||||
VarSymbol param = new VarSymbol(PARAMETER, name, t, sym);
|
||||
params.append(param);
|
||||
if (parameterAnnotations != null) {
|
||||
ParameterAnnotations annotations = parameterAnnotations[annotationIndex];
|
||||
if (annotations != null && annotations.proxies != null
|
||||
&& !annotations.proxies.isEmpty()) {
|
||||
annotate.normal(new AnnotationCompleter(param, annotations.proxies));
|
||||
}
|
||||
}
|
||||
nameIndex += sawMethodParameters ? 1 : Code.width(t);
|
||||
annotationIndex++;
|
||||
}
|
||||
if (parameterAnnotations != null && parameterAnnotations.length != annotationIndex) {
|
||||
throw badClassFile("bad.runtime.invisible.param.annotations", sym);
|
||||
}
|
||||
Assert.checkNull(sym.params);
|
||||
sym.params = params.toList();
|
||||
parameterAnnotations = null;
|
||||
parameterNameIndices = null;
|
||||
}
|
||||
|
||||
|
||||
// Returns the name for the parameter at position 'index', either using
|
||||
// names read from the MethodParameters, or by synthesizing a name that
|
||||
// is not on the 'exclude' list.
|
||||
private Name parameterName(int index, List<Name> exclude) {
|
||||
if (parameterNameIndices != null && index < parameterNameIndices.length
|
||||
&& parameterNameIndices[index] != 0) {
|
||||
return readName(parameterNameIndices[index]);
|
||||
}
|
||||
String prefix = "arg";
|
||||
while (true) {
|
||||
Name argName = names.fromString(prefix + exclude.size());
|
||||
if (!exclude.contains(argName))
|
||||
return argName;
|
||||
prefix += "$";
|
||||
}
|
||||
sym.savedParameterNames = paramNames.reverse();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -40,9 +40,9 @@ import static com.sun.tools.javac.main.Option.PROFILE;
|
||||
* deletion without notice.</b>
|
||||
*/
|
||||
public enum Profile {
|
||||
COMPACT1("compact1", 1, Target.JDK1_8, Target.JDK1_9, Target.JDK1_10),
|
||||
COMPACT2("compact2", 2, Target.JDK1_8, Target.JDK1_9, Target.JDK1_10),
|
||||
COMPACT3("compact3", 3, Target.JDK1_8, Target.JDK1_9, Target.JDK1_10),
|
||||
COMPACT1("compact1", 1, Target.JDK1_8, Target.JDK1_9, Target.JDK1_10, Target.JDK1_11),
|
||||
COMPACT2("compact2", 2, Target.JDK1_8, Target.JDK1_9, Target.JDK1_10, Target.JDK1_11),
|
||||
COMPACT3("compact3", 3, Target.JDK1_8, Target.JDK1_9, Target.JDK1_10, Target.JDK1_11),
|
||||
|
||||
DEFAULT {
|
||||
@Override
|
||||
|
@ -64,7 +64,10 @@ public enum Target {
|
||||
JDK1_9("1.9", 53, 0),
|
||||
|
||||
/** JDK 10. */
|
||||
JDK1_10("1.10", 54, 0);
|
||||
JDK1_10("1.10", 54, 0),
|
||||
|
||||
/** JDK 11. */
|
||||
JDK1_11("11", 55, 0);
|
||||
|
||||
private static final Context.Key<Target> targetKey = new Context.Key<>();
|
||||
|
||||
@ -95,6 +98,7 @@ public enum Target {
|
||||
tab.put("8", JDK1_8);
|
||||
tab.put("9", JDK1_9);
|
||||
tab.put("10", JDK1_10);
|
||||
tab.put("11", JDK1_11);
|
||||
}
|
||||
|
||||
public final String name;
|
||||
|
@ -712,20 +712,20 @@ public class JavacFiler implements Filer, Closeable {
|
||||
}
|
||||
|
||||
private void checkNameAndExistence(ModuleSymbol mod, String typename, boolean allowUnnamedPackageInfo) throws FilerException {
|
||||
// TODO: Check if type already exists on source or class path?
|
||||
// If so, use warning message key proc.type.already.exists
|
||||
checkName(typename, allowUnnamedPackageInfo);
|
||||
ClassSymbol existing;
|
||||
ClassSymbol existing = elementUtils.getTypeElement(typename);
|
||||
boolean alreadySeen = aggregateGeneratedSourceNames.contains(Pair.of(mod, typename)) ||
|
||||
aggregateGeneratedClassNames.contains(Pair.of(mod, typename)) ||
|
||||
initialClassNames.contains(typename) ||
|
||||
((existing = elementUtils.getTypeElement(typename)) != null &&
|
||||
initialInputs.contains(existing.sourcefile));
|
||||
(existing != null && initialInputs.contains(existing.sourcefile));
|
||||
if (alreadySeen) {
|
||||
if (lint)
|
||||
log.warning(Warnings.ProcTypeRecreate(typename));
|
||||
throw new FilerException("Attempt to recreate a file for type " + typename);
|
||||
}
|
||||
if (lint && existing != null) {
|
||||
log.warning("proc.type.already.exists", typename);
|
||||
}
|
||||
if (!mod.isUnnamed() && !typename.contains(".")) {
|
||||
throw new FilerException("Attempt to create a type in unnamed package of a named module: " + typename);
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ import com.sun.tools.javac.util.StringUtils;
|
||||
* deletion without notice.</b>
|
||||
*/
|
||||
@SupportedAnnotationTypes("*")
|
||||
@SupportedSourceVersion(SourceVersion.RELEASE_10)
|
||||
@SupportedSourceVersion(SourceVersion.RELEASE_11)
|
||||
public class PrintingProcessor extends AbstractProcessor {
|
||||
PrintWriter writer;
|
||||
|
||||
|
@ -443,6 +443,10 @@ compiler.err.invalid.repeatable.annotation.not.applicable.in.context=\
|
||||
compiler.err.duplicate.class=\
|
||||
duplicate class: {0}
|
||||
|
||||
# 0: name, 1: name
|
||||
compiler.err.same.binary.name=\
|
||||
classes: {0} and {1} have the same binary name
|
||||
|
||||
compiler.err.duplicate.case.label=\
|
||||
duplicate case label
|
||||
|
||||
@ -1140,16 +1144,21 @@ compiler.err.type.var.more.than.once=\
|
||||
compiler.err.type.var.more.than.once.in.result=\
|
||||
type variable {0} occurs more than once in type of {1}; cannot be left uninstantiated
|
||||
|
||||
# 0: type, 1: type, 2: string
|
||||
compiler.err.types.incompatible.diff.ret=\
|
||||
types {0} and {1} are incompatible; both define {2}, but with unrelated return types
|
||||
# 0: type, 1: type, 2: fragment
|
||||
compiler.err.types.incompatible=\
|
||||
types {0} and {1} are incompatible;\n\
|
||||
{2}
|
||||
|
||||
# 0: name, 1: list of type
|
||||
compiler.misc.incompatible.diff.ret=\
|
||||
both define {0}({1}), but with unrelated return types
|
||||
|
||||
# 0: kind name, 1: type, 2: name, 3: list of type, 4: symbol, 5: symbol
|
||||
compiler.err.types.incompatible.unrelated.defaults=\
|
||||
compiler.misc.incompatible.unrelated.defaults=\
|
||||
{0} {1} inherits unrelated defaults for {2}({3}) from types {4} and {5}
|
||||
|
||||
# 0: kind name, 1: type, 2: name, 3: list of type, 4: symbol, 5: symbol
|
||||
compiler.err.types.incompatible.abstract.default=\
|
||||
compiler.misc.incompatible.abstract.default=\
|
||||
{0} {1} inherits abstract and default for {2}({3}) from types {4} and {5}
|
||||
|
||||
# 0: name, 1: kind name, 2: symbol
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -46,8 +46,8 @@ public class Classfile {
|
||||
private final ResolvedJavaType type;
|
||||
private final List<ClassfileBytecode> codeAttributes;
|
||||
|
||||
private static final int MAJOR_VERSION_JAVA7 = 51;
|
||||
private static final int MAJOR_VERSION_JAVA10 = 54;
|
||||
private static final int MAJOR_VERSION_JAVA_MIN = 51;
|
||||
private static final int MAJOR_VERSION_JAVA_MAX = 55;
|
||||
private static final int MAGIC = 0xCAFEBABE;
|
||||
|
||||
/**
|
||||
@ -65,7 +65,7 @@ public class Classfile {
|
||||
|
||||
int minor = stream.readUnsignedShort();
|
||||
int major = stream.readUnsignedShort();
|
||||
if (major < MAJOR_VERSION_JAVA7 || major > MAJOR_VERSION_JAVA10) {
|
||||
if (major < MAJOR_VERSION_JAVA_MIN || major > MAJOR_VERSION_JAVA_MAX) {
|
||||
throw new UnsupportedClassVersionError("Unsupported class file version: " + major + "." + minor);
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ import javax.lang.model.util.Elements;
|
||||
|
||||
import javax.tools.Diagnostic;
|
||||
|
||||
import static javax.lang.model.SourceVersion.RELEASE_10;
|
||||
import static javax.lang.model.SourceVersion.RELEASE_11;
|
||||
|
||||
/**
|
||||
* Annotation processor for the Deprecation Scanner tool.
|
||||
@ -58,7 +58,7 @@ import static javax.lang.model.SourceVersion.RELEASE_10;
|
||||
*
|
||||
*/
|
||||
@SupportedAnnotationTypes("java.lang.Deprecated")
|
||||
@SupportedSourceVersion(RELEASE_10)
|
||||
@SupportedSourceVersion(RELEASE_11)
|
||||
public class LoadProc extends AbstractProcessor {
|
||||
Elements elements;
|
||||
Messager messager;
|
||||
|
@ -106,7 +106,7 @@ public class Main implements DiagnosticListener<JavaFileObject> {
|
||||
// Keep these updated manually until there's a compiler API
|
||||
// that allows querying of supported releases.
|
||||
final Set<String> releasesWithoutForRemoval = Set.of("6", "7", "8");
|
||||
final Set<String> releasesWithForRemoval = Set.of("9", "10");
|
||||
final Set<String> releasesWithForRemoval = Set.of("9", "10", "11");
|
||||
|
||||
final Set<String> validReleases;
|
||||
{
|
||||
@ -358,14 +358,15 @@ public class Main implements DiagnosticListener<JavaFileObject> {
|
||||
* Process classes from a particular JDK release, using only information
|
||||
* in this JDK.
|
||||
*
|
||||
* @param release "6", "7", "8", "9", or "10"
|
||||
* @param release "6", "7", "8", "9", "10", or "11"
|
||||
* @param classes collection of classes to process, may be empty
|
||||
* @return success value
|
||||
*/
|
||||
boolean processRelease(String release, Collection<String> classes) throws IOException {
|
||||
options.addAll(List.of("--release", release));
|
||||
|
||||
if (release.equals("9") || release.equals("10")) {
|
||||
if (release.equals("9") || release.equals("10") ||
|
||||
release.equals("11")) {
|
||||
List<String> rootMods = List.of("java.se", "java.se.ee");
|
||||
TraverseProc proc = new TraverseProc(rootMods);
|
||||
JavaCompiler.CompilationTask task =
|
||||
@ -481,7 +482,7 @@ public class Main implements DiagnosticListener<JavaFileObject> {
|
||||
String dir = null;
|
||||
String jar = null;
|
||||
String jdkHome = null;
|
||||
String release = "10";
|
||||
String release = "11";
|
||||
List<String> loadClasses = new ArrayList<>();
|
||||
String csvFile = null;
|
||||
|
||||
|
@ -1817,7 +1817,7 @@ public class JShellTool implements MessageHandler {
|
||||
|
||||
// Documentation pseudo-commands
|
||||
registerCommand(new Command("/<id>",
|
||||
"help.id",
|
||||
"help.slashID",
|
||||
arg -> cmdHelp("rerun"),
|
||||
EMPTY_COMPLETION_PROVIDER,
|
||||
CommandKind.HELP_ONLY));
|
||||
@ -1829,6 +1829,9 @@ public class JShellTool implements MessageHandler {
|
||||
registerCommand(new Command("intro",
|
||||
"help.intro",
|
||||
CommandKind.HELP_SUBJECT));
|
||||
registerCommand(new Command("id",
|
||||
"help.id",
|
||||
CommandKind.HELP_SUBJECT));
|
||||
registerCommand(new Command("shortcuts",
|
||||
"help.shortcuts",
|
||||
CommandKind.HELP_SUBJECT));
|
||||
|
@ -46,7 +46,7 @@ jshell.err.file.not.found = File ''{1}'' for ''{0}'' is not found.
|
||||
jshell.err.file.exception = File ''{1}'' for ''{0}'' threw exception: {2}
|
||||
jshell.err.file.filename = ''{0}'' requires a filename argument.
|
||||
|
||||
jshell.err.startup.unexpected.exception = Unexpected exception reading start-up: {0}
|
||||
jshell.err.startup.unexpected.exception = Unexpected exception reading startup: {0}
|
||||
jshell.err.unexpected.exception = Unexpected exception: {0}
|
||||
|
||||
jshell.err.invalid.command = Invalid command: {0}
|
||||
@ -104,9 +104,9 @@ For example ''/help /list'' or ''/help intro''.\n\
|
||||
Subjects:\n\
|
||||
\n
|
||||
|
||||
jshell.err.no.snippet.with.id = No snippet with id: {0}
|
||||
jshell.err.no.snippet.with.id = No snippet with ID: {0}
|
||||
jshell.err.end.snippet.range.less.than.start = End of snippet range less than start: {0} - {1}
|
||||
jshell.err.range.requires.id = Snippet ranges require snippet ids: {0}
|
||||
jshell.err.range.requires.id = Snippet ranges require snippet IDs: {0}
|
||||
|
||||
jshell.err.exit.not.expression = The argument to /exit must be a valid integer expression, it is not an expression: {0}
|
||||
jshell.err.exit.bad.type = The argument to /exit must be a valid integer expression. The type is {1} : {0}
|
||||
@ -114,7 +114,7 @@ jshell.err.exit.bad.value = The argument to /exit has bad value is {1} : {0}
|
||||
|
||||
jshell.err.drop.arg =\
|
||||
In the /drop argument, please specify an import, variable, method, or class to drop.\n\
|
||||
Specify by id or name. Use /list to see ids. Use /reset to reset all state.
|
||||
Specify by ID or name. Use /list to see IDs. Use /reset to reset all state.
|
||||
jshell.err.failed = Failed.
|
||||
jshell.msg.native.method = Native Method
|
||||
jshell.msg.unknown.source = Unknown Source
|
||||
@ -193,15 +193,15 @@ For more information see:\n\
|
||||
/help shortcuts
|
||||
|
||||
help.usage = \
|
||||
Usage: jshell <option>... <load file>...\n\
|
||||
Usage: jshell <option>... <load-file>...\n\
|
||||
where possible options include:\n\
|
||||
\ --class-path <path> Specify where to find user class files\n\
|
||||
\ --module-path <path> Specify where to find application modules\n\
|
||||
\ --add-modules <module>(,<module>)*\n\
|
||||
\ Specify modules to resolve, or all modules on the\n\
|
||||
\ module path if <module> is ALL-MODULE-PATHs\n\
|
||||
\ --startup <file> One run replacement for the start-up definitions\n\
|
||||
\ --no-startup Do not run the start-up definitions\n\
|
||||
\ --startup <file> One run replacement for the startup definitions\n\
|
||||
\ --no-startup Do not run the startup definitions\n\
|
||||
\ --feedback <mode> Specify the initial feedback mode. The mode may be\n\
|
||||
\ predefined (silent, concise, normal, or verbose) or\n\
|
||||
\ previously user-defined\n\
|
||||
@ -218,12 +218,22 @@ where possible options include:\n\
|
||||
\ --show-version Print version information and continue\n\
|
||||
\ --help Print this synopsis of standard options and exit\n\
|
||||
\ --help-extra, -X Print help on non-standard options and exit\n\
|
||||
\n\
|
||||
A file argument may be a file name, or one of the predefined file names: DEFAULT,\n\
|
||||
PRINTING, or JAVASE.\n\
|
||||
A load file may also be "-" to indicate standard input, without interactive I/O.\n
|
||||
A load-file may also be "-" to indicate standard input, without interactive I/O.\n\
|
||||
\n\
|
||||
For more information on the evaluation context options (--class-path,\n\
|
||||
--module-path, and --add-modules) see:\n\t\
|
||||
/help context\n\
|
||||
\n\
|
||||
A path lists the directories and archives to search. For Windows, use a\n\
|
||||
semicolon (;) to separate items in the path. On other platforms, use a\n\
|
||||
colon (:) to separate items.\n\
|
||||
|
||||
help.usage.x = \
|
||||
\ --add-exports <module>/<package> Export specified module-private package to snippets\n\
|
||||
\ --add-exports <module>/<package> Specify a package to be considered as\n\
|
||||
\ exported from its defining module \n\
|
||||
\ --execution <spec> Specify an alternate execution engine.\n\
|
||||
\ Where <spec> is an ExecutionControl spec.\n\
|
||||
\ See the documentation of the package\n\
|
||||
@ -234,47 +244,43 @@ help.usage.x = \
|
||||
help.list.summary = list the source you have typed
|
||||
help.list.args = [<name or id>|-all|-start]
|
||||
help.list =\
|
||||
Show the source of snippets, prefaced with the snippet id.\n\
|
||||
Show the snippets, prefaced with their snippet IDs.\n\
|
||||
\n\
|
||||
/list\n\t\
|
||||
List the currently active snippets of code that you typed or read with /open\n\n\
|
||||
/list -start\n\t\
|
||||
List the automatically evaluated start-up snippets\n\n\
|
||||
List the evaluated startup snippets\n\n\
|
||||
/list -all\n\t\
|
||||
List all snippets including failed, overwritten, dropped, and start-up\n\n\
|
||||
List all snippets including failed, overwritten, dropped, and startup\n\n\
|
||||
/list <name>\n\t\
|
||||
List snippets with the specified name (preference for active snippets)\n\n\
|
||||
/list <id>\n\t\
|
||||
List the snippet with the specified snippet id\n\n\
|
||||
/list <id> <id>...\n\t\
|
||||
List the snippets with the specified snippet ids\n\n\
|
||||
/list <id>-<id>\n\t\
|
||||
List the snippets within the range of snippet ids
|
||||
List the snippet with the specified snippet ID.\n\t\
|
||||
One or more IDs or ID ranges may used, see '/help id'
|
||||
|
||||
help.edit.summary = edit a source entry referenced by name or id
|
||||
help.edit.summary = edit a source entry
|
||||
help.edit.args = <name or id>
|
||||
help.edit =\
|
||||
Edit a snippet or snippets of source in an external editor.\n\
|
||||
The editor to use is set with /set editor.\n\
|
||||
If no editor has been set, a simple editor will be launched.\n\
|
||||
The editor to use is set with /set editor. If no editor is set, then the\n\
|
||||
following environment variables are checked in order: JSHELLEDITOR, VISUAL,\n\
|
||||
and EDITOR. If no editor has been set and none of the editor environment\n\
|
||||
variables is set, a simple editor will be launched.\n\
|
||||
\n\
|
||||
/edit <name>\n\t\
|
||||
Edit the snippet or snippets with the specified name (preference for active snippets)\n\n\
|
||||
/edit <id>\n\t\
|
||||
Edit the snippet with the specified snippet id\n\n\
|
||||
/edit <id> <id>...\n\t\
|
||||
Edit the snippets with the specified snippet ids\n\n\
|
||||
/edit <id>-<id>\n\t\
|
||||
Edit the snippets within the range of snippet ids\n\n\
|
||||
Edit the snippet with the specified snippet ID.\n\t\
|
||||
One or more IDs or ID ranges may used, see '/help id'\n\n\
|
||||
/edit -start\n\t\
|
||||
Edit the automatically evaluated start-up snippets. Any changes are in this\n\t\
|
||||
session, and do not affect the start-up setting\n\n\
|
||||
Edit the startup snippets. Any changes are in this session, and do not\n\t\
|
||||
affect the startup setting\n\n\
|
||||
/edit -all\n\t\
|
||||
Edit all snippets including failed, overwritten, dropped, and start-up\n\n\
|
||||
Edit all snippets including failed, overwritten, dropped, and startup\n\n\
|
||||
/edit\n\t\
|
||||
Edit the currently active snippets of code that you typed or read with /open
|
||||
|
||||
help.drop.summary = delete a source entry referenced by name or id
|
||||
help.drop.summary = delete a source entry
|
||||
help.drop.args = <name or id>
|
||||
help.drop =\
|
||||
Drop a snippet -- making it inactive.\n\
|
||||
@ -282,13 +288,10 @@ Drop a snippet -- making it inactive.\n\
|
||||
/drop <name>\n\t\
|
||||
Drop the snippet with the specified name\n\n\
|
||||
/drop <id>\n\t\
|
||||
Drop the snippet with the specified snippet id\n\n\
|
||||
/drop <id> <id>...\n\t\
|
||||
Drop the snippets with the specified snippet ids\n\n\
|
||||
/drop <id>-<id>\n\t\
|
||||
Drop the snippets within the range of snippet ids
|
||||
Drop the snippet with the specified snippet ID.\n\t\
|
||||
One or more IDs or ID ranges may used, see '/help id'
|
||||
|
||||
help.save.summary = Save snippet source to a file.
|
||||
help.save.summary = Save snippet source to a file
|
||||
help.save.args = [-all|-history|-start] <file>
|
||||
help.save =\
|
||||
Save the specified snippets and/or commands to the specified file.\n\
|
||||
@ -297,17 +300,15 @@ Save the specified snippets and/or commands to the specified file.\n\
|
||||
Save the source of current active snippets to the file.\n\n\
|
||||
/save -all <file>\n\t\
|
||||
Save the source of all snippets to the file.\n\t\
|
||||
Includes source including overwritten, failed, and start-up code.\n\n\
|
||||
Includes source of overwritten, failed, and startup code\n\n\
|
||||
/save -history <file>\n\t\
|
||||
Save the sequential history of all commands and snippets entered since jshell was launched.\n\n\
|
||||
Save the sequential history of all commands and snippets entered since the\n\t\
|
||||
jshell tool was launched.\n\n\
|
||||
/save -start <file>\n\t\
|
||||
Save the current start-up definitions to the file.\n\n\
|
||||
Save the current startup definitions to the file\n\n\
|
||||
/save <id> <file>\n\t\
|
||||
Save the snippet with the specified snippet id\n\n\
|
||||
/save <id> <id>... <file>\n\t\
|
||||
Save the snippets with the specified snippet ids\n\n\
|
||||
/save <id>-<id> <file>\n\t\
|
||||
Save the snippets within the range of snippet ids
|
||||
Save the snippet with the specified snippet ID.\n\t\
|
||||
One or more IDs or ID ranges may used, see '/help id'
|
||||
|
||||
help.open.summary = open a file as source input
|
||||
help.open.args = <file>
|
||||
@ -315,97 +316,94 @@ help.open =\
|
||||
Open a file and read its contents as snippets and commands.\n\
|
||||
\n\
|
||||
/open <file>\n\t\
|
||||
Read the specified file as jshell input.
|
||||
Read the specified file as the jshell tool input.\n\
|
||||
\n\
|
||||
The <file> may be an operating system file name, or one of the predefined\n\
|
||||
file names: DEFAULT, PRINTING, or JAVASE.\n\
|
||||
These are respectively: the default import snippets (as used by -default),\n\
|
||||
definitions of print(), println(), and printf() method snippets, or\n\
|
||||
imports of all Java SE packages.\n
|
||||
|
||||
help.vars.summary = list the declared variables and their values
|
||||
help.vars.args = [<name or id>|-all|-start]
|
||||
help.vars =\
|
||||
List the type, name, and value of jshell variables.\n\
|
||||
List the type, name, and value of variables that were entered.\n\
|
||||
\n\
|
||||
/vars\n\t\
|
||||
List the type, name, and value of the current active jshell variables\n\n\
|
||||
List the type, name, and value of the current active variables\n\n\
|
||||
/vars <name>\n\t\
|
||||
List jshell variables with the specified name (preference for active variables)\n\n\
|
||||
List variables with the specified name (preference for active variables)\n\n\
|
||||
/vars <id>\n\t\
|
||||
List the jshell variable with the specified snippet id\n\n\
|
||||
/vars <id> <id>... <file>\n\t\
|
||||
List the jshell variables with the specified snippet ids\n\n\
|
||||
/vars <id>-<id> <file>\n\t\
|
||||
List the jshell variables within the range of snippet ids\n\n\
|
||||
List the variable with the specified snippet ID.\n\t\
|
||||
One or more IDs or ID ranges may used, see '/help id'\n\n\
|
||||
/vars -start\n\t\
|
||||
List the automatically added start-up jshell variables\n\n\
|
||||
List the variables in the evaluated startup snippets\n\n\
|
||||
/vars -all\n\t\
|
||||
List all jshell variables including failed, overwritten, dropped, and start-up
|
||||
List all variables including failed, overwritten, dropped, and startup
|
||||
|
||||
help.methods.summary = list the declared methods and their signatures
|
||||
help.methods.args = [<name or id>|-all|-start]
|
||||
help.methods =\
|
||||
List the name, parameter types, and return type of jshell methods.\n\
|
||||
List the name, parameter types, and return type of methods that were entered.\n\
|
||||
\n\
|
||||
/methods\n\t\
|
||||
List the name, parameter types, and return type of the current active jshell methods\n\n\
|
||||
List the name, parameter types, and return type of the current active methods\n\n\
|
||||
/methods <name>\n\t\
|
||||
List jshell methods with the specified name (preference for active methods)\n\n\
|
||||
List methods with the specified name (preference for active methods)\n\n\
|
||||
/methods <id>\n\t\
|
||||
List the jshell method with the specified snippet id\n\n\
|
||||
/methods <id> <id>... <file>\n\t\
|
||||
List jshell methods with the specified snippet ids\n\n\
|
||||
/methods <id>-<id> <file>\n\t\
|
||||
List jshell methods within the range of snippet ids\n\n\
|
||||
List the method with the specified snippet ID.\n\t\
|
||||
One or more IDs or ID ranges may used, see '/help id'\n\n\
|
||||
/methods -start\n\t\
|
||||
List the automatically added start-up jshell methods\n\n\
|
||||
List the methods in the evaluated startup snippets\n\n\
|
||||
/methods -all\n\t\
|
||||
List all snippets including failed, overwritten, dropped, and start-up
|
||||
List all snippets including failed, overwritten, dropped, and startup
|
||||
|
||||
help.types.summary = list the declared types
|
||||
help.types.summary = list the type declarations
|
||||
help.types.args =[<name or id>|-all|-start]
|
||||
help.types =\
|
||||
List jshell classes, interfaces, and enums.\n\
|
||||
List classes and interfaces that were entered.\n\
|
||||
\n\
|
||||
/types\n\t\
|
||||
List the current active jshell classes, interfaces, and enums.\n\n\
|
||||
List the current active type declarations\n\n\
|
||||
/types <name>\n\t\
|
||||
List jshell types with the specified name (preference for active types)\n\n\
|
||||
List type declarations with the specified name (preference for active snippets)\n\n\
|
||||
/types <id>\n\t\
|
||||
List the jshell type with the specified snippet id\n\n\
|
||||
/types <id> <id>... <file>\n\t\
|
||||
List jshell types with the specified snippet ids\n\n\
|
||||
/types <id>-<id> <file>\n\t\
|
||||
List jshell types within the range of snippet ids\n\n\
|
||||
List the type declaration with the specified snippet ID.\n\t\
|
||||
One or more IDs or ID ranges may used, see '/help id'\n\n\
|
||||
/types -start\n\t\
|
||||
List the automatically added start-up jshell types\n\n\
|
||||
List the type declarations in the evaluated startup snippets\n\n\
|
||||
/types -all\n\t\
|
||||
List all jshell types including failed, overwritten, dropped, and start-up
|
||||
List all type declarations including failed, overwritten, dropped, and startup
|
||||
|
||||
help.imports.summary = list the imported items
|
||||
help.imports.args =
|
||||
help.imports =\
|
||||
List the current active jshell imports.
|
||||
List the current active imports. This will include imports from\n\
|
||||
startup snippets.
|
||||
|
||||
help.exit.summary = exit jshell
|
||||
help.exit.summary = exit the jshell tool
|
||||
help.exit.args =[<integer-expression-snippet>]
|
||||
help.exit =\
|
||||
Leave the jshell tool. No work is saved.\n\
|
||||
Save any work before using this command\n\
|
||||
\n\
|
||||
/exit\n\t\
|
||||
Leave the jshell tool. The exit status is zero.\n\n\
|
||||
Leave the jshell tool. The exit status is zero\n\n\
|
||||
/exit <integer-expression-snippet>\n\t\
|
||||
Evaluate the snippet. If the snippet fails or is not an integer expression,\n\t\
|
||||
display the error. Otherwise leave the jshell tool with the\n\t\
|
||||
value of the expression as the exit status
|
||||
|
||||
help.reset.summary = reset jshell
|
||||
help.reset.summary = reset the jshell tool
|
||||
help.reset.args = \
|
||||
[-class-path <path>] [-module-path <path>] [-add-modules <modules>]...
|
||||
help.reset =\
|
||||
Reset the jshell tool code and execution state:\n\t\
|
||||
* All entered code is lost.\n\t\
|
||||
* Start-up code is re-executed.\n\t\
|
||||
* The execution state is restarted.\n\t\
|
||||
Tool settings are maintained, as set with: /set ...\n\
|
||||
* All entered code is lost\n\t\
|
||||
* The execution state is restarted\n\t\
|
||||
* Startup code is re-executed\n\
|
||||
Save any work before using this command.\n\
|
||||
The /reset command accepts context options, see:\n\n\t\
|
||||
The /reset command accepts evaluation context options, see:\n\n\t\
|
||||
/help context\n\
|
||||
|
||||
|
||||
@ -417,18 +415,19 @@ Reset the jshell tool code and execution state then replay each valid snippet\n\
|
||||
and any /drop commands in the order they were entered.\n\
|
||||
\n\
|
||||
/reload\n\t\
|
||||
Reset and replay the valid history since jshell was entered, or\n\t\
|
||||
a /reset, or /reload command was executed -- whichever is most\n\t\
|
||||
recent.\n\n\
|
||||
Reset and replay the valid history since the jshell tool was entered, or\n\t\
|
||||
a /reset or /reload command was executed -- whichever is most\n\t\
|
||||
recent\n\n\
|
||||
/reload -restore\n\t\
|
||||
Reset and replay the valid history between the previous and most\n\t\
|
||||
recent time that jshell was entered, or a /reset, /reload, or /env\n\t\
|
||||
recent time that the jshell tool was entered, or a /reset, /reload, or /env\n\t\
|
||||
command was executed. This can thus be used to restore a previous\n\t\
|
||||
jshell tool session.\n\n\
|
||||
jshell tool session\n\n\
|
||||
/reload [-restore] -quiet\n\t\
|
||||
With the '-quiet' argument the replay is not shown. Errors will display.\n\
|
||||
With the '-quiet' argument the replay is not shown, however any errors\n\t\
|
||||
will be displayed\n\
|
||||
\n\
|
||||
Each of the above accepts context options, see:\n\n\t\
|
||||
Each of the above accepts evaluation context options, see:\n\n\t\
|
||||
/help context\n\
|
||||
\n\
|
||||
For example:\n\n\t\
|
||||
@ -439,28 +438,30 @@ help.env.args = \
|
||||
[-class-path <path>] [-module-path <path>] [-add-modules <modules>] ...
|
||||
help.env =\
|
||||
View or change the evaluation context. The evaluation context is the class path,\n\
|
||||
module path, etc.\n\
|
||||
module path, etc.\n\n\
|
||||
/env\n\t\
|
||||
Show the evaluation context displayed as context options.\n\n\
|
||||
Show the evaluation context displayed as context options\n\n\
|
||||
/env [-class-path <path>] [-module-path <path>] [-add-modules <modules>] ...\n\t\
|
||||
With at least one option set, sets the evaluation context. If snippets\n\t\
|
||||
have been defined, the execution state is reset with the new\n\t\
|
||||
evaluation context and the snippets will be replayed -- the replay is not\n\t\
|
||||
shown, however, errors will display. This is equivalent to: /reload -quiet\n\t\
|
||||
For details of context options, see:\n\n\t\t\
|
||||
/help context\n\n\t\
|
||||
For example:\n\n\t\t\
|
||||
/env -add-modules com.greetings
|
||||
shown, however any errors will be displayed. This is equivalent to:\n\n\t\t\
|
||||
/reload -quiet ...\n\
|
||||
\n\
|
||||
For details of evaluation context options, see:\n\n\t\
|
||||
/help context\n\n\
|
||||
For example:\n\n\t\
|
||||
/env -add-modules com.greetings
|
||||
|
||||
help.history.summary = history of what you have typed
|
||||
help.history.args =
|
||||
help.history =\
|
||||
Display the history of snippet and command input since this jshell was launched.
|
||||
Display the history of snippet and command input since this jshell tool was launched.
|
||||
|
||||
help.debug.summary = toggle debugging of the jshell
|
||||
help.debug.summary = toggle debugging of the jshell tool
|
||||
help.debug.args = [0][r][g][f][c][d][e]
|
||||
help.debug =\
|
||||
Display debugging information for the jshell implementation.\n\
|
||||
Display debugging information for the jshell tool implementation.\n\
|
||||
0: Debugging off\n\
|
||||
r: Tool level debugging on\n\
|
||||
g: General debugging on\n\
|
||||
@ -469,12 +470,12 @@ c: Completion analysis debugging on\n\
|
||||
d: Dependency debugging on\n\
|
||||
e: Event debugging on
|
||||
|
||||
help.help.summary = get information about jshell
|
||||
help.help.summary = get information about using the jshell tool
|
||||
help.help.args = [<command>|<subject>]
|
||||
help.help =\
|
||||
Display information about jshell.\n\
|
||||
Display information about using the jshell tool.\n\
|
||||
/help\n\t\
|
||||
List the jshell commands and help subjects.\n\n\
|
||||
List the jshell tool commands and help subjects\n\n\
|
||||
/help <command>\n\t\
|
||||
Display information about the specified command. The slash must be included.\n\t\
|
||||
Only the first few letters of the command are needed -- if more than one\n\t\
|
||||
@ -482,40 +483,40 @@ Display information about jshell.\n\
|
||||
/help <subject>\n\t\
|
||||
Display information about the specified help subject. Example: /help intro
|
||||
|
||||
help.set.summary = set jshell configuration information
|
||||
help.set.summary = set configuration information
|
||||
help.set.args = editor|start|feedback|mode|prompt|truncation|format ...
|
||||
help.set =\
|
||||
Set jshell configuration information, including:\n\
|
||||
the external editor to use, the start-up definitions to use, a new feedback mode,\n\
|
||||
Set the jshell tool configuration information, including:\n\
|
||||
the external editor to use, the startup definitions to use, a new feedback mode,\n\
|
||||
the command prompt, the feedback mode to use, or the format of output.\n\
|
||||
\n\
|
||||
/set editor [-wait] <command> <optional-arg>...\n\t\
|
||||
Specify the command to launch for the /edit command.\n\t\
|
||||
The <command> is an operating system dependent string.\n\n\
|
||||
The <command> is an operating system dependent string\n\n\
|
||||
/set start <file>\n\t\
|
||||
The contents of the specified <file> become the default start-up snippets and commands.\n\n\
|
||||
The contents of the specified <file> become the default startup snippets and commands\n\n\
|
||||
/set feedback <mode>\n\t\
|
||||
Set the feedback mode describing displayed feedback for entered snippets and commands.\n\n\
|
||||
Set the feedback mode describing displayed feedback for entered snippets and commands\n\n\
|
||||
/set mode <mode> [<old-mode>] -command|-quiet|-delete\n\t\
|
||||
Create or update a user-defined feedback mode, optionally copying from an existing mode.\n\n\
|
||||
Create or update a user-defined feedback mode, optionally copying from an existing mode\n\n\
|
||||
/set prompt <mode> "<prompt>" "<continuation-prompt>"\n\t\
|
||||
Set the displayed prompts for a given feedback mode.\n\n\
|
||||
Set the displayed prompts for a given feedback mode\n\n\
|
||||
/set truncation <mode> <length> <selector>...\n\t\
|
||||
Set the maximum length of a displayed value.\n\n\
|
||||
Set the maximum length of a displayed value\n\n\
|
||||
/set format <mode> <field> "<format>" <selector>...\n\t\
|
||||
Configure a feedback mode by setting the format of a field when the selector matches.\n\n\
|
||||
Configure a feedback mode by setting the format of a field when the selector matches\n\n\
|
||||
/set\n\t\
|
||||
Show editor, start, and feedback settings as /set commands.\n\t\
|
||||
To show the settings of any of the above, omit the set value.\n\n\
|
||||
To show the settings of any of the above, omit the set value\n\n\
|
||||
To get more information about one of these forms, use /help with the form specified.\n\
|
||||
For example: /help /set format
|
||||
|
||||
help.quest.summary = get information about jshell
|
||||
help.quest.summary = get information about using the jshell tool
|
||||
help.quest.args = [<command>|<subject>]
|
||||
help.quest =\
|
||||
Display information about jshell (abbreviation for /help).\n\
|
||||
Display information about using the jshell tool (abbreviation for /help).\n\
|
||||
/?\n\t\
|
||||
Display list of commands and help subjects.\n\
|
||||
Display list of commands and help subjects\n\
|
||||
/? <command>\n\t\
|
||||
Display information about the specified command. The slash must be included.\n\t\
|
||||
Only the first few letters of the command are needed -- if more than one\n\t\
|
||||
@ -528,17 +529,18 @@ help.bang.args =
|
||||
help.bang =\
|
||||
Reevaluate the most recently entered snippet.
|
||||
|
||||
help.id.summary = rerun snippets by id or id range -- see /help rerun
|
||||
help.id.args =
|
||||
help.id =\
|
||||
help.slashID.summary = rerun snippets by ID or ID range -- see /help rerun
|
||||
help.slashID.args =
|
||||
help.slashID =\
|
||||
/<id> <id> <id>\n\
|
||||
\n\
|
||||
/<id>-<id>\n\
|
||||
\n\
|
||||
Reevaluate the snippets specified by the id or id range.\n\
|
||||
An id range is represented as a two ids separated by a hyphen, e.g.: 3-17\n\
|
||||
Start-up and error snippets maybe used, e.g.: s3-s9 or e1-e4\n\
|
||||
Any number of ids or id ranges may be used, e.g.: /3-7 s4 14-16 e2
|
||||
Reevaluate the snippets specified by the ID or ID range.\n\
|
||||
An ID range is represented as a two IDs separated by a hyphen, e.g.: 3-17\n\
|
||||
Startup and error snippets maybe used, e.g.: s3-s9 or e1-e4\n\
|
||||
Any number of IDs or ID ranges may be used, e.g.: /3-7 s4 14-16 e2\n\
|
||||
See '/help id'.
|
||||
|
||||
help.previous.summary = rerun n-th previous snippet -- see /help rerun
|
||||
help.previous.args =
|
||||
@ -553,7 +555,7 @@ or a Java expression, like: x + x\n\
|
||||
or a Java statement or import.\n\
|
||||
These little chunks of Java code are called 'snippets'.\n\
|
||||
\n\
|
||||
There are also jshell commands that allow you to understand and\n\
|
||||
There are also the jshell tool commands that allow you to understand and\n\
|
||||
control what you are doing, like: /list\n\
|
||||
\n\
|
||||
For a list of commands: /help
|
||||
@ -565,7 +567,7 @@ Supported shortcuts include:\n\
|
||||
\n\
|
||||
<tab>\n\t\t\
|
||||
After entering the first few letters of a Java identifier,\n\t\t\
|
||||
a jshell command, or, in some cases, a jshell command argument,\n\t\t\
|
||||
a jshell tool command, or, in some cases, a jshell tool command argument,\n\t\t\
|
||||
press the <tab> key to complete the input.\n\t\t\
|
||||
If there is more than one completion, then possible completions will be shown.\n\t\t\
|
||||
Will show documentation if available and appropriate.\n\n\
|
||||
@ -580,26 +582,26 @@ Shift-<tab> m\n\t\t\
|
||||
of the expression.\n\n\
|
||||
Shift-<tab> i\n\t\t\
|
||||
After an unresolvable identifier, hold down <shift> while pressing <tab>,\n\t\t\
|
||||
then release and press "i", and jshell will propose possible imports\n\t\t\
|
||||
then release and press "i", and the jshell tool will propose possible imports\n\t\t\
|
||||
which will resolve the identifier based on the content of the specified classpath.
|
||||
|
||||
help.context.summary = a description of the evaluation context options for /env /reload and /reset
|
||||
help.context =\
|
||||
These options configure the evaluation context, they can be specified when\n\
|
||||
jshell is started: on the command-line, or restarted with the commands /env,\n\
|
||||
/reload, or /reset.\n\
|
||||
These options configure the evaluation context. They can be specified on the\n\
|
||||
command-line when the jshell tool is started or as command options when the jshell tool is\n\
|
||||
restarted with the commands /env, /reload, or /reset.\n\
|
||||
\n\
|
||||
They are:\n\t\
|
||||
--class-path <class search path of directories and zip/jar files>\n\t\t\
|
||||
A list of directories, JAR archives,\n\t\t\
|
||||
--class-path <path>\n\t\t\
|
||||
The <path> is a list of directories, JAR archives,\n\t\t\
|
||||
and ZIP archives to search for class files.\n\t\t\
|
||||
The list is separated with the path separator\n\t\t\
|
||||
(a : on unix/linux/mac, and ; on windows).\n\t\
|
||||
--module-path <module path>...\n\t\t\
|
||||
A list of directories, each directory\n\t\t\
|
||||
is a directory of modules.\n\t\t\
|
||||
The list is separated with the path separator\n\t\t\
|
||||
(a : on unix/linux/mac, and ; on windows).\n\t\
|
||||
For Windows, use a semicolon (;) to separate items in the\n\t\t\
|
||||
path. On other platforms, use a colon (:) to separate items.\n\t\
|
||||
--module-path <path>...\n\t\t\
|
||||
The <path> is a list of directories, JAR archives,\n\t\t\
|
||||
and ZIP archives to search for modules.\n\t\t\
|
||||
For Windows, use a semicolon (;) to separate items in the\n\t\t\
|
||||
path. On other platforms, use a colon (:) to separate items.\n\t\
|
||||
--add-modules <modulename>[,<modulename>...]\n\t\t\
|
||||
root modules to resolve in addition to the initial module.\n\t\t\
|
||||
<modulename> can also be ALL-DEFAULT, ALL-SYSTEM,\n\t\t\
|
||||
@ -611,8 +613,42 @@ They are:\n\t\
|
||||
unnamed modules. In jshell, if the <target-module> is not\n\t\t\
|
||||
specified (no =) then ALL-UNNAMED is used.\n\
|
||||
\n\
|
||||
Evaluation context options entered on the command line or provided with a\n\
|
||||
previous /reset, /env, or /reload command are maintained unless an option is\n\
|
||||
entered that overwrites the setting.\n\
|
||||
\n\
|
||||
On the command-line these options must have two dashes, e.g.: --module-path\n\
|
||||
On jshell commands they can have one or two dashes, e.g.: -module-path\n\
|
||||
On the jshell tool commands they can have one or two dashes, e.g.: -module-path
|
||||
|
||||
help.id.summary = a description of snippet IDs and how use them
|
||||
help.id =\
|
||||
Every snippet of code you enter has its own unique snippet ID. Even if you\n\
|
||||
enter the same snippet again, it will have a new ID. For normal snippets the ID\n\
|
||||
is an increasing number. Snippets which fail with an error have a snippet ID\n\
|
||||
which begins with 'e'. Snippets in the startup have an ID which begins with 's'.\n\
|
||||
\n\
|
||||
A snippet ID is one way to refer to a snippet in a command. For example, this\n\
|
||||
command drops the snippet with ID '14':\n\
|
||||
\n\t\
|
||||
/drop 14\n\
|
||||
\n\
|
||||
To see the ID of a snippet or snippets use the '/list' command. To see the ID\n\
|
||||
of all snippets. including failed, startup, and overwritten snippets, use the\n\
|
||||
'/list -all' command.\n\
|
||||
\n\
|
||||
You can also refer to a range of IDs by separating the beginning ID and ending\n\
|
||||
ID with a hypen. For example, '1-4' is the same as '1 2 3 4'. All commands\n\
|
||||
which refer to snippets will take a list of IDs, ID ranges, and snippet names\n\
|
||||
as arguments. These commands are: /list, /edit, /drop, /save, /vars, /methods,\n\
|
||||
/types, and /<id>. Some examples:\n\
|
||||
\n\t\
|
||||
/edit 7-23\n\
|
||||
\n\t\
|
||||
/save s1-s4 3-8 foo 12 myfile\n\
|
||||
\n\t\
|
||||
/9-12 33\n\
|
||||
\n\
|
||||
See '/help /edit', '/help /save', and '/help rerun' respectively.
|
||||
|
||||
help.rerun.summary = a description of ways to re-evaluate previously entered snippets
|
||||
help.rerun =\
|
||||
@ -639,10 +675,11 @@ For example:\n\
|
||||
\t2 + 2\n\
|
||||
\t$5 ==> 4\n\
|
||||
\n\
|
||||
The snippets to re-evaluate may be specified by snippet id or id range.\n\
|
||||
An id range is represented as a two ids separated by a hyphen, e.g.: 3-17\n\
|
||||
Start-up and error snippets maybe used, e.g.: s3-s9 or e1-e4\n\
|
||||
Any number of ids or id ranges may be used, e.g.: /3-7 s4 14-16 e2\n\
|
||||
The snippets to re-evaluate may be specified by snippet ID or ID range.\n\
|
||||
An ID range is represented as a two IDs separated by a hyphen, e.g.: 3-17\n\
|
||||
Startup and error snippets maybe used, e.g.: s3-s9 or e1-e4\n\
|
||||
Any number of IDs or ID ranges may be used, e.g.: /3-7 s4 14-16 e2\n\
|
||||
See also '/help id'.\n\
|
||||
\n\
|
||||
Finally, you can search backwards through history by entering ctrl-R followed by the string to search for.
|
||||
|
||||
@ -656,7 +693,7 @@ The -retain option can be used on the following forms of /set:\n\n\t\
|
||||
See these commands for more detail -- for example /help /set editor
|
||||
|
||||
help.set.format.summary = \
|
||||
Set the format for reporting a snippet event.
|
||||
Set the format for reporting a snippet event
|
||||
|
||||
help.set.format = \
|
||||
Set the format for reporting a snippet event:\n\
|
||||
@ -746,7 +783,7 @@ mode and field are shown. Example:\n\t\
|
||||
shows the format settings for the mode mymode\n
|
||||
|
||||
help.set.truncation.summary = \
|
||||
Set the max length of a displayed value.
|
||||
Set the max length of a displayed value
|
||||
|
||||
help.set.truncation = \
|
||||
Set the max length of a displayed value:\n\
|
||||
@ -789,7 +826,7 @@ Example:\n\t\
|
||||
shows the truncation settings for the mode mymode\n
|
||||
|
||||
help.set.feedback.summary = \
|
||||
Set the feedback mode describing displayed feedback for entered snippets and commands.
|
||||
Set the feedback mode describing displayed feedback for entered snippets and commands
|
||||
|
||||
help.set.feedback = \
|
||||
Set the feedback mode describing displayed feedback for entered snippets and commands:\n\
|
||||
@ -814,7 +851,7 @@ runs of the jshell tool.\n\
|
||||
The form without <mode> or -retain displays the current feedback mode and available modes.\n
|
||||
|
||||
help.set.mode.summary = \
|
||||
Create a user-defined feedback mode, optionally copying from an existing mode.
|
||||
Create a user-defined feedback mode, optionally copying from an existing mode
|
||||
|
||||
help.set.mode = \
|
||||
Create a user-defined feedback mode, optionally copying from an existing mode:\n\
|
||||
@ -869,7 +906,7 @@ Example:\n\t\
|
||||
shows the mode, prompt, format, and truncation settings for the mode mymode
|
||||
|
||||
help.set.prompt.summary = \
|
||||
Set the prompts.
|
||||
Set the prompts
|
||||
|
||||
help.set.prompt = \
|
||||
Set the prompts. Both the normal prompt and the continuation-prompt must be set:\n\
|
||||
@ -881,9 +918,9 @@ Show the normal prompt and the continuation-prompts:\n\
|
||||
/set prompt [<mode>]\n\
|
||||
\n\
|
||||
Where <mode> is the name of a previously defined feedback mode.\n\
|
||||
Where <prompt> and <continuation-prompt> are quoted strings printed as input prompts;\n\
|
||||
Both may optionally contain '%%s' which will be substituted with the next snippet id --\n\
|
||||
note that what is entered may not be assigned that id, for example it may be an error or command.\n\
|
||||
Where <prompt> and <continuation-prompt> are quoted strings to be printed as input prompts.\n\
|
||||
Both may optionally contain '%%s' which will be substituted with the next snippet ID --\n\
|
||||
note that what is entered may not be assigned that ID, for example it may be an error or command.\n\
|
||||
The continuation-prompt is used on the second and subsequent lines of a multi-line snippet.\n\
|
||||
\n\
|
||||
The form without <prompt> shows the currently set prompts.\n\
|
||||
@ -893,7 +930,7 @@ Example:\n\t\
|
||||
shows the prompts set for the mode mymode\n
|
||||
|
||||
help.set.editor.summary =\
|
||||
Specify the command to launch for the /edit command.
|
||||
Specify the command to launch for the /edit command
|
||||
|
||||
help.set.editor =\
|
||||
Specify the command to launch for the /edit command:\n\
|
||||
@ -937,10 +974,10 @@ runs of the jshell tool.\n\
|
||||
The form without <command> or options shows the editor setting.\n
|
||||
|
||||
help.set.start.summary =\
|
||||
Set the start-up configuration.
|
||||
Set the startup configuration
|
||||
|
||||
help.set.start =\
|
||||
Set the start-up configuration -- a sequence of snippets and commands read at start-up:\n\
|
||||
Set the startup configuration -- a sequence of snippets and commands read at startup:\n\
|
||||
\n\t\
|
||||
/set start [-retain] <file>...\n\
|
||||
\n\t\
|
||||
@ -948,29 +985,29 @@ Set the start-up configuration -- a sequence of snippets and commands read at st
|
||||
\n\t\
|
||||
/set start [-retain] -none\n\
|
||||
\n\
|
||||
Retain the start-up configuration for future sessions:\n\
|
||||
Retain the startup configuration for future sessions:\n\
|
||||
\n\t\
|
||||
/set start -retain\n\
|
||||
\n\
|
||||
Show the start-up setting:\n\
|
||||
Show the startup setting:\n\
|
||||
\n\t\
|
||||
/set start\n\
|
||||
\n\
|
||||
The contents of the specified <file> become the start-up snippets and commands used\n\
|
||||
The contents of the specified <file> become the startup snippets and commands used\n\
|
||||
when the /reset, /reload, or /env commands are used in this session.\n\
|
||||
If instead the -default option is specified, the predefined start-up import\n\
|
||||
If instead the -default option is specified, the predefined startup import\n\
|
||||
snippets will be used.\n\
|
||||
If the -none option is used, the start-up will be empty -- no start-up snippets\n\
|
||||
If the -none option is used, the startup will be empty -- no startup snippets\n\
|
||||
or commands will be used.\n\
|
||||
This command is good for testing the start-up settings. To retain them for future\n\
|
||||
This command is good for testing the startup settings. To retain them for future\n\
|
||||
runs of the jshell tool use the command:\n\t\
|
||||
/set start -retain\n\
|
||||
\n\
|
||||
When the -retain option is used, the setting will be used in this and future\n\
|
||||
runs of the jshell tool.\n\
|
||||
\n\
|
||||
The form without <file> or options shows the start-up setting.\n\
|
||||
Note: if the start-up was last set from a file, this is shown with the\n\
|
||||
The form without <file> or options shows the startup setting.\n\
|
||||
Note: if the startup was last set from a file, this is shown with the\n\
|
||||
'set start' command followed by the contents of the file.\n\
|
||||
\n\
|
||||
The <file> may be an operating system file name, or one of the predefined\n\
|
||||
|
@ -67,7 +67,7 @@ public interface RuntimeConstants {
|
||||
/* Class File Constants */
|
||||
int JAVA_MAGIC = 0xcafebabe;
|
||||
int JAVA_MIN_SUPPORTED_VERSION = 45;
|
||||
int JAVA_MAX_SUPPORTED_VERSION = 54;
|
||||
int JAVA_MAX_SUPPORTED_VERSION = 55;
|
||||
int JAVA_MAX_SUPPORTED_MINOR_VERSION = 0;
|
||||
|
||||
/* Generate class file version for 1.1 by default */
|
||||
|
@ -42,6 +42,7 @@
|
||||
|
||||
compiler/ciReplay/TestSAServer.java 8029528 generic-all
|
||||
compiler/codecache/stress/OverloadCompileQueueTest.java 8166554 generic-all
|
||||
compiler/codegen/Test6896617.java 8193479 generic-all
|
||||
compiler/compilercontrol/jcmd/ClearDirectivesFileStackTest.java 8140405 generic-all
|
||||
compiler/jvmci/compilerToVM/GetResolvedJavaTypeTest.java 8158860 generic-all
|
||||
compiler/jvmci/compilerToVM/InvalidateInstalledCodeTest.java 8163894 generic-all
|
||||
@ -50,6 +51,7 @@ compiler/startup/SmallCodeCacheStartup.java 8134286 generic-all
|
||||
compiler/tiered/LevelTransitionTest.java 8067651 generic-all
|
||||
compiler/types/correctness/CorrectnessTest.java 8066173 generic-all
|
||||
compiler/types/correctness/OffTest.java 8066173 generic-all
|
||||
compiler/c2/Test8007294.java 8192992 generic-all
|
||||
|
||||
# aot test intermittently failing in jprt 8175791
|
||||
compiler/aot/DeoptimizationTest.java 8175791 windows-all
|
||||
|
@ -58,7 +58,7 @@ requires.properties= \
|
||||
docker.support
|
||||
|
||||
# Minimum jtreg version
|
||||
requiredVersion=4.2 b08
|
||||
requiredVersion=4.2 b11
|
||||
|
||||
# Path to libraries in the topmost test directory. This is needed so @library
|
||||
# does not need ../../../ notation to reach them
|
||||
|
@ -47,10 +47,6 @@ public class VMDeprecatedOptions {
|
||||
{"InitialRAMFraction", "64"},
|
||||
{"AssumeMP", "false"},
|
||||
{"UseMembar", "true"},
|
||||
{"FastTLABRefill", "false"},
|
||||
{"DeferPollingPageLoopCount", "-1"},
|
||||
{"SafepointSpinBeforeYield", "2000"},
|
||||
{"DeferThrSuspendLoopCount", "4000"},
|
||||
|
||||
// deprecated alias flags (see also aliased_jvm_flags):
|
||||
{"DefaultMaxRAMFraction", "4"},
|
||||
@ -110,6 +106,5 @@ public class VMDeprecatedOptions {
|
||||
testDeprecated(DEPRECATED_OPTIONS); // Make sure that each deprecated option is mentioned in the output.
|
||||
testDeprecatedDiagnostic("UnsyncloadClass", "false");
|
||||
testDeprecatedDiagnostic("IgnoreUnverifiableClassesDuringDump", "false");
|
||||
testDeprecatedExperimental("UseCGroupMemoryLimitForHeap", "true");
|
||||
}
|
||||
}
|
||||
|
43
test/hotspot/jtreg/runtime/classFileParserBug/Class55.jasm
Normal file
43
test/hotspot/jtreg/runtime/classFileParserBug/Class55.jasm
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8173382
|
||||
* @summary Check that the JVM accepts class files with version 55
|
||||
* @run main Class55
|
||||
*/
|
||||
|
||||
super public class Class55 version 55:0 {
|
||||
|
||||
public Method "<init>":"()V" stack 1 locals 1 {
|
||||
aload_0;
|
||||
invokespecial Method java/lang/Object."<init>":"()V";
|
||||
return;
|
||||
}
|
||||
|
||||
public static Method main:"([Ljava/lang/String;)V" stack 0 locals 1 {
|
||||
return;
|
||||
}
|
||||
|
||||
} // end Class Class55
|
@ -23,7 +23,7 @@ modules=java.xml
|
||||
groups=TEST.groups
|
||||
|
||||
# Minimum jtreg version
|
||||
requiredVersion=4.2 b08
|
||||
requiredVersion=4.2 b11
|
||||
|
||||
# Path to libraries in the topmost test directory. This is needed so @library
|
||||
# does not need ../../ notation to reach them
|
||||
|
@ -40,7 +40,7 @@ requires.properties= \
|
||||
vm.cds
|
||||
|
||||
# Minimum jtreg version
|
||||
requiredVersion=4.2 b09
|
||||
requiredVersion=4.2 b11
|
||||
|
||||
# Path to libraries in the topmost test directory. This is needed so @library
|
||||
# does not need ../../ notation to reach them
|
||||
|
@ -31,7 +31,7 @@ import jdk.test.lib.RandomFactory;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8080835
|
||||
* @bug 8080835 8193832
|
||||
* @library /test/lib
|
||||
* @build jdk.test.lib.RandomFactory
|
||||
* @run main ReadAllBytes
|
||||
@ -47,15 +47,11 @@ public class ReadAllBytes {
|
||||
test(new byte[]{});
|
||||
test(new byte[]{1, 2, 3});
|
||||
test(createRandomBytes(1024));
|
||||
test(createRandomBytes((1 << 13) - 1));
|
||||
test(createRandomBytes((1 << 13)));
|
||||
test(createRandomBytes((1 << 13) + 1));
|
||||
test(createRandomBytes((1 << 15) - 1));
|
||||
test(createRandomBytes((1 << 15)));
|
||||
test(createRandomBytes((1 << 15) + 1));
|
||||
test(createRandomBytes((1 << 17) - 1));
|
||||
test(createRandomBytes((1 << 17)));
|
||||
test(createRandomBytes((1 << 17) + 1));
|
||||
for (int shift : new int[] {13, 14, 15, 17}) {
|
||||
for (int offset : new int[] {-1, 0, 1}) {
|
||||
test(createRandomBytes((1 << shift) + offset));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void test(byte[] expectedBytes) throws IOException {
|
||||
|
@ -54,6 +54,8 @@ public class ClassFileVersionsTest {
|
||||
{ 53, 0, Set.of(STATIC, TRANSITIVE) },
|
||||
|
||||
{ 54, 0, Set.of() }, // JDK 10
|
||||
|
||||
{ 55, 0, Set.of()}, // JDK 11
|
||||
};
|
||||
}
|
||||
|
||||
@ -69,7 +71,11 @@ public class ClassFileVersionsTest {
|
||||
{ 54, 0, Set.of(TRANSITIVE) },
|
||||
{ 54, 0, Set.of(STATIC, TRANSITIVE) },
|
||||
|
||||
{ 55, 0, Set.of()}, // JDK 11
|
||||
{ 55, 0, Set.of(STATIC) }, // JDK 11
|
||||
{ 55, 0, Set.of(TRANSITIVE) },
|
||||
{ 55, 0, Set.of(STATIC, TRANSITIVE) },
|
||||
|
||||
{ 56, 0, Set.of()}, // JDK 12
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,6 @@
|
||||
* @bug 4268317 8132306 8175797
|
||||
* @summary Test if Reference.enqueue() works properly with GC
|
||||
* @run main ReferenceEnqueue
|
||||
* @run main/othervm -Djdk.lang.ref.disableClearBeforeEnqueue=true ReferenceEnqueue
|
||||
*/
|
||||
|
||||
import java.lang.ref.*;
|
||||
@ -87,8 +86,6 @@ public class ReferenceEnqueue {
|
||||
final ReferenceQueue<Object> queue = new ReferenceQueue<>();
|
||||
final List<Reference<Object>> refs = new ArrayList<>();
|
||||
final int iterations = 1000;
|
||||
final boolean disableClearBeforeEnqueue =
|
||||
Boolean.getBoolean("jdk.lang.ref.disableClearBeforeEnqueue");
|
||||
|
||||
ExplicitEnqueue() {
|
||||
this.refs.add(new SoftReference<>(new Object(), queue));
|
||||
@ -101,10 +98,7 @@ public class ReferenceEnqueue {
|
||||
if (ref.enqueue() == false) {
|
||||
throw new RuntimeException("Error: enqueue failed");
|
||||
}
|
||||
if (disableClearBeforeEnqueue && ref.get() == null) {
|
||||
throw new RuntimeException("Error: clearing should be disabled");
|
||||
}
|
||||
if (!disableClearBeforeEnqueue && ref.get() != null) {
|
||||
if (ref.get() != null) {
|
||||
throw new RuntimeException("Error: referent must be cleared");
|
||||
}
|
||||
}
|
||||
|
686
test/jdk/java/nio/Buffer/EqualsCompareTest.java
Normal file
686
test/jdk/java/nio/Buffer/EqualsCompareTest.java
Normal file
@ -0,0 +1,686 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.nio.Buffer;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.CharBuffer;
|
||||
import java.nio.DoubleBuffer;
|
||||
import java.nio.FloatBuffer;
|
||||
import java.nio.IntBuffer;
|
||||
import java.nio.LongBuffer;
|
||||
import java.nio.ShortBuffer;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.LongFunction;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8193085
|
||||
* @summary tests for buffer equals and compare
|
||||
* @run testng EqualsCompareTest
|
||||
*/
|
||||
|
||||
public class EqualsCompareTest {
|
||||
|
||||
// Maximum width in bits
|
||||
static final int MAX_WIDTH = 512;
|
||||
|
||||
static final Map<Class, Integer> typeToWidth;
|
||||
|
||||
static {
|
||||
typeToWidth = new HashMap<>();
|
||||
typeToWidth.put(byte.class, Byte.SIZE);
|
||||
typeToWidth.put(short.class, Short.SIZE);
|
||||
typeToWidth.put(char.class, Character.SIZE);
|
||||
typeToWidth.put(int.class, Integer.SIZE);
|
||||
typeToWidth.put(long.class, Long.SIZE);
|
||||
typeToWidth.put(float.class, Float.SIZE);
|
||||
typeToWidth.put(double.class, Double.SIZE);
|
||||
}
|
||||
|
||||
static int arraySizeFor(Class<?> type) {
|
||||
assert type.isPrimitive();
|
||||
return 4 * MAX_WIDTH / typeToWidth.get(type);
|
||||
}
|
||||
|
||||
enum BufferKind {
|
||||
HEAP,
|
||||
HEAP_VIEW,
|
||||
DIRECT;
|
||||
}
|
||||
|
||||
static abstract class BufferType<T extends Buffer, E> {
|
||||
final BufferKind k;
|
||||
final Class<?> bufferType;
|
||||
final Class<?> elementType;
|
||||
|
||||
final MethodHandle eq;
|
||||
final MethodHandle cmp;
|
||||
|
||||
final MethodHandle getter;
|
||||
final MethodHandle setter;
|
||||
|
||||
BufferType(BufferKind k, Class<T> bufferType, Class<?> elementType) {
|
||||
this.k = k;
|
||||
this.bufferType = bufferType;
|
||||
this.elementType = elementType;
|
||||
|
||||
var lookup = MethodHandles.lookup();
|
||||
try {
|
||||
eq = lookup.findVirtual(bufferType, "equals", MethodType.methodType(boolean.class, Object.class));
|
||||
cmp = lookup.findVirtual(bufferType, "compareTo", MethodType.methodType(int.class, bufferType));
|
||||
|
||||
getter = lookup.findVirtual(bufferType, "get", MethodType.methodType(elementType, int.class));
|
||||
setter = lookup.findVirtual(bufferType, "put", MethodType.methodType(bufferType, int.class, elementType));
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return bufferType.getName() + " " + k;
|
||||
}
|
||||
|
||||
T construct(int length) {
|
||||
return construct(length, ByteOrder.BIG_ENDIAN);
|
||||
}
|
||||
|
||||
abstract T construct(int length, ByteOrder bo);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
T slice(T a, int from, int to) {
|
||||
return (T) a.position(from).limit(to).slice();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
E get(T a, int i) {
|
||||
try {
|
||||
return (E) getter.invoke(a, i);
|
||||
}
|
||||
catch (RuntimeException | Error e) {
|
||||
throw e;
|
||||
}
|
||||
catch (Throwable t) {
|
||||
throw new Error(t);
|
||||
}
|
||||
}
|
||||
|
||||
void set(T a, int i, Object v) {
|
||||
try {
|
||||
setter.invoke(a, i, convert(v));
|
||||
}
|
||||
catch (RuntimeException | Error e) {
|
||||
throw e;
|
||||
}
|
||||
catch (Throwable t) {
|
||||
throw new Error(t);
|
||||
}
|
||||
}
|
||||
|
||||
abstract Object convert(Object o);
|
||||
|
||||
boolean equals(T a, T b) {
|
||||
try {
|
||||
return (boolean) eq.invoke(a, b);
|
||||
}
|
||||
catch (RuntimeException | Error e) {
|
||||
throw e;
|
||||
}
|
||||
catch (Throwable t) {
|
||||
throw new Error(t);
|
||||
}
|
||||
}
|
||||
|
||||
int compare(T a, T b) {
|
||||
try {
|
||||
return (int) cmp.invoke(a, b);
|
||||
}
|
||||
catch (RuntimeException | Error e) {
|
||||
throw e;
|
||||
}
|
||||
catch (Throwable t) {
|
||||
throw new Error(t);
|
||||
}
|
||||
}
|
||||
|
||||
boolean pairWiseEquals(T a, T b) {
|
||||
if (a.remaining() != b.remaining())
|
||||
return false;
|
||||
int p = a.position();
|
||||
for (int i = a.limit() - 1, j = b.limit() - 1; i >= p; i--, j--)
|
||||
if (!get(a, i).equals(get(b, j)))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static class Bytes extends BufferType<ByteBuffer, Byte> {
|
||||
Bytes(BufferKind k) {
|
||||
super(k, ByteBuffer.class, byte.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
ByteBuffer construct(int length, ByteOrder bo) {
|
||||
switch (k) {
|
||||
case DIRECT:
|
||||
return ByteBuffer.allocateDirect(length).order(bo);
|
||||
default:
|
||||
case HEAP_VIEW:
|
||||
case HEAP:
|
||||
return ByteBuffer.allocate(length).order(bo);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
Object convert(Object o) {
|
||||
return o instanceof Integer
|
||||
? ((Integer) o).byteValue()
|
||||
: o;
|
||||
}
|
||||
}
|
||||
|
||||
static class Chars extends BufferType<CharBuffer, Character> {
|
||||
Chars(BufferKind k) {
|
||||
super(k, CharBuffer.class, char.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
CharBuffer construct(int length, ByteOrder bo) {
|
||||
switch (k) {
|
||||
case DIRECT:
|
||||
return ByteBuffer.allocateDirect(length * Character.BYTES).
|
||||
order(bo).
|
||||
asCharBuffer();
|
||||
case HEAP_VIEW:
|
||||
return ByteBuffer.allocate(length * Character.BYTES).
|
||||
order(bo).
|
||||
asCharBuffer();
|
||||
default:
|
||||
case HEAP:
|
||||
return CharBuffer.allocate(length);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
Object convert(Object o) {
|
||||
return o instanceof Integer
|
||||
? (char) ((Integer) o).intValue()
|
||||
: o;
|
||||
}
|
||||
|
||||
CharBuffer transformToStringBuffer(CharBuffer c) {
|
||||
char[] chars = new char[c.remaining()];
|
||||
c.get(chars);
|
||||
return CharBuffer.wrap(new String(chars));
|
||||
}
|
||||
}
|
||||
|
||||
static class Shorts extends BufferType<ShortBuffer, Short> {
|
||||
Shorts(BufferKind k) {
|
||||
super(k, ShortBuffer.class, short.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
ShortBuffer construct(int length, ByteOrder bo) {
|
||||
switch (k) {
|
||||
case DIRECT:
|
||||
return ByteBuffer.allocateDirect(length * Short.BYTES).
|
||||
order(bo).
|
||||
asShortBuffer();
|
||||
case HEAP_VIEW:
|
||||
return ByteBuffer.allocate(length * Short.BYTES).
|
||||
order(bo).
|
||||
asShortBuffer();
|
||||
default:
|
||||
case HEAP:
|
||||
return ShortBuffer.allocate(length);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
Object convert(Object o) {
|
||||
return o instanceof Integer
|
||||
? ((Integer) o).shortValue()
|
||||
: o;
|
||||
}
|
||||
}
|
||||
|
||||
static class Ints extends BufferType<IntBuffer, Integer> {
|
||||
Ints(BufferKind k) {
|
||||
super(k, IntBuffer.class, int.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
IntBuffer construct(int length, ByteOrder bo) {
|
||||
switch (k) {
|
||||
case DIRECT:
|
||||
return ByteBuffer.allocateDirect(length * Integer.BYTES).
|
||||
order(bo).
|
||||
asIntBuffer();
|
||||
case HEAP_VIEW:
|
||||
return ByteBuffer.allocate(length * Integer.BYTES).
|
||||
order(bo).
|
||||
asIntBuffer();
|
||||
default:
|
||||
case HEAP:
|
||||
return IntBuffer.allocate(length);
|
||||
}
|
||||
}
|
||||
|
||||
Object convert(Object o) {
|
||||
return o;
|
||||
}
|
||||
}
|
||||
|
||||
static class Floats extends BufferType<FloatBuffer, Float> {
|
||||
Floats(BufferKind k) {
|
||||
super(k, FloatBuffer.class, float.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
FloatBuffer construct(int length, ByteOrder bo) {
|
||||
switch (k) {
|
||||
case DIRECT:
|
||||
return ByteBuffer.allocateDirect(length * Float.BYTES).
|
||||
order(bo).
|
||||
asFloatBuffer();
|
||||
case HEAP_VIEW:
|
||||
return ByteBuffer.allocate(length * Float.BYTES).
|
||||
order(bo).
|
||||
asFloatBuffer();
|
||||
default:
|
||||
case HEAP:
|
||||
return FloatBuffer.allocate(length);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
Object convert(Object o) {
|
||||
return o instanceof Integer
|
||||
? ((Integer) o).floatValue()
|
||||
: o;
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean pairWiseEquals(FloatBuffer a, FloatBuffer b) {
|
||||
if (a.remaining() != b.remaining())
|
||||
return false;
|
||||
int p = a.position();
|
||||
for (int i = a.limit() - 1, j = b.limit() - 1; i >= p; i--, j--) {
|
||||
float av = a.get(i);
|
||||
float bv = b.get(j);
|
||||
if (av != bv && (!Float.isNaN(av) || !Float.isNaN(bv)))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static class Longs extends BufferType<LongBuffer, Long> {
|
||||
Longs(BufferKind k) {
|
||||
super(k, LongBuffer.class, long.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
LongBuffer construct(int length, ByteOrder bo) {
|
||||
switch (k) {
|
||||
case DIRECT:
|
||||
return ByteBuffer.allocateDirect(length * Long.BYTES).
|
||||
order(bo).
|
||||
asLongBuffer();
|
||||
case HEAP_VIEW:
|
||||
return ByteBuffer.allocate(length * Long.BYTES).
|
||||
order(bo).
|
||||
asLongBuffer();
|
||||
default:
|
||||
case HEAP:
|
||||
return LongBuffer.allocate(length);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
Object convert(Object o) {
|
||||
return o instanceof Integer
|
||||
? ((Integer) o).longValue()
|
||||
: o;
|
||||
}
|
||||
}
|
||||
|
||||
static class Doubles extends BufferType<DoubleBuffer, Double> {
|
||||
Doubles(BufferKind k) {
|
||||
super(k, DoubleBuffer.class, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
DoubleBuffer construct(int length, ByteOrder bo) {
|
||||
switch (k) {
|
||||
case DIRECT:
|
||||
return ByteBuffer.allocateDirect(length * Double.BYTES).
|
||||
order(bo).
|
||||
asDoubleBuffer();
|
||||
case HEAP_VIEW:
|
||||
return ByteBuffer.allocate(length * Double.BYTES).
|
||||
order(bo).
|
||||
asDoubleBuffer();
|
||||
default:
|
||||
case HEAP:
|
||||
return DoubleBuffer.allocate(length);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
Object convert(Object o) {
|
||||
return o instanceof Integer
|
||||
? ((Integer) o).doubleValue()
|
||||
: o;
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean pairWiseEquals(DoubleBuffer a, DoubleBuffer b) {
|
||||
if (a.remaining() != b.remaining())
|
||||
return false;
|
||||
int p = a.position();
|
||||
for (int i = a.limit() - 1, j = b.limit() - 1; i >= p; i--, j--) {
|
||||
double av = a.get(i);
|
||||
double bv = b.get(j);
|
||||
if (av != bv && (!Double.isNaN(av) || !Double.isNaN(bv)))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static Object[][] bufferTypes;
|
||||
|
||||
@DataProvider
|
||||
public static Object[][] bufferTypesProvider() {
|
||||
if (bufferTypes == null) {
|
||||
bufferTypes = new Object[][]{
|
||||
{new BufferType.Bytes(BufferKind.HEAP)},
|
||||
{new BufferType.Bytes(BufferKind.DIRECT)},
|
||||
{new BufferType.Chars(BufferKind.HEAP)},
|
||||
{new BufferType.Chars(BufferKind.HEAP_VIEW)},
|
||||
{new BufferType.Chars(BufferKind.DIRECT)},
|
||||
{new BufferType.Shorts(BufferKind.HEAP)},
|
||||
{new BufferType.Shorts(BufferKind.HEAP_VIEW)},
|
||||
{new BufferType.Shorts(BufferKind.DIRECT)},
|
||||
{new BufferType.Ints(BufferKind.HEAP)},
|
||||
{new BufferType.Ints(BufferKind.HEAP_VIEW)},
|
||||
{new BufferType.Ints(BufferKind.DIRECT)},
|
||||
{new BufferType.Floats(BufferKind.HEAP)},
|
||||
{new BufferType.Floats(BufferKind.HEAP_VIEW)},
|
||||
{new BufferType.Floats(BufferKind.DIRECT)},
|
||||
{new BufferType.Longs(BufferKind.HEAP)},
|
||||
{new BufferType.Longs(BufferKind.HEAP_VIEW)},
|
||||
{new BufferType.Longs(BufferKind.DIRECT)},
|
||||
{new BufferType.Doubles(BufferKind.HEAP)},
|
||||
{new BufferType.Doubles(BufferKind.HEAP_VIEW)},
|
||||
{new BufferType.Doubles(BufferKind.DIRECT)},
|
||||
};
|
||||
}
|
||||
return bufferTypes;
|
||||
}
|
||||
|
||||
|
||||
static Object[][] floatbufferTypes;
|
||||
|
||||
@DataProvider
|
||||
public static Object[][] floatBufferTypesProvider() {
|
||||
if (floatbufferTypes == null) {
|
||||
LongFunction<Object> bTof = rb -> Float.intBitsToFloat((int) rb);
|
||||
LongFunction<Object> bToD = Double::longBitsToDouble;
|
||||
|
||||
floatbufferTypes = new Object[][]{
|
||||
// canonical and non-canonical NaNs
|
||||
// If conversion is a signalling NaN it may be subject to conversion to a
|
||||
// quiet NaN on some processors, even if a copy is performed
|
||||
// The tests assume that if conversion occurs it does not convert to the
|
||||
// canonical NaN
|
||||
new Object[]{new BufferType.Floats(BufferKind.HEAP), 0x7fc00000L, 0x7f800001L, bTof},
|
||||
new Object[]{new BufferType.Floats(BufferKind.HEAP_VIEW), 0x7fc00000L, 0x7f800001L, bTof},
|
||||
new Object[]{new BufferType.Floats(BufferKind.DIRECT), 0x7fc00000L, 0x7f800001L, bTof},
|
||||
new Object[]{new BufferType.Doubles(BufferKind.HEAP), 0x7ff8000000000000L, 0x7ff0000000000001L, bToD},
|
||||
new Object[]{new BufferType.Doubles(BufferKind.HEAP_VIEW), 0x7ff8000000000000L, 0x7ff0000000000001L, bToD},
|
||||
new Object[]{new BufferType.Doubles(BufferKind.DIRECT), 0x7ff8000000000000L, 0x7ff0000000000001L, bToD},
|
||||
|
||||
// +0.0 and -0.0
|
||||
new Object[]{new BufferType.Floats(BufferKind.HEAP), 0x0L, 0x80000000L, bTof},
|
||||
new Object[]{new BufferType.Floats(BufferKind.HEAP_VIEW), 0x0L, 0x80000000L, bTof},
|
||||
new Object[]{new BufferType.Floats(BufferKind.DIRECT), 0x0L, 0x80000000L, bTof},
|
||||
new Object[]{new BufferType.Doubles(BufferKind.HEAP), 0x0L, 0x8000000000000000L, bToD},
|
||||
new Object[]{new BufferType.Doubles(BufferKind.HEAP_VIEW), 0x0L, 0x8000000000000000L, bToD},
|
||||
new Object[]{new BufferType.Doubles(BufferKind.DIRECT), 0x0L, 0x8000000000000000L, bToD},
|
||||
};
|
||||
}
|
||||
return floatbufferTypes;
|
||||
}
|
||||
|
||||
|
||||
static Object[][] charBufferTypes;
|
||||
|
||||
@DataProvider
|
||||
public static Object[][] charBufferTypesProvider() {
|
||||
if (charBufferTypes == null) {
|
||||
charBufferTypes = new Object[][]{
|
||||
{new BufferType.Chars(BufferKind.HEAP)},
|
||||
{new BufferType.Chars(BufferKind.HEAP_VIEW)},
|
||||
{new BufferType.Chars(BufferKind.DIRECT)},
|
||||
};
|
||||
}
|
||||
return charBufferTypes;
|
||||
}
|
||||
|
||||
|
||||
// Tests all primitive buffers
|
||||
@Test(dataProvider = "bufferTypesProvider")
|
||||
<E>
|
||||
void testBuffers(BufferType<Buffer, E> bufferType) {
|
||||
// Test with buffers of the same byte order (BE)
|
||||
BiFunction<BufferType<Buffer, E>, Integer, Buffer> constructor = (at, s) -> {
|
||||
Buffer a = at.construct(s);
|
||||
for (int x = 0; x < s; x++) {
|
||||
at.set(a, x, x % 8);
|
||||
}
|
||||
return a;
|
||||
};
|
||||
|
||||
testBufferType(bufferType, constructor, constructor);
|
||||
|
||||
// Test with buffers of different byte order
|
||||
if (bufferType.elementType != byte.class &&
|
||||
(bufferType.k == BufferKind.HEAP_VIEW ||
|
||||
bufferType.k == BufferKind.DIRECT)) {
|
||||
|
||||
BiFunction<BufferType<Buffer, E>, Integer, Buffer> leConstructor = (at, s) -> {
|
||||
Buffer a = at.construct(s, ByteOrder.LITTLE_ENDIAN);
|
||||
for (int x = 0; x < s; x++) {
|
||||
at.set(a, x, x % 8);
|
||||
}
|
||||
return a;
|
||||
};
|
||||
testBufferType(bufferType, constructor, leConstructor);
|
||||
}
|
||||
}
|
||||
|
||||
// Tests float and double buffers with edge-case values (NaN, -0.0, +0.0)
|
||||
@Test(dataProvider = "floatBufferTypesProvider")
|
||||
public void testFloatBuffers(
|
||||
BufferType<Buffer, Float> bufferType,
|
||||
long rawBitsA, long rawBitsB,
|
||||
LongFunction<Object> bitsToFloat) {
|
||||
Object av = bitsToFloat.apply(rawBitsA);
|
||||
Object bv = bitsToFloat.apply(rawBitsB);
|
||||
|
||||
BiFunction<BufferType<Buffer, Float>, Integer, Buffer> allAs = (at, s) -> {
|
||||
Buffer b = at.construct(s);
|
||||
for (int x = 0; x < s; x++) {
|
||||
at.set(b, x, av);
|
||||
}
|
||||
return b;
|
||||
};
|
||||
|
||||
BiFunction<BufferType<Buffer, Float>, Integer, Buffer> allBs = (at, s) -> {
|
||||
Buffer b = at.construct(s);
|
||||
for (int x = 0; x < s; x++) {
|
||||
at.set(b, x, bv);
|
||||
}
|
||||
return b;
|
||||
};
|
||||
|
||||
BiFunction<BufferType<Buffer, Float>, Integer, Buffer> halfBs = (at, s) -> {
|
||||
Buffer b = at.construct(s);
|
||||
for (int x = 0; x < s / 2; x++) {
|
||||
at.set(b, x, bv);
|
||||
}
|
||||
for (int x = s / 2; x < s; x++) {
|
||||
at.set(b, x, 1);
|
||||
}
|
||||
return b;
|
||||
};
|
||||
|
||||
// Sanity check
|
||||
int size = arraySizeFor(bufferType.elementType);
|
||||
Assert.assertTrue(bufferType.pairWiseEquals(allAs.apply(bufferType, size),
|
||||
allBs.apply(bufferType, size)));
|
||||
Assert.assertTrue(bufferType.equals(allAs.apply(bufferType, size),
|
||||
allBs.apply(bufferType, size)));
|
||||
|
||||
testBufferType(bufferType, allAs, allBs);
|
||||
testBufferType(bufferType, allAs, halfBs);
|
||||
}
|
||||
|
||||
// Tests CharBuffer for region sources and CharSequence sources
|
||||
@Test(dataProvider = "charBufferTypesProvider")
|
||||
public void testCharBuffers(BufferType.Chars charBufferType) {
|
||||
|
||||
BiFunction<BufferType.Chars, Integer, CharBuffer> constructor = (at, s) -> {
|
||||
CharBuffer a = at.construct(s);
|
||||
for (int x = 0; x < s; x++) {
|
||||
at.set(a, x, x % 8);
|
||||
}
|
||||
return a;
|
||||
};
|
||||
|
||||
BiFunction<BufferType.Chars, Integer, CharBuffer> constructorX = constructor.
|
||||
andThen(charBufferType::transformToStringBuffer);
|
||||
|
||||
testBufferType(charBufferType, constructor, constructorX);
|
||||
}
|
||||
|
||||
|
||||
<B extends Buffer, E, BT extends BufferType<B, E>>
|
||||
void testBufferType(BT bt,
|
||||
BiFunction<BT, Integer, B> aConstructor,
|
||||
BiFunction<BT, Integer, B> bConstructor) {
|
||||
int n = arraySizeFor(bt.elementType);
|
||||
|
||||
for (int s : ranges(0, n)) {
|
||||
B a = aConstructor.apply(bt, s);
|
||||
B b = bConstructor.apply(bt, s);
|
||||
|
||||
for (int aFrom : ranges(0, s)) {
|
||||
for (int aTo : ranges(aFrom, s)) {
|
||||
int aLength = aTo - aFrom;
|
||||
|
||||
B as = aLength != s
|
||||
? bt.slice(a, aFrom, aTo)
|
||||
: a;
|
||||
|
||||
for (int bFrom : ranges(0, s)) {
|
||||
for (int bTo : ranges(bFrom, s)) {
|
||||
int bLength = bTo - bFrom;
|
||||
|
||||
B bs = bLength != s
|
||||
? bt.slice(b, bFrom, bTo)
|
||||
: b;
|
||||
|
||||
boolean eq = bt.pairWiseEquals(as, bs);
|
||||
Assert.assertEquals(bt.equals(as, bs), eq);
|
||||
Assert.assertEquals(bt.equals(bs, as), eq);
|
||||
if (eq) {
|
||||
Assert.assertEquals(bt.compare(as, bs), 0);
|
||||
Assert.assertEquals(bt.compare(bs, as), 0);
|
||||
}
|
||||
else {
|
||||
int aCb = bt.compare(as, bs);
|
||||
int bCa = bt.compare(bs, as);
|
||||
int v = Integer.signum(aCb) * Integer.signum(bCa);
|
||||
Assert.assertTrue(v == -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (aLength > 0 && !a.isReadOnly()) {
|
||||
for (int i = aFrom; i < aTo; i++) {
|
||||
B c = aConstructor.apply(bt, a.capacity());
|
||||
B cs = aLength != s
|
||||
? bt.slice(c, aFrom, aTo)
|
||||
: c;
|
||||
|
||||
// Create common prefix with a length of i - aFrom
|
||||
bt.set(c, i, -1);
|
||||
|
||||
Assert.assertFalse(bt.equals(c, a));
|
||||
|
||||
int cCa = bt.compare(cs, as);
|
||||
int aCc = bt.compare(as, cs);
|
||||
int v = Integer.signum(cCa) * Integer.signum(aCc);
|
||||
Assert.assertTrue(v == -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int[] ranges(int from, int to) {
|
||||
int width = to - from;
|
||||
switch (width) {
|
||||
case 0:
|
||||
return new int[]{};
|
||||
case 1:
|
||||
return new int[]{from, to};
|
||||
case 2:
|
||||
return new int[]{from, from + 1, to};
|
||||
case 3:
|
||||
return new int[]{from, from + 1, from + 2, to};
|
||||
default:
|
||||
return IntStream.of(from, from + 1, from + 2, to / 2 - 1, to / 2, to / 2 + 1, to - 2, to - 1, to)
|
||||
.filter(i -> i >= from && i <= to)
|
||||
.distinct().toArray();
|
||||
}
|
||||
}
|
||||
}
|
@ -54,6 +54,7 @@ tools/javac/annotations/typeAnnotations/referenceinfos/Lambda.java
|
||||
tools/javac/annotations/typeAnnotations/referenceinfos/NestedTypes.java 8057687 generic-all emit correct byte code an attributes for type annotations
|
||||
tools/javac/warnings/suppress/TypeAnnotations.java 8057683 generic-all improve ordering of errors with type annotations
|
||||
tools/javac/modules/SourceInSymlinkTest.java 8180263 windows-all fails when run on a subst drive
|
||||
tools/javac/options/release/ReleaseOptionUnsupported.java 8193784 generic-all temporary until support for --release 11 is worked out
|
||||
|
||||
###########################################################################
|
||||
#
|
||||
@ -76,3 +77,5 @@ tools/sjavac/ClasspathDependencies.java 8158002 generic-all Requires i
|
||||
###########################################################################
|
||||
#
|
||||
# jdeps
|
||||
|
||||
tools/jdeprscan/tests/jdk/jdeprscan/TestNotFound.java 8193784 generic-all temporary until support for --release 11 is worked out
|
||||
|
@ -15,7 +15,7 @@ keys=intermittent randomness
|
||||
groups=TEST.groups
|
||||
|
||||
# Minimum jtreg version
|
||||
requiredVersion=4.2 b08
|
||||
requiredVersion=4.2 b11
|
||||
|
||||
# Use new module options
|
||||
useNewOptions=true
|
||||
|
@ -162,13 +162,13 @@ public class CommandCompletionTest extends ReplToolTesting {
|
||||
"/edit ", "/env ", "/exit ",
|
||||
"/help ", "/history ", "/imports ",
|
||||
"/list ", "/methods ", "/open ", "/reload ", "/reset ",
|
||||
"/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "rerun ", "shortcuts "),
|
||||
"/save ", "/set ", "/types ", "/vars ", "context ", "id ", "intro ", "rerun ", "shortcuts "),
|
||||
a -> assertCompletion(a, "/? |", false,
|
||||
"/! ", "/-<n> ", "/<id> ", "/? ", "/drop ",
|
||||
"/edit ", "/env ", "/exit ",
|
||||
"/help ", "/history ", "/imports ",
|
||||
"/list ", "/methods ", "/open ", "/reload ", "/reset ",
|
||||
"/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "rerun ", "shortcuts "),
|
||||
"/save ", "/set ", "/types ", "/vars ", "context ", "id ", "intro ", "rerun ", "shortcuts "),
|
||||
a -> assertCompletion(a, "/help /s|", false,
|
||||
"/save ", "/set "),
|
||||
a -> assertCompletion(a, "/help /set |", false,
|
||||
|
@ -73,7 +73,7 @@ public abstract class EditorTestBase extends ReplToolTesting {
|
||||
for (String edit : new String[] {"/ed", "/edit"}) {
|
||||
test(new String[]{"--no-startup"},
|
||||
a -> assertCommandOutputStartsWith(a, edit + " 1",
|
||||
"| No snippet with id: 1"),
|
||||
"| No snippet with ID: 1"),
|
||||
a -> assertCommandOutputStartsWith(a, edit + " unknown",
|
||||
"| No such snippet: unknown")
|
||||
);
|
||||
|
@ -189,8 +189,8 @@ public class ToolBasicTest extends ReplToolTesting {
|
||||
|
||||
public void testRerun() {
|
||||
test(false, new String[] {"--no-startup"},
|
||||
(a) -> assertCommand(a, "/0", "| No snippet with id: 0"),
|
||||
(a) -> assertCommand(a, "/5", "| No snippet with id: 5")
|
||||
(a) -> assertCommand(a, "/0", "| No snippet with ID: 0"),
|
||||
(a) -> assertCommand(a, "/5", "| No snippet with ID: 5")
|
||||
);
|
||||
String[] codes = new String[] {
|
||||
"int a = 0;", // var
|
||||
@ -251,9 +251,9 @@ public class ToolBasicTest extends ReplToolTesting {
|
||||
);
|
||||
|
||||
test(false, new String[] {"--no-startup"},
|
||||
(a) -> assertCommand(a, "/s1", "| No snippet with id: s1"),
|
||||
(a) -> assertCommand(a, "/1", "| No snippet with id: 1"),
|
||||
(a) -> assertCommand(a, "/e1", "| No snippet with id: e1")
|
||||
(a) -> assertCommand(a, "/s1", "| No snippet with ID: s1"),
|
||||
(a) -> assertCommand(a, "/1", "| No snippet with ID: 1"),
|
||||
(a) -> assertCommand(a, "/e1", "| No snippet with ID: e1")
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8166334
|
||||
* @bug 8166334 8188894
|
||||
* @summary test shift-tab shortcuts "fixes"
|
||||
* @modules
|
||||
* jdk.jshell/jdk.internal.jshell.tool.resources:open
|
||||
@ -107,11 +107,12 @@ public class ToolShiftTabTest extends UITesting {
|
||||
|
||||
public void testFixImport() throws Exception {
|
||||
doRunTest((inputSink, out) -> {
|
||||
inputSink.write("Frame");
|
||||
inputSink.write(FIX + "i");
|
||||
inputSink.write("1");
|
||||
inputSink.write(".WIDTH\n");
|
||||
waitOutput(out, "==> 1");
|
||||
do {
|
||||
inputSink.write("Frame");
|
||||
inputSink.write(FIX + "i");
|
||||
inputSink.write("1");
|
||||
inputSink.write(".WIDTH\n");
|
||||
} while (!waitOutput(out, "==> 1", "Results may be incomplete"));
|
||||
inputSink.write("/import\n");
|
||||
waitOutput(out, "| import java.awt.Frame");
|
||||
|
||||
|
@ -296,7 +296,7 @@ public class ToolSimpleTest extends ReplToolTesting {
|
||||
@Test
|
||||
public void testDropNegative() {
|
||||
test(false, new String[]{"--no-startup"},
|
||||
a -> assertCommandOutputStartsWith(a, "/drop 0", "| No snippet with id: 0"),
|
||||
a -> assertCommandOutputStartsWith(a, "/drop 0", "| No snippet with ID: 0"),
|
||||
a -> assertCommandOutputStartsWith(a, "/drop a", "| No such snippet: a"),
|
||||
a -> assertCommandCheckOutput(a, "/drop",
|
||||
assertStartsWith("| In the /drop argument, please specify an import, variable, method, or class to drop.")),
|
||||
|
@ -135,8 +135,19 @@ public class UITesting {
|
||||
}
|
||||
|
||||
protected void waitOutput(StringBuilder out, String expected) {
|
||||
waitOutput(out, expected, null);
|
||||
}
|
||||
|
||||
// Return true if expected is found, false if secondary is found,
|
||||
// otherwise, time out with an IllegalStateException
|
||||
protected boolean waitOutput(StringBuilder out, String expected, String secondary) {
|
||||
expected = expected.replaceAll("\n", laxLineEndings ? "\r?\n" : System.getProperty("line.separator"));
|
||||
Pattern expectedPattern = Pattern.compile(expected, Pattern.DOTALL);
|
||||
Pattern secondaryPattern = null;
|
||||
if (secondary != null) {
|
||||
secondary = secondary.replaceAll("\n", laxLineEndings ? "\r?\n" : System.getProperty("line.separator"));
|
||||
secondaryPattern = Pattern.compile(secondary, Pattern.DOTALL);
|
||||
}
|
||||
synchronized (out) {
|
||||
long s = System.currentTimeMillis();
|
||||
|
||||
@ -144,7 +155,14 @@ public class UITesting {
|
||||
Matcher m = expectedPattern.matcher(out);
|
||||
if (m.find()) {
|
||||
out.delete(0, m.end());
|
||||
return ;
|
||||
return true;
|
||||
}
|
||||
if (secondaryPattern != null) {
|
||||
m = secondaryPattern.matcher(out);
|
||||
if (m.find()) {
|
||||
out.delete(0, m.end());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
long e = System.currentTimeMillis();
|
||||
if ((e - s) > TIMEOUT) {
|
||||
|
@ -32,8 +32,8 @@
|
||||
* jdk.compiler/com.sun.tools.javac.main
|
||||
* jdk.compiler/com.sun.tools.javac.util
|
||||
* @clean T1 T2
|
||||
* @compile -source 10 -target 10 T1.java
|
||||
* @compile -source 10 -target 10 T2.java
|
||||
* @compile -source 10 -target 11 T1.java
|
||||
* @compile -source 10 -target 11 T2.java
|
||||
* @run main/othervm T6330997
|
||||
*/
|
||||
|
||||
|
@ -1,2 +1,2 @@
|
||||
BadCovar.java:22:10: compiler.err.types.incompatible.diff.ret: bad.covar.B, bad.covar.A, f()
|
||||
BadCovar.java:22:10: compiler.err.types.incompatible: bad.covar.B, bad.covar.A, (compiler.misc.incompatible.diff.ret: f, )
|
||||
1 error
|
||||
|
@ -1,2 +1,2 @@
|
||||
InconsistentInheritedSignature.java:17:1: compiler.err.types.incompatible.diff.ret: I2, I1, f()
|
||||
InconsistentInheritedSignature.java:17:1: compiler.err.types.incompatible: I2, I1, (compiler.misc.incompatible.diff.ret: f, )
|
||||
1 error
|
||||
|
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8007720 8177486
|
||||
* @summary class reading of named parameters
|
||||
* @library /tools/javac/lib
|
||||
* @modules java.compiler
|
||||
* jdk.compiler
|
||||
* @compile -parameters ClassReaderTest.java MethodParameterProcessor.java
|
||||
* @compile/process/ref=ClassReaderTest.out -proc:only -processor MethodParameterProcessor ClassReaderTest ClassReaderTest$I ClassReaderTest$E
|
||||
*/
|
||||
|
||||
import static java.lang.annotation.RetentionPolicy.CLASS;
|
||||
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
|
||||
public class ClassReaderTest {
|
||||
|
||||
@Retention(RUNTIME)
|
||||
@interface RuntimeAnnoOne {
|
||||
int value() default 0;
|
||||
}
|
||||
|
||||
@Retention(RUNTIME)
|
||||
@interface RuntimeAnnoTwo {
|
||||
int value() default 0;
|
||||
}
|
||||
|
||||
@Retention(CLASS)
|
||||
@interface ClassAnno {
|
||||
int value() default 0;
|
||||
}
|
||||
|
||||
@MethodParameterProcessor.ParameterNames
|
||||
void f(
|
||||
@RuntimeAnnoOne(1) @RuntimeAnnoTwo(2) @ClassAnno(3) int a,
|
||||
@RuntimeAnnoOne(4) @RuntimeAnnoTwo(5) @ClassAnno(6) String b) {}
|
||||
|
||||
class I {
|
||||
@MethodParameterProcessor.ParameterNames
|
||||
I(@ClassAnno(7) int d, @RuntimeAnnoOne(8) String e, Object o) {}
|
||||
}
|
||||
|
||||
enum E {
|
||||
ONE(42, "");
|
||||
|
||||
@MethodParameterProcessor.ParameterNames
|
||||
E(int x, @RuntimeAnnoOne(9) String s) {}
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
Note: ClassReaderTest.E.<init>(x, @ClassReaderTest.RuntimeAnnoOne(9) s)
|
||||
Note: ClassReaderTest.I.<init>(@ClassReaderTest.ClassAnno(7) d, @ClassReaderTest.RuntimeAnnoOne(8) e, o)
|
||||
Note: ClassReaderTest.f(@ClassReaderTest.ClassAnno(3) @ClassReaderTest.RuntimeAnnoOne(1) @ClassReaderTest.RuntimeAnnoTwo(2) a, @ClassReaderTest.ClassAnno(6) @ClassReaderTest.RuntimeAnnoOne(4) @ClassReaderTest.RuntimeAnnoTwo(5) b)
|
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import static java.util.stream.Collectors.joining;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import javax.annotation.processing.RoundEnvironment;
|
||||
import javax.annotation.processing.SupportedAnnotationTypes;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.ExecutableElement;
|
||||
import javax.lang.model.element.VariableElement;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.tools.Diagnostic.Kind;
|
||||
|
||||
@SupportedAnnotationTypes("MethodParameterProcessor.ParameterNames")
|
||||
public class MethodParameterProcessor extends JavacTestingAbstractProcessor {
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
|
||||
@interface ParameterNames {
|
||||
String[] value() default {};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||
for (Element element : roundEnv.getElementsAnnotatedWith(ParameterNames.class)) {
|
||||
ExecutableElement exec = (ExecutableElement)element;
|
||||
String message = printNamesAndAnnotations(exec);
|
||||
messager.printMessage(Kind.NOTE, message);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private String printNamesAndAnnotations(ExecutableElement exec) {
|
||||
return String.format("%s.%s(%s)",
|
||||
exec.getEnclosingElement(),
|
||||
exec.getSimpleName(),
|
||||
exec.getParameters().stream().map(this::printParameter).collect(joining(", ")));
|
||||
}
|
||||
|
||||
private String printParameter(VariableElement param) {
|
||||
return param.getAnnotationMirrors().stream().map(String::valueOf).collect(joining(" "))
|
||||
+ (param.getAnnotationMirrors().isEmpty() ? "" : " ")
|
||||
+ param.getSimpleName();
|
||||
}
|
||||
}
|
@ -6,7 +6,7 @@ NestedInnerClassNames.java:46:13: compiler.err.already.defined: kindname.class,
|
||||
NestedInnerClassNames.java:59:9: compiler.err.already.defined: kindname.class, NestedInnerClassNames.foo$bar, kindname.class, NestedInnerClassNames
|
||||
NestedInnerClassNames.java:76:13: compiler.err.already.defined: kindname.class, NestedInnerClassNames.$bar, kindname.class, NestedInnerClassNames
|
||||
NestedInnerClassNames.java:90:13: compiler.err.already.defined: kindname.class, NestedInnerClassNames.bar$bar.bar, kindname.class, NestedInnerClassNames.bar$bar
|
||||
NestedInnerClassNames.java:109:5: compiler.err.duplicate.class: NestedInnerClassNames.foo.foo
|
||||
NestedInnerClassNames.java:109:5: compiler.err.same.binary.name: foo, foo$foo
|
||||
NestedInnerClassNames.java:19:9: compiler.err.already.defined: kindname.class, NestedInnerClassNames, kindname.package, compiler.misc.unnamed.package
|
||||
NestedInnerClassNames.java:28:13: compiler.err.already.defined: kindname.class, foo, kindname.method, m2()
|
||||
NestedInnerClassNames.java:40:13: compiler.err.already.defined: kindname.class, NestedInnerClassNames, kindname.package, compiler.misc.unnamed.package
|
||||
|
@ -1,2 +1,2 @@
|
||||
InconsistentReturn.java:17:1: compiler.err.types.incompatible.diff.ret: I2, I1, f()
|
||||
InconsistentReturn.java:17:1: compiler.err.types.incompatible: I2, I1, (compiler.misc.incompatible.diff.ret: f, )
|
||||
1 error
|
||||
|
@ -0,0 +1,20 @@
|
||||
/*
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8187487
|
||||
* @summary crash with duplicate class name
|
||||
* @compile/fail/ref=CrashWithDuplicateClassNamesTest.out -XDrawDiagnostics CrashWithDuplicateClassNamesTest.java
|
||||
*/
|
||||
|
||||
class CrashWithDuplicateClassNamesTest {
|
||||
static class C1$C2 {}
|
||||
|
||||
static class C1 {
|
||||
static class C2 {}
|
||||
}
|
||||
|
||||
static class C3 {
|
||||
static class C4 {}
|
||||
}
|
||||
|
||||
static class C3$C4 {}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
CrashWithDuplicateClassNamesTest.java:12:16: compiler.err.same.binary.name: C1$C2, C2
|
||||
CrashWithDuplicateClassNamesTest.java:19:12: compiler.err.same.binary.name: C4, C3$C4
|
||||
2 errors
|
@ -52,7 +52,7 @@ public class T6265137 {
|
||||
String srcdir = System.getProperty("test.src");
|
||||
Iterable<? extends JavaFileObject> files =
|
||||
fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(srcdir, "T6265137a.java")));
|
||||
javac.getTask(null, fm, dl, Arrays.asList("-target","10"), null, files).call();
|
||||
javac.getTask(null, fm, dl, Arrays.asList("-target","11"), null, files).call();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6395981 6458819 7025784 8028543 8028544
|
||||
* @bug 6395981 6458819 7025784 8028543 8028544 8193291
|
||||
* @summary JavaCompilerTool and Tool must specify version of JLS and JVMS
|
||||
* @author Peter von der Ah\u00e9
|
||||
* @modules java.compiler
|
||||
@ -31,7 +31,7 @@
|
||||
* @run main/fail T6395981
|
||||
* @run main/fail T6395981 RELEASE_3 RELEASE_5 RELEASE_6
|
||||
* @run main/fail T6395981 RELEASE_0 RELEASE_1 RELEASE_2 RELEASE_3 RELEASE_4 RELEASE_5 RELEASE_6
|
||||
* @run main T6395981 RELEASE_3 RELEASE_4 RELEASE_5 RELEASE_6 RELEASE_7 RELEASE_8 RELEASE_9 RELEASE_10
|
||||
* @run main T6395981 RELEASE_3 RELEASE_4 RELEASE_5 RELEASE_6 RELEASE_7 RELEASE_8 RELEASE_9 RELEASE_10 RELEASE_11
|
||||
*/
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 7157626 8001112 8188870
|
||||
* @bug 7157626 8001112 8188870 8173382
|
||||
* @summary Test major version for all legal combinations for -source and -target
|
||||
* @author sgoel
|
||||
*
|
||||
@ -38,7 +38,7 @@ import java.util.regex.*;
|
||||
public class ClassVersionChecker {
|
||||
|
||||
int errors;
|
||||
String[] jdk = {"", "1.6", "1.7", "1.8", "1.9", "1.10"};
|
||||
String[] jdk = {"", "1.6", "1.7", "1.8", "1.9", "1.10", "11"};
|
||||
File javaFile = null;
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
@ -58,11 +58,12 @@ public class ClassVersionChecker {
|
||||
* -1 => invalid combinations
|
||||
*/
|
||||
int[][] ver =
|
||||
{{54, -1, -1, -1, -1, -1},
|
||||
{54, 50, 51, 52, 53, 54},
|
||||
{54, -1, 51, 52, 53, 54},
|
||||
{54, -1, -1, 52, 53, 54},
|
||||
{54, -1, -1, -1, 53, 54}};
|
||||
{{55, -1, -1, -1, -1, -1, -1},
|
||||
{55, 50, 51, 52, 53, 54, 55},
|
||||
{55, -1, 51, 52, 53, 54, 55},
|
||||
{55, -1, -1, 52, 53, 54, 55},
|
||||
{55, -1, -1, -1, 53, 54, 55},
|
||||
{55, -1, -1, -1, -1, 54, 55}};
|
||||
|
||||
// Loop to run all possible combinations of source/target values
|
||||
for (int i = 0; i< ver.length; i++) {
|
||||
|
@ -1,2 +1,2 @@
|
||||
Neg01.java:14:12: compiler.err.types.incompatible.unrelated.defaults: kindname.class, Neg01.AB, m, , Neg01.IA, Neg01.IB
|
||||
Neg01.java:14:12: compiler.err.types.incompatible: Neg01.IA, Neg01.IB, (compiler.misc.incompatible.unrelated.defaults: kindname.class, Neg01.AB, m, , Neg01.IA, Neg01.IB)
|
||||
1 error
|
||||
|
@ -1,2 +1,2 @@
|
||||
Neg02.java:16:13: compiler.err.types.incompatible.unrelated.defaults: kindname.class, Neg02.X, m, , Neg02.A, Neg02.B
|
||||
Neg02.java:16:13: compiler.err.types.incompatible: Neg02.A, Neg02.B, (compiler.misc.incompatible.unrelated.defaults: kindname.class, Neg02.X, m, , Neg02.A, Neg02.B)
|
||||
1 error
|
||||
|
@ -1,2 +1,2 @@
|
||||
Neg14.java:10:14: compiler.err.types.incompatible.abstract.default: kindname.class, Neg14.AB, m, , Neg14.IB, Neg14.IA
|
||||
Neg14.java:10:14: compiler.err.types.incompatible: Neg14.IB, Neg14.IA, (compiler.misc.incompatible.abstract.default: kindname.class, Neg14.AB, m, , Neg14.IB, Neg14.IA)
|
||||
1 error
|
||||
|
@ -21,7 +21,8 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
// key: compiler.err.types.incompatible.diff.ret
|
||||
// key: compiler.err.types.incompatible
|
||||
// key: compiler.misc.incompatible.diff.ret
|
||||
// key: compiler.err.prob.found.req
|
||||
// key: compiler.misc.incompatible.descs.in.functional.intf
|
||||
// key: compiler.misc.descriptor
|
||||
|
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
// key: compiler.err.same.binary.name
|
||||
|
||||
class SameBinaryName {
|
||||
private static final class Foo$Bar {}
|
||||
|
||||
private static final class Foo {
|
||||
private static final class Bar {}
|
||||
}
|
||||
}
|
@ -21,7 +21,8 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
// key: compiler.err.types.incompatible.diff.ret
|
||||
// key: compiler.err.types.incompatible
|
||||
// key: compiler.misc.incompatible.diff.ret
|
||||
|
||||
interface A {
|
||||
int m();
|
||||
|
@ -21,7 +21,8 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
// key: compiler.err.types.incompatible.abstract.default
|
||||
// key: compiler.err.types.incompatible
|
||||
// key: compiler.misc.incompatible.abstract.default
|
||||
|
||||
class TypesIncompatibleAbstractDefault {
|
||||
interface A {
|
||||
|
@ -21,7 +21,8 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
// key: compiler.err.types.incompatible.unrelated.defaults
|
||||
// key: compiler.err.types.incompatible
|
||||
// key: compiler.misc.incompatible.unrelated.defaults
|
||||
|
||||
class TypesIncompatibleUnrelatedDefaults {
|
||||
interface A {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user