diff --git a/.hgtags b/.hgtags index 40695f0f4a1a3007606350b83bc46af660021d9a..35d898c9d70d86ea3870d10e9140d93261886ad9 100644 --- a/.hgtags +++ b/.hgtags @@ -71,3 +71,6 @@ f2dce7210cc00453c23e53edeec7156f112ca382 jdk7-b92 cf44386c8fe3fbdb9da14346be25d19fd1092f71 jdk7-b94 db951e984ccf50756160fee3078c791300b0917e jdk7-b95 51b9e5dbc2da0631414484b934ac3fb62e48a2c6 jdk7-b96 +b1903d7528d33b521df42bc9291bdcdd2f444a29 jdk7-b97 +82593186fa54ab12f17af31f86a7bf364efaf4df jdk7-b98 +2587c9f0b60dc3146b4247b8674ada456a643d6f jdk7-b99 diff --git a/make/common/Defs-linux.gmk b/make/common/Defs-linux.gmk index 970cea9fc15a0768625034e22337104cf55ce470..df8cba2ecedf8f76e8c41a0295509e05a5eae0c3 100644 --- a/make/common/Defs-linux.gmk +++ b/make/common/Defs-linux.gmk @@ -320,6 +320,7 @@ override LIBCXX = -lstdc++ endif override LIBPOSIX4 = override LIBSOCKET = +override LIBNSL = override LIBTHREAD = override MOOT_PRIORITIES = true override NO_INTERRUPTIBLE_IO = true diff --git a/make/common/Defs-solaris.gmk b/make/common/Defs-solaris.gmk index 32f8bf7f17ea274d8df6debc0ffafd2ad1b52093..97b6a69e43dbf030c028c5264d3a93c1ee4aae9d 100644 --- a/make/common/Defs-solaris.gmk +++ b/make/common/Defs-solaris.gmk @@ -645,6 +645,9 @@ LIBM = /usr/lib$(ISA_DIR)/libm.so.2 # Socket library LIBSOCKET = -lsocket +# Network Services library +LIBNSL = -lnsl + # GLOBAL_KPIC: If set means all libraries are PIC, position independent code # EXCEPT for select compiles # If a .o file is compiled non-PIC then it should be forced diff --git a/make/common/Release.gmk b/make/common/Release.gmk index 4c16022ce6862778e5ac6c3f0169a4ff89784d8e..cf16ea8dd3ad35fb5beab0c74b4c7bf33e62b1ae 100644 --- a/make/common/Release.gmk +++ b/make/common/Release.gmk @@ -54,6 +54,13 @@ EXCLUDE_PROPWARN_PKGS = com.sun.java.swing.plaf.windows \ # This is a stopgap until 6839872 is fixed. EXCLUDE_PROPWARN_PKGS += sun.dyn +# +# Include the exported private packages in ct.sym. +# This is an interim solution until the ct.sym is replaced +# with a new module system (being discussed for JDK 7). +# +EXPORTED_PRIVATE_PKGS = com.sun.servicetag + # 64-bit solaris has a few special cases. We define the variable # SOLARIS64 for use in this Makefile to easily test those cases ifeq ($(PLATFORM), solaris) @@ -982,7 +989,7 @@ initial-image-jdk:: initial-image-jdk-setup \ -processor com.sun.tools.javac.sym.CreateSymbols \ -Acom.sun.tools.javac.sym.Jar=$(RT_JAR) \ -Acom.sun.tools.javac.sym.Dest=$(OUTPUTDIR)/symbols/META-INF/sym/rt.jar \ - $(CORE_PKGS) $(NON_CORE_PKGS) $(EXCLUDE_PROPWARN_PKGS) + $(CORE_PKGS) $(NON_CORE_PKGS) $(EXCLUDE_PROPWARN_PKGS) $(EXPORTED_PRIVATE_PKGS) $(BOOT_JAR_CMD) c0f $(LIBDIR)/ct.sym \ -C $(OUTPUTDIR)/symbols META-INF $(BOOT_JAR_JFLAGS) @$(java-vm-cleanup) diff --git a/make/common/shared/Defs-control.gmk b/make/common/shared/Defs-control.gmk index b5f06e7524e55b6039455384bb0e2b86e81de152..4e545ca996b4fc8032b4aad6b9e183c5ef3eb9c1 100644 --- a/make/common/shared/Defs-control.gmk +++ b/make/common/shared/Defs-control.gmk @@ -35,9 +35,6 @@ ifndef JDK_MAKE_SHARED_DIR JDK_MAKE_SHARED_DIR = $(JDK_TOPDIR)/make/common/shared endif -ifndef CONTROL_TOPDIR - CONTROL_TOPDIR=$(TOPDIR) -endif ifndef HOTSPOT_TOPDIR HOTSPOT_TOPDIR=$(TOPDIR)/hotspot endif diff --git a/make/common/shared/Defs-windows.gmk b/make/common/shared/Defs-windows.gmk index 067e4a44cd5f5a1029e60860bda293618df9446f..79cc031c6195dc914e553e80cddc1ff78b1b6544 100644 --- a/make/common/shared/Defs-windows.gmk +++ b/make/common/shared/Defs-windows.gmk @@ -331,23 +331,50 @@ ifeq ($(_ms_sdk),) endif endif -# Compilers for 64bit may be from SDK. For VS 2010 we use those. -# The Express compilers don't contain 64 bit compilers, so in -# that case, you additionally need the SDK. At this time, -# there's no 64 bit SDK available that has VS 2010. -# Presumably SDK v7.1 will provide that and we may want to update -# the logic here to work with that. -# However official builds will use the Professional version. +# Compilers for 64bit may be from the free SDK, or Visual Studio Professional +# The free Express compilers don't contain 64 bit compilers, which is why +# you instead need the SDK. +# So for VS2010 based builds, either VS2010 Pro with the 7.0a SDK, or +# the Windows 7.1 standalone SDK with compilers may be used. +# Release enginering will use VS2010 Pro, so the frequency of testing of +# SDK based builds will depend entirely on individual usage. ifeq ($(ARCH_DATA_MODEL), 64) ifdef VS100COMNTOOLS # /Common7/Tools directory, use ../../Vc + # VS2010 default location is used when building 64 bit using the 7.1 SDK + # This is safe to hardwire as the SDK installer won't let you change it + # and the VS2010 variable is only used if the compilers are from the SDK + xVS2010 :="$(_program_files32)/Microsoft Visual Studio 10.0/" + VS2010 :=$(call FullPath,$(xVS2010)) xVS100COMNTOOLS :="$(subst \,/,$(VS100COMNTOOLS))" _vs100tools :=$(call FullPath,$(xVS100COMNTOOLS)) endif ifneq ($(_vs100tools),) _compiler_bin :=$(_vs100tools)/../../Vc/bin/amd64 - _redist_sdk :=$(_vs100tools)/../../Vc/redist/x64/Microsoft.VC100.CRT - xMSSDK70 :="$(_program_files32)/Microsoft SDKs/Windows/v7.0a/" - MSSDK70 :=$(call FullPath,$(xMSSDK70)) + x_redist_sdk :=$(_vs100tools)/../../Vc/redist/x64/Microsoft.VC100.CRT + _redist_sdk :=$(call FullPath,$(x_redist_sdk)) + # The SDK doesn't have the redist directory, but the DLL is installed + # into the windows directory. + ifeq ($(_redist_sdk),) + _redist_sdk :=c:/windows/system32 + endif + # Not currently using MSSDK7n, but maybe we can make use of it for + # doing default location lookup to find some SDK tools that presently + # require the developer to explicitly set the path. + # The 7.0a path is from VS2010 Pro, the 7.1 path is the standalone SDK. + # Either will work for us. + # If a developer chooses to install the standalone SDK in some other + # location, then this will fail to find it, which won't matter so long as + # we aren't using this variable. If we do they'd still need to set the + # ALT_MSDEVTOOLS_PATH as now. + # %WindowsSdkDir% could be referenced instead but the SDK installer + # doesn't set it and in the case of the VS2010 compilers, + # you can't change this location in the installer anyway. + xMSSDK7n :="$(_program_files32)/Microsoft SDKs/Windows/v7.0a/" + MSSDK7n :=$(call FullPath,$(xMSSDK7n)) + ifeq ($(MSSDK7n),) + xMSSDK7n :="$(_program_files32)/Microsoft SDKs/Windows/v7.1/" + MSSDK7n :=$(call FullPath,$(xMSSDK7n)) + endif else xVS2008 :="$(_program_files32)/Microsoft Visual Studio 9.0/" VS2008 :=$(call FullPath,$(xVS2008)) @@ -355,7 +382,7 @@ ifeq ($(ARCH_DATA_MODEL), 64) _compiler_bin :=$(VS2008)/VC/Bin/$(ARCH) xMSSDK61 :="$(_program_files)/Microsoft SDKs/Windows/v6.1/" MSSDK61 :=$(call FullPath,$(xMSSDK61)) - _redist_sdk :=$(VS2008)/VC/redist/x86/Microsoft.VC90.CRT + _redist_sdk :=$(VS2008)/VC/redist/x64/Microsoft.VC90.CRT else ifneq ($(_ms_sdk),) ifeq ($(ARCH), ia64) diff --git a/make/docs/CORE_PKGS.gmk b/make/docs/CORE_PKGS.gmk index b1cb7e62d2654ac53255594dbd736eb0fc1081c0..31aaeb1b5d8194291460d4151e76e58334cf8ec5 100644 --- a/make/docs/CORE_PKGS.gmk +++ b/make/docs/CORE_PKGS.gmk @@ -234,6 +234,7 @@ CORE_PKGS = \ javax.xml.ws.http \ javax.xml.ws.soap \ javax.xml.ws.spi \ + javax.xml.ws.spi.http \ javax.xml.ws.wsaddressing \ javax.xml.transform \ javax.xml.transform.sax \ diff --git a/make/java/hpi/hpi_common.gmk b/make/java/hpi/hpi_common.gmk index 5f77038309f3ee1318e1a7897690c83242df691b..025d2de10845a6882383a12f2c91a6ec333957ad 100644 --- a/make/java/hpi/hpi_common.gmk +++ b/make/java/hpi/hpi_common.gmk @@ -86,5 +86,5 @@ endif # Things that must be linked in. # ifneq ($(PLATFORM), windows) -OTHER_LDLIBS += $(LIBSOCKET) -lnsl $(LIBM) -ldl +OTHER_LDLIBS += $(LIBSOCKET) $(LIBNSL) $(LIBM) -ldl endif diff --git a/make/java/java/Makefile b/make/java/java/Makefile index 60542f2adbbe785ed7351068a2f5cca504e2a74c..827a0ec176f7f683d449055c8dbae12817402fef 100644 --- a/make/java/java/Makefile +++ b/make/java/java/Makefile @@ -204,7 +204,7 @@ ifeq ($(PLATFORM),windows) OTHER_LDLIBS += $(JVMLIB) -libpath:$(OBJDIR)/../../../fdlibm/$(OBJDIRNAME) fdlibm.lib \ -libpath:$(OBJDIR)/../../../verify/$(OBJDIRNAME) verify.lib else -OTHER_LDLIBS += $(JVMLIB) -lverify $(LIBSOCKET) -lnsl -ldl \ +OTHER_LDLIBS += $(JVMLIB) -lverify $(LIBSOCKET) $(LIBNSL) -ldl \ -L$(OBJDIR)/../../../fdlibm/$(OBJDIRNAME) -lfdlibm.$(ARCH) endif diff --git a/make/java/java_hprof_demo/Makefile b/make/java/java_hprof_demo/Makefile index f051de0c52f4f3c9ab6e5c5f61dd50405270e337..b6d0539adc93dbfa3700018bb58084beb4a7c0ec 100644 --- a/make/java/java_hprof_demo/Makefile +++ b/make/java/java_hprof_demo/Makefile @@ -84,7 +84,7 @@ OTHER_INCLUDES = -I$(SRCDIR) \ ifeq ($(PLATFORM), windows) OTHER_LDLIBS += wsock32.lib winmm.lib else - OTHER_LDLIBS += $(LIBSOCKET) -lnsl -ldl + OTHER_LDLIBS += $(LIBSOCKET) $(LIBNSL) -ldl endif # diff --git a/make/java/net/Makefile b/make/java/net/Makefile index ca898e53a6accaa0723f8bd99d814655d1ee6c5c..0021087cbcf5cbb71f069a7e7f165d4baaba6a7b 100644 --- a/make/java/net/Makefile +++ b/make/java/net/Makefile @@ -96,7 +96,7 @@ include $(BUILDDIR)/common/Library.gmk ifeq ($(PLATFORM), windows) OTHER_LDLIBS = ws2_32.lib $(JVMLIB) else - OTHER_LDLIBS = $(LIBSOCKET) -lnsl -ldl $(JVMLIB) + OTHER_LDLIBS = $(LIBSOCKET) $(LIBNSL) -ldl $(JVMLIB) endif ifeq ($(PLATFORM), linux) OTHER_LDLIBS += -lpthread diff --git a/make/jpda/transport/socket/Makefile b/make/jpda/transport/socket/Makefile index a048e24b4e4d30a2b7f79e08d3596d1bb8e01270..ee7980c7bdf9a22d4fa0aab81fd733dda4feb657 100644 --- a/make/jpda/transport/socket/Makefile +++ b/make/jpda/transport/socket/Makefile @@ -38,11 +38,11 @@ FILES_m = mapfile-vers include $(BUILDDIR)/common/Defs.gmk ifeq ($(PLATFORM), linux) - OTHER_LDLIBS += -lnsl $(LIBSOCKET) -lpthread + OTHER_LDLIBS += $(LIBNSL) $(LIBSOCKET) -lpthread endif ifeq ($(PLATFORM), solaris) - OTHER_LDLIBS += -lnsl $(LIBSOCKET) + OTHER_LDLIBS += $(LIBNSL) $(LIBSOCKET) endif ifeq ($(PLATFORM), windows) diff --git a/make/mkdemo/jvmti/hprof/Makefile b/make/mkdemo/jvmti/hprof/Makefile index 9a3cd19eee8fc98f54f29f0fe1f26417bffd6bfc..b0c703f67344d6cba03d4c353c3010e2a7fb662c 100644 --- a/make/mkdemo/jvmti/hprof/Makefile +++ b/make/mkdemo/jvmti/hprof/Makefile @@ -39,10 +39,10 @@ ifeq ($(PLATFORM), windows) EXTRA_LIBS += wsock32.lib winmm.lib endif ifeq ($(PLATFORM), solaris) - OTHER_LDLIBS += $(LIBSOCKET) -lnsl -ldl + OTHER_LDLIBS += $(LIBSOCKET) $(LIBNSL) -ldl endif ifeq ($(PLATFORM), linux) - OTHER_LDLIBS += $(LIBSOCKET) -lnsl -ldl -lpthread + OTHER_LDLIBS += $(LIBSOCKET) $(LIBNSL) -ldl -lpthread endif # diff --git a/make/netbeans/README b/make/netbeans/README index 8f68dce0ee5c4604466988923480c796c1191307..b23433401faef91a5c0473ceb0e9ea26744709d9 100644 --- a/make/netbeans/README +++ b/make/netbeans/README @@ -204,8 +204,8 @@ Provided NetBeans projects note that pretty much regardless of your hardware, this *will* take a long time, and use *lots* of disk space (more than 3GB). The results of the build are in - *install-dir*/control/build/*platform*-*arch* and - *install-dir*/control/build/*platform*-*arch*-fastdebug. + *install-dir*/build/*platform*-*arch* and + *install-dir*/build/*platform*-*arch*-fastdebug. Consult the project's README file for details. diff --git a/make/netbeans/world/README b/make/netbeans/world/README index 72c21a933713d4cda676735fbad9ae9cb360a874..54c2ccc1f2307f2e546e4b5a10b2079b1cc3b7bc 100644 --- a/make/netbeans/world/README +++ b/make/netbeans/world/README @@ -10,6 +10,6 @@ project code, you might prefer to build it from the command line using ant. Please note: the results of building this project are *not* put in the place used by other projects. In this case, the results are place in - /control/build/- + /build/- and - /control/build/--fastdebug + /build/--fastdebug diff --git a/make/netbeans/world/build.xml b/make/netbeans/world/build.xml index 99dbfbf690ab05711ff186042bbaef28a8308057..b502c2835fe6f27472414cf20a5bbd1e1bfbb864 100644 --- a/make/netbeans/world/build.xml +++ b/make/netbeans/world/build.xml @@ -34,11 +34,11 @@ - + - + diff --git a/make/sun/nio/cs/Makefile b/make/sun/nio/cs/Makefile index ff2f8ca16956e592376b3899bf190fc596db13d6..26437efca824fa8e44395ee67187c37aaa3e2bd5 100644 --- a/make/sun/nio/cs/Makefile +++ b/make/sun/nio/cs/Makefile @@ -37,7 +37,7 @@ PRODUCT = sun # This re-directs all the class files to a separate location CLASSDESTDIR = $(TEMPDIR)/classes -OTHER_JAVACFLAGS += -Xlint:serial -Werror +OTHER_JAVACFLAGS += -Xlint:serial,-deprecation -Werror include $(BUILDDIR)/common/Defs.gmk # diff --git a/make/sun/pisces/Makefile b/make/sun/pisces/Makefile index cb0f0761def644a276df13929b5248cf311c84ae..7823361e8be0a10b9e0a9e8b72a27ac1bd7d4443 100644 --- a/make/sun/pisces/Makefile +++ b/make/sun/pisces/Makefile @@ -52,5 +52,11 @@ build: copy-files copy-files: $(FILES_copy) -$(SERVICEDIR)/%: $(SHARE_SRC)/classes/sun/java2d/pisces/META-INF/services/% +ifneq ($(PLATFORM), windows) + SERVICE_SRC = $(PLATFORM_SRC) +else + SERVICE_SRC = $(SHARE_SRC) +endif + +$(SERVICEDIR)/%: $(SERVICE_SRC)/classes/sun/java2d/pisces/META-INF/services/% $(install-file) diff --git a/make/sun/tools/Makefile b/make/sun/tools/Makefile index a041eb0c7b0898429a6d6beb51edefe5b93ee2eb..ebfcff5132c21eb537f6403ec58ba0e05b9664df 100644 --- a/make/sun/tools/Makefile +++ b/make/sun/tools/Makefile @@ -49,7 +49,8 @@ AUTO_FILES_JAVA_DIRS = \ # Extra jstat files FILES_copy += \ - $(CLASSDESTDIR)/sun/tools/jstat/resources/jstat_options + $(CLASSDESTDIR)/sun/tools/jstat/resources/jstat_options \ + $(CLASSDESTDIR)/sun/tools/jstat/resources/jstat_unsupported_options # Extra jhat files JHAT_RESOURCEDIR = $(CLASSDESTDIR)/com/sun/tools/hat/resources diff --git a/make/tools/freetypecheck/freetypecheck.c b/make/tools/freetypecheck/freetypecheck.c index 08d7ce8eca6951aba356bdee0037e74e04f65dcb..ddbc2e0e7d4eb6fd209b27fc096269b238ba6731 100644 --- a/make/tools/freetypecheck/freetypecheck.c +++ b/make/tools/freetypecheck/freetypecheck.c @@ -33,7 +33,7 @@ #include FT_FREETYPE_H #ifdef _MSC_VER -#if _MSC_VER > 1400 +#if _MSC_VER > 1400 && _MSC_VER < 1600 /* * When building for Microsoft Windows, your program has a dependency @@ -68,7 +68,7 @@ "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"") #endif /* _M_AMD64 */ -#endif /* _MSC_VER > 1400 */ +#endif /* _MSC_VER > 1400 && _MSC_VER < 1600 */ #endif /* _MSC_VER */ #define QUOTEMACRO(x) QUOTEME(x) diff --git a/src/share/classes/com/sun/java/util/jar/pack/Constants.java b/src/share/classes/com/sun/java/util/jar/pack/Constants.java index a9deb0cd87797d9e5d928ba925ba97adea6d6e7b..19ce04cf559612e4574d7dfc965a0e309a17e301 100644 --- a/src/share/classes/com/sun/java/util/jar/pack/Constants.java +++ b/src/share/classes/com/sun/java/util/jar/pack/Constants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2010, 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 @@ -47,10 +47,13 @@ interface Constants { public final static short JAVA5_MAX_CLASS_MAJOR_VERSION = 49; public final static short JAVA5_MAX_CLASS_MINOR_VERSION = 0; - // NOTE: ASSUMED for now + public final static short JAVA6_MAX_CLASS_MAJOR_VERSION = 50; public final static short JAVA6_MAX_CLASS_MINOR_VERSION = 0; + public final static short JAVA7_MAX_CLASS_MAJOR_VERSION = 51; + public final static short JAVA7_MAX_CLASS_MINOR_VERSION = 0; + public final static int JAVA_PACKAGE_MAGIC = 0xCAFED00D; public final static int JAVA5_PACKAGE_MAJOR_VERSION = 150; public final static int JAVA5_PACKAGE_MINOR_VERSION = 7; diff --git a/src/share/classes/com/sun/java/util/jar/pack/Package.java b/src/share/classes/com/sun/java/util/jar/pack/Package.java index ad7fdbaa57518eb93db862aff67d0d220ba2c4b3..1ea04690ed8ec8e474127a0de837cc3e75e7408f 100644 --- a/src/share/classes/com/sun/java/util/jar/pack/Package.java +++ b/src/share/classes/com/sun/java/util/jar/pack/Package.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2010, 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 @@ -57,8 +57,8 @@ class Package implements Constants { // These fields can be adjusted by driver properties. short min_class_majver = JAVA_MIN_CLASS_MAJOR_VERSION; short min_class_minver = JAVA_MIN_CLASS_MINOR_VERSION; - short max_class_majver = JAVA6_MAX_CLASS_MAJOR_VERSION; - short max_class_minver = JAVA6_MAX_CLASS_MINOR_VERSION; + short max_class_majver = JAVA7_MAX_CLASS_MAJOR_VERSION; + short max_class_minver = JAVA7_MAX_CLASS_MINOR_VERSION; short observed_max_class_majver = min_class_majver; short observed_max_class_minver = min_class_minver; @@ -122,13 +122,16 @@ class Package implements Constants { void choosePackageVersion() { assert(package_majver <= 0); // do not call this twice int classver = getHighestClassVersion(); - if (classver != 0 && - (classver >>> 16) < JAVA6_MAX_CLASS_MAJOR_VERSION) { - // There are only old classfiles in this segment. + if (classver == 0 || (classver >>> 16) < JAVA6_MAX_CLASS_MAJOR_VERSION) { + // There are only old classfiles in this segment or resources package_majver = JAVA5_PACKAGE_MAJOR_VERSION; package_minver = JAVA5_PACKAGE_MINOR_VERSION; + } else if ((classver >>> 16) == JAVA6_MAX_CLASS_MAJOR_VERSION) { + package_majver = JAVA6_PACKAGE_MAJOR_VERSION; + package_minver = JAVA6_PACKAGE_MINOR_VERSION; } else { - // Normal case. Use the newest archive format. + // Normal case. Use the newest archive format, when available + // TODO: replace the following with JAVA7* when the need arises package_majver = JAVA6_PACKAGE_MAJOR_VERSION; package_minver = JAVA6_PACKAGE_MINOR_VERSION; } diff --git a/src/share/classes/com/sun/java/util/jar/pack/PropMap.java b/src/share/classes/com/sun/java/util/jar/pack/PropMap.java index c5eb8d75da16bb8adc39cfb67495323c20cf74ca..6b92236f82e109f200dd3cd8244a312024436021 100644 --- a/src/share/classes/com/sun/java/util/jar/pack/PropMap.java +++ b/src/share/classes/com/sun/java/util/jar/pack/PropMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003,2010 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 @@ -90,8 +90,8 @@ class PropMap extends TreeMap { props.put(Utils.PACK_DEFAULT_TIMEZONE, String.valueOf(Boolean.getBoolean(Utils.PACK_DEFAULT_TIMEZONE))); - // Limit segment size to less than a megabyte. - props.put(Pack200.Packer.SEGMENT_LIMIT, ""+(1*1000*1000)); + // The segment size is unlimited + props.put(Pack200.Packer.SEGMENT_LIMIT, ""); // Preserve file ordering by default. props.put(Pack200.Packer.KEEP_FILE_ORDER, Pack200.Packer.TRUE); diff --git a/src/share/classes/com/sun/servicetag/Registry.java b/src/share/classes/com/sun/servicetag/Registry.java index 68386ce673b8f3716d3cc95f532d4d7dc9fb5529..14ad2fd623d590e31431e3195104966830b4f9f3 100644 --- a/src/share/classes/com/sun/servicetag/Registry.java +++ b/src/share/classes/com/sun/servicetag/Registry.java @@ -67,7 +67,6 @@ public class Registry { // The stclient output has to be an exported interface private static final String INSTANCE_URN_DESC = "Product instance URN="; private static boolean initialized = false; - private static boolean supportsHelperClass = true; // default private static File stclient = null; private static String stclientPath = null; private static Registry registry = new Registry(); @@ -81,17 +80,6 @@ public class Registry { private synchronized static String getSTclient() { if (!initialized) { - // the system property always overrides the default setting - if (System.getProperty(SVCTAG_STHELPER_SUPPORTED) != null) { - supportsHelperClass = Boolean.getBoolean(SVCTAG_STHELPER_SUPPORTED); - } - - // This is only used for testing - stclientPath = System.getProperty(SVCTAG_STCLIENT_CMD); - if (stclientPath != null) { - return stclientPath; - } - // Initialization to determine the platform's stclient pathname String os = System.getProperty("os.name"); if (os.equals("SunOS")) { @@ -108,10 +96,26 @@ public class Registry { initialized = true; } + boolean supportsHelperClass = true; // default + if (System.getProperty(SVCTAG_STHELPER_SUPPORTED) != null) { + // the system property always overrides the default setting + supportsHelperClass = Boolean.getBoolean(SVCTAG_STHELPER_SUPPORTED); + } + + if (!supportsHelperClass) { + // disable system registry + return null; + } + + // This is only used for testing + String path = System.getProperty(SVCTAG_STCLIENT_CMD); + if (path != null) { + return path; + } + // com.sun.servicetag package has to be compiled with JDK 5 as well // JDK 5 doesn't support the File.canExecute() method. // Risk not checking isExecute() for the stclient command is very low. - if (stclientPath == null && stclient != null && stclient.exists()) { stclientPath = stclient.getAbsolutePath(); } @@ -142,8 +146,8 @@ public class Registry { * @return {@code true} if the {@code Registry} class is supported; * otherwise, return {@code false}. */ - public static boolean isSupported() { - return (getSTclient() != null && supportsHelperClass); + public static synchronized boolean isSupported() { + return getSTclient() != null; } private static List getCommandList() { diff --git a/src/share/classes/com/sun/servicetag/resources/jdk_header.png b/src/share/classes/com/sun/servicetag/resources/jdk_header.png index 011cfd4cd8aad0697b25257240ac338021f531c0..ccfe6dad8c8731c12aee5e4f255a6ae941791173 100644 Binary files a/src/share/classes/com/sun/servicetag/resources/jdk_header.png and b/src/share/classes/com/sun/servicetag/resources/jdk_header.png differ diff --git a/src/share/classes/com/sun/servicetag/resources/register.html b/src/share/classes/com/sun/servicetag/resources/register.html index 7684268eb6e9fdacafc464136a26053ee5bb797a..cc1dee262ec143d17ac00fc55bd6dddba7f391c8 100644 --- a/src/share/classes/com/sun/servicetag/resources/register.html +++ b/src/share/classes/com/sun/servicetag/resources/register.html @@ -53,13 +53,13 @@ a:visited,a:visited code{color:#917E9C}   -

Thank you for installing the +

Thank you for installing the Java Development Kit @@JDK_VERSION@@ - from Sun Microsystems.

+ from Oracle Corporation.

Registering your product will give you the following benefits:

  • Notification of new versions, patches, and updates
  • -
  • Special offers on Sun developer products, services and training
  • +
  • Special offers on Oracle developer products, services and training
  • Access to early releases and documentation

Product registration is FREE, quick and easy!

@@ -68,11 +68,11 @@ a:visited,a:visited code{color:#917E9C} - +
-
+
You need to be connected to the Internet to register this Sun product. You need to be connected to the Internet to register this Oracle product.
@@ -81,16 +81,16 @@ a:visited,a:visited code{color:#917E9C}   -

Sun Microsystems, Inc. respects your privacy. - We will use your personal information for communications - and management of your Sun Online Account, the services - and applications you access using your Sun Online Account, +

Oracle Corporation respects your privacy. + We will use your personal information for communications + and management of your Sun Online Account, the services + and applications you access using your Sun Online Account, and the products and systems you register with your Sun Online Account.

-

For more information on the data that will be collected as +

For more information on the data that will be collected as part of the registration process and how it will be managed
- see http://java.sun.com/javase/registration/JDKRegistrationPrivacy.html.
+ see http://java.sun.com/javase/registration/JDKRegistrationPrivacy.html.

- For more information on Sun's Privacy Policy see http://www.sun.com/privacy/ or contact privacy@sun.com.

+ For more information on Oracle's Privacy Policy see http://www.oracle.com/html/privacy.html or contact privacy_ww@oracle.com.

  diff --git a/src/share/classes/com/sun/servicetag/resources/register_ja.html b/src/share/classes/com/sun/servicetag/resources/register_ja.html index dae437712279b9eb0413ccd102d4f40f4710381a..3da70723ef8bc40f306d7a029607fa97d8f84023 100644 --- a/src/share/classes/com/sun/servicetag/resources/register_ja.html +++ b/src/share/classes/com/sun/servicetag/resources/register_ja.html @@ -50,11 +50,11 @@ a:visited,a:visited code{color:#917E9C}   -

Sun Microsystems の Java Development Kit @@JDK_VERSION@@ をインストールしていただき、ありがとうございます。

+

Oracle Corporation の Java Development Kit @@JDK_VERSION@@ をインストールしていただき、ありがとうございます。

製品登録をすると、次のような特典を受けることができます。

  • 最新のバージョン、パッチ、および更新についての通知
  • -
  • Sun の開発者向け製品、サービス、およびトレーニングの特別販売
  • +
  • Oracle の開発者向け製品、サービス、およびトレーニングの特別販売
  • アーリーリリースおよびドキュメントへのアクセス

製品登録は無料であり、迅速で簡単です。

@@ -62,11 +62,11 @@ a:visited,a:visited code{color:#917E9C}

必要になるのは、Sun 開発者向けネットワークアカウントまたはその他の Sun オンラインアカウントだけです。 まだアカウントがない場合は、アカウントの作成が求められます。

- - +
+
この Sun 製品を登録するには、インターネットに接続している必要があります。 この Oracle 製品を登録するには、インターネットに接続している必要があります。
@@ -75,8 +75,8 @@ a:visited,a:visited code{color:#917E9C}   -

Sun Microsystems, Inc. は、お客様のプライバシーを尊重します。 お客様の個人情報は、お客様の Sun オンラインアカウント、お客様が Sun オンラインアカウントを使用してアクセスするサービスとアプリケーション、およびお客様が Sun オンラインアカウントで登録する製品とシステムの通信と管理に使用します。

-

登録の際に収集されるデータや、それらがどのように管理されるかについての詳細は、
http://java.sun.com/javase/ja/registration/JDKRegistrationPrivacy.html を参照してください。

Sun のプライバシーポリシーについての詳細は、http://jp.sun.com/privacy/ を参照するか、お問い合わせフォームからお問い合わせください。

+

Oracle Corporation は、お客様のプライバシーを尊重します。 お客様の個人情報は、お客様の Sun オンラインアカウント、お客様が Sun オンラインアカウントを使用してアクセスするサービスとアプリケーション、およびお客様が Sun オンラインアカウントで登録する製品とシステムの通信と管理に使用します。

+

登録の際に収集されるデータや、それらがどのように管理されるかについての詳細は、
http://java.sun.com/javase/ja/registration/JDKRegistrationPrivacy.html を参照してください。

Oracle のプライバシーポリシーについての詳細は、http://www.oracle.com/html/privacy.html を参照するか、お問い合わせフォームからお問い合わせください。

  diff --git a/src/share/classes/com/sun/servicetag/resources/register_zh_CN.html b/src/share/classes/com/sun/servicetag/resources/register_zh_CN.html index dfc24dc94070c0c75c64f1c6682e0b72b1ee4e6f..f5bad110b4fb42bd01ef0fe856b6e469aa47edff 100644 --- a/src/share/classes/com/sun/servicetag/resources/register_zh_CN.html +++ b/src/share/classes/com/sun/servicetag/resources/register_zh_CN.html @@ -51,11 +51,11 @@ a:visited,a:visited code{color:#917E9C}   -

感谢您安装 Sun Microsystems 的 Java Development Kit @@JDK_VERSION@@

+

感谢您安装 Oracle Corporation 的 Java Development Kit @@JDK_VERSION@@

注册产品后您将获得如下增值服务:

  • 获得新版本、修补程序和更新的通知服务
  • -
  • 获得有关 Sun 开发者产品、服务和培训的优惠
  • +
  • 获得有关 Oracle 开发者产品、服务和培训的优惠
  • 获得对早期版本和文档的访问权限

产品注册是免费的,即快速又轻松!

@@ -63,11 +63,11 @@ a:visited,a:visited code{color:#917E9C}

您需要具有 Sun 开发者网络或其他 Sun 联机帐户。如果您没有,系统将提示您创建一个。

- - +
+
您需要连接到 Internet 来注册此 Sun 产品。 您需要连接到 Internet 来注册此 Oracle 产品。
@@ -76,8 +76,8 @@ a:visited,a:visited code{color:#917E9C}   -

Sun Microsystems, Inc. 尊重您的隐私。我们会将您的个人信息用于通信和 Sun 联机帐户的管理、Sun 联机帐户访问的服务和应用程序以及用于使用 Sun 联机帐户注册的产品和系统。

-

有关注册过程中收集的数据以及这些数据的管理方式的更多信息,
请访问 http://java.sun.com/javase/registration/JDKRegistrationPrivacy.html

有关 Sun 隐私政策的更多信息,请访问 http://www.sun.com/privacy/ 或与 privacy@sun.com 联系。

+

Oracle 尊重您的隐私。我们会将您的个人信息用于通信和 Sun 联机帐户的管理、Sun 联机帐户访问的服务和应用程序以及用于使用 Sun 联机帐户注册的产品和系统。

+

有关注册过程中收集的数据以及这些数据的管理方式的更多信息,
请访问 http://java.sun.com/javase/registration/JDKRegistrationPrivacy.html

有关 Oracle 隐私政策的更多信息,请访问 http://www.oracle.com/html/privacy.html 或与 privacy_ww@oracle.com 联系。

  diff --git a/src/share/classes/java/dyn/CallSite.java b/src/share/classes/java/dyn/CallSite.java index 94e58f6a815764b9f4303ac81c877788d955ab3f..b833577485125da50729fe3d98c2a9c4fa752aeb 100644 --- a/src/share/classes/java/dyn/CallSite.java +++ b/src/share/classes/java/dyn/CallSite.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2010, 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 @@ -25,25 +25,32 @@ package java.dyn; -import sun.dyn.util.BytecodeName; import sun.dyn.Access; +import sun.dyn.MemberName; import sun.dyn.CallSiteImpl; -import sun.dyn.MethodHandleImpl; /** - * An {@code invokedynamic} call site, as reified by the - * containing class's bootstrap method. - * Every call site object corresponds to a distinct instance - * of the invokedynamic instruction, and vice versa. - * Every call site has one state variable, called the {@code target}. - * It is typed as a {@link MethodHandle}. This state is never null, and - * it is the responsibility of the bootstrap method to produce call sites - * which have been pre-linked to an initial target method. + * A {@code CallSite} reifies an {@code invokedynamic} instruction from bytecode, + * and controls its linkage. + * Every linked {@code CallSite} object corresponds to a distinct instance + * of the {@code invokedynamic} instruction, and vice versa. *

- * (Note: The bootstrap method may elect to produce call sites of a + * Every linked {@code CallSite} object has one state variable, + * a {@link MethodHandle} reference called the {@code target}. + * This reference is never null. Though it can change its value + * successive values must always have exactly the {@link MethodType method type} + * called for by the bytecodes of the associated {@code invokedynamic} instruction + *

+ * It is the responsibility of each class's + * {@link Linkage#registerBootstrapMethod(Class, MethodHandle) bootstrap method} + * to produce call sites which have been pre-linked to an initial target method. + * The required {@link MethodType type} for the target method is a parameter + * to each bootstrap method call. + *

+ * The bootstrap method may elect to produce call sites of a * language-specific subclass of {@code CallSite}. In such a case, * the subclass may claim responsibility for initializing its target to - * a non-null value, by overriding {@link #initialTarget}.) + * a non-null value, by overriding {@link #initialTarget}. *

* An {@code invokedynamic} instruction which has not yet been executed * is said to be unlinked. When an unlinked call site is executed, @@ -52,54 +59,139 @@ import sun.dyn.MethodHandleImpl; * value to the new call site's target variable, the method {@link #initialTarget} * is called to produce the new call site's first target method. *

+ * A freshly-created {@code CallSite} object is not yet in a linked state. + * An unlinked {@code CallSite} object reports null for its {@code callerClass}. + * When the JVM receives a {@code CallSite} object from a bootstrap method, + * it first ensures that its target is non-null and of the correct type. + * The JVM then links the {@code CallSite} object to the call site instruction, + * enabling the {@code callerClass} to return the class in which the instruction occurs. + *

+ * Next, the JVM links the instruction to the {@code CallSite}, at which point + * any further execution of the {@code invokedynamic} instruction implicitly + * invokes the current target of the {@code CallSite} object. + * After this two-way linkage, both the instruction and the {@code CallSite} + * object are said to be linked. + *

+ * This state of linkage continues until the method containing the + * dynamic call site is garbage collected, or the dynamic call site + * is invalidated by an explicit request. + *

+ * Linkage happens once in the lifetime of any given {@code CallSite} object. + * Because of call site invalidation, this linkage can be repeated for + * a single {@code invokedynamic} instruction, with multiple {@code CallSite} objects. + * When a {@code CallSite} is unlinked from an {@code invokedynamic} instruction, + * the instruction is reset so that it is no longer associated with + * the {@code CallSite} object, but the {@code CallSite} does not change + * state. + *

+ * Here is a sample use of call sites and bootstrap methods which links every + * dynamic call site to print its arguments: +


+private static void printArgs(Object... args) {
+  System.out.println(java.util.Arrays.deepToString(args));
+}
+private static final MethodHandle printArgs;
+static {
+  MethodHandles.Lookup lookup = MethodHandles.lookup();
+  Class thisClass = lookup.lookupClass();  // (who am I?)
+  printArgs = lookup.findStatic(thisClass,
+      "printArgs", MethodType.methodType(void.class, Object[].class));
+  Linkage.registerBootstrapMethod("bootstrapDynamic");
+}
+private static CallSite bootstrapDynamic(Class caller, String name, MethodType type) {
+  // ignore caller and name, but match the type:
+  return new CallSite(MethodHandles.collectArguments(printArgs, type));
+}
+
* @see Linkage#registerBootstrapMethod(java.lang.Class, java.dyn.MethodHandle) * @author John Rose, JSR 292 EG */ public class CallSite - // Note: This is an implementation inheritance hack, and will be removed - // with a JVM change which moves the required hidden state onto this class. - extends CallSiteImpl { private static final Access IMPL_TOKEN = Access.getToken(); - /* - // Fields used only by the JVM. Do not use or change. - private Object vmmethod; - int callerMID, callerBCI; // supplied by the JVM + private MemberName vmmethod; // supplied by the JVM (ref. to calling method) + private int vmindex; // supplied by the JVM (BCI within calling method) + // The actual payload of this call site: private MethodHandle target; - final Object caller; // usually a class - final String name; - final MethodType type; - */ + // Remove this field for PFD and delete deprecated methods: + private MemberName calleeNameRemoveForPFD; /** - * Make a call site given the parameters from a call to the bootstrap method. - * The resulting call site is in an unlinked state, which means that before - * it is returned from a bootstrap method call it must be provided with - * a target method via a call to {@link CallSite#setTarget}. - * @param caller the class in which the relevant {@code invokedynamic} instruction occurs - * @param name the name specified by the {@code invokedynamic} instruction - * @param type the method handle type derived from descriptor of the {@code invokedynamic} instruction + * Make a blank call site object. + * Before it is returned from a bootstrap method, this {@code CallSite} object + * must be provided with + * a target method via a call to {@link CallSite#setTarget(MethodHandle) setTarget}, + * or by a subclass override of {@link CallSite#initialTarget(Class,String,MethodType) initialTarget}. */ - public CallSite(Object caller, String name, MethodType type) { - super(IMPL_TOKEN, caller, name, type); + public CallSite() { } - private static void privateInitializeCallSite(CallSite site, int callerMID, int callerBCI) { - site.callerMID = callerMID; - site.callerBCI = callerBCI; - site.ensureTarget(); + /** + * Make a blank call site object, possibly equipped with an initial target method handle. + * The initial target reference may be null, in which case the {@code CallSite} object + * must be provided with a target method via a call to {@link CallSite#setTarget}, + * or by a subclass override of {@link CallSite#initialTarget}. + * @param target the method handle which will be the initial target of the call site, or null if there is none yet + */ + public CallSite(MethodHandle target) { + this.target = target; } - private void ensureTarget() { - // Note use of super, which accesses the field directly, - // without deferring to possible subclass overrides. - if (super.getTarget() == null) { - super.setTarget(this.initialTarget()); - super.getTarget().type(); // provoke NPE if still null + + /** @deprecated transitional form defined in EDR but removed in PFD */ + public CallSite(Class caller, String name, MethodType type) { + this.calleeNameRemoveForPFD = new MemberName(caller, name, type); + } + /** @deprecated transitional form defined in EDR but removed in PFD */ + public Class callerClass() { + MemberName callee = this.calleeNameRemoveForPFD; + return callee == null ? null : callee.getDeclaringClass(); + } + /** @deprecated transitional form defined in EDR but removed in PFD */ + public String name() { + MemberName callee = this.calleeNameRemoveForPFD; + return callee == null ? null : callee.getName(); + } + /** @deprecated transitional form defined in EDR but removed in PFD */ + public MethodType type() { + MemberName callee = this.calleeNameRemoveForPFD; + return callee == null ? (target == null ? null : target.type()) : callee.getMethodType(); + } + /** @deprecated transitional form defined in EDR but removed in PFD */ + protected MethodHandle initialTarget() { + return initialTarget(callerClass(), name(), type()); + } + + /** Report if the JVM has linked this {@code CallSite} object to a dynamic call site instruction. + * Once it is linked, it is never unlinked. + */ + private boolean isLinked() { + return vmmethod != null; + } + + /** Called from JVM (or low-level Java code) after the BSM returns the newly created CallSite. + * The parameters are JVM-specific. + */ + void initializeFromJVM(String name, + MethodType type, + MemberName callerMethod, + int callerBCI) { + if (this.isLinked()) { + throw new InvokeDynamicBootstrapError("call site has already been linked to an invokedynamic instruction"); + } + MethodHandle target = this.target; + if (target == null) { + this.target = target = this.initialTarget(callerMethod.getDeclaringClass(), name, type); + } + if (!target.type().equals(type)) { + throw wrongTargetType(target, type); } + this.vmindex = callerBCI; + this.vmmethod = callerMethod; + assert(this.isLinked()); } /** @@ -108,14 +200,18 @@ public class CallSite * the method {@code initialTarget} is called to produce an initial * non-null target. (Live call sites must never have null targets.) *

+ * The arguments are the same as those passed to the bootstrap method. + * Thus, a bootstrap method is free to ignore the arguments and simply + * create a "blank" {@code CallSite} object of an appropriate subclass. + *

* If the bootstrap method itself does not initialize the call site, * this method must be overridden, because it just raises an * {@code InvokeDynamicBootstrapError}, which in turn causes the * linkage of the {@code invokedynamic} instruction to terminate * abnormally. */ - protected MethodHandle initialTarget() { - throw new InvokeDynamicBootstrapError("target must be initialized before call site is linked: "+this); + protected MethodHandle initialTarget(Class callerClass, String name, MethodType type) { + throw new InvokeDynamicBootstrapError("target must be initialized before call site is linked: "+name+type); } /** @@ -137,11 +233,11 @@ public class CallSite * @see #setTarget */ public MethodHandle getTarget() { - return super.getTarget(); + return target; } /** - * Link or relink the call site, by setting its target method. + * Set the target method of this call site. *

* The interactions of {@code setTarget} with memory are the same * as of a write to an ordinary variable, such as an array element or a @@ -152,96 +248,46 @@ public class CallSite * Stronger guarantees can be created by putting appropriate operations * into the bootstrap method and/or the target methods used * at any given call site. - * @param target the new target, or null if it is to be unlinked + * @param newTarget the new target * @throws NullPointerException if the proposed new target is null - * @throws WrongMethodTypeException if the proposed new target - * has a method type that differs from the call site's {@link #type()} - */ - public void setTarget(MethodHandle target) { - checkTarget(target); - super.setTarget(target); - } - - protected void checkTarget(MethodHandle target) { - target.type(); // provoke NPE - if (!canSetTarget(target)) - throw new WrongMethodTypeException(String.valueOf(target)+target.type()+" should be of type "+type()); - } - - protected boolean canSetTarget(MethodHandle target) { - return (target != null && target.type() == type()); - } - - /** - * Report the class containing the call site. - * This is an immutable property of the call site, set from the first argument to the constructor. - * @return class containing the call site - */ - public Class callerClass() { - return (Class) caller; - } - - /** - * Report the method name specified in the {@code invokedynamic} instruction. - * This is an immutable property of the call site, set from the second argument to the constructor. - *

- * Note that the name is a JVM bytecode name, and as such can be any - * non-empty string, as long as it does not contain certain "dangerous" - * characters such as slash {@code '/'} and dot {@code '.'}. - * See the Java Virtual Machine specification for more details. - *

- * Application such as a language runtimes may need to encode - * arbitrary program element names and other configuration information - * into the name. A standard convention for doing this is - * specified here. - * @return method name specified by the call site + * @throws WrongMethodTypeException if the call site is linked and the proposed new target + * has a method type that differs from the previous target */ - public String name() { - return name; + public void setTarget(MethodHandle newTarget) { + MethodType newType = newTarget.type(); // null check! + MethodHandle oldTarget = this.target; + if (oldTarget == null) { + // CallSite is not yet linked. + assert(!isLinked()); + this.target = newTarget; // might be null! + return; + } + MethodType oldType = oldTarget.type(); + if (!newTarget.type().equals(oldType)) + throw wrongTargetType(newTarget, oldType); + if (oldTarget != newTarget) + CallSiteImpl.setCallSiteTarget(IMPL_TOKEN, this, newTarget); } - /** - * Report the method name specified in the {@code invokedynamic} instruction, - * as a series of components, individually demangled according to - * the standard convention - * specified here. - *

- * Non-empty runs of characters between dangerous characters are demangled. - * Each component is either a completely arbitrary demangled string, - * or else a character constant for a punctuation character, typically ':'. - * (In principle, the character can be any dangerous character that the - * JVM lets through in a method name, such as '$' or ']'. - * Runtime implementors are encouraged to use colon ':' for building - * structured names.) - *

- * In the common case where the name contains no dangerous characters, - * the result is an array whose only element array is the demangled - * name at the call site. Such a demangled name can be any sequence - * of any number of any unicode characters. - * @return method name components specified by the call site - */ - public Object[] nameComponents() { - return BytecodeName.parseBytecodeName(name); + private static WrongMethodTypeException wrongTargetType(MethodHandle target, MethodType type) { + return new WrongMethodTypeException(String.valueOf(target)+target.type()+" should be of type "+type); } - /** - * Report the resolved result and parameter types of this call site, - * which are derived from its bytecode-level invocation descriptor. - * The types are packaged into a {@link MethodType}. - * Any linked target of this call site must be exactly this method type. - * This is an immutable property of the call site, set from the third argument to the constructor. - * @return method type specified by the call site + /** Produce a printed representation that displays information about this call site + * that may be useful to the human reader. */ - public MethodType type() { - return type; - } - @Override public String toString() { - return "CallSite#"+hashCode()+"["+name+type+" => "+getTarget()+"]"; + StringBuilder buf = new StringBuilder("CallSite#"); + buf.append(hashCode()); + if (!isLinked()) + buf.append("[unlinked]"); + else + buf.append("[") + .append("from ").append(vmmethod.getDeclaringClass().getName()) + .append(" : ").append(getTarget().type()) + .append(" => ").append(getTarget()) + .append("]"); + return buf.toString(); } - - // Package-local constant: - static final MethodHandle GET_TARGET = MethodHandleImpl.getLookup(IMPL_TOKEN). - findVirtual(CallSite.class, "getTarget", MethodType.methodType(MethodHandle.class)); } diff --git a/src/share/classes/java/dyn/InvokeDynamic.java b/src/share/classes/java/dyn/InvokeDynamic.java index 7f9d4b0363f27c4ed21375a514f36e8c30bc64ef..021e75a1ea7f40be3b7776066e7b868165aa3829 100644 --- a/src/share/classes/java/dyn/InvokeDynamic.java +++ b/src/share/classes/java/dyn/InvokeDynamic.java @@ -26,27 +26,25 @@ package java.dyn; /** - * Syntactic marker to request javac to emit an {@code invokedynamic} instruction. - * An {@code invokedynamic} instruction is a 5-byte bytecoded instruction - * which begins with an opcode byte of value 186 ({@code 0xBA}), - * and is followed by a two-byte index of a {@code NameAndType} constant - * pool entry, then by two zero bytes. The constant pool reference gives - * the method name and argument and return types of the call site; there - * is no other information provided at the call site. + * {@code InvokeDynamic} is a class with neither methods nor instances, + * which serves only as a syntactic marker in Java source code for + * an {@code invokedynamic} instruction. + * (See the package information for specifics on this instruction.) *

* The {@code invokedynamic} instruction is incomplete without a target method. - * The target method is a property of the reified call site object - * (of type {@link CallSite}) which is in a one-to-one association with each - * corresponding {@code invokedynamic} instruction. The call site object - * is initially produced by a bootstrap method associated with - * the call site, via the various overloadings of {@link Linkage#registerBootstrapMethod}. + * The target method is a property of the reified {@linkplain CallSite call site object} + * which is linked to each active {@code invokedynamic} instruction. + * The call site object is initially produced by a + * {@linkplain java.dyn.Linkage#registerBootstrapMethod(Class, MethodHandle) bootstrap method} + * associated with the class whose bytecodes include the dynamic call site. *

* The type {@code InvokeDynamic} has no particular meaning as a * class or interface supertype, or an object type; it can never be instantiated. * Logically, it denotes a source of all dynamically typed methods. - * It may be viewed as a pure syntactic marker (an importable one) of static calls. + * It may be viewed as a pure syntactic marker of static calls. + * It may be imported for ease of use. *

- * Here are some examples of usage: + * Here are some examples: *

  * Object x; String s; int i;
  * x = InvokeDynamic.greet("world"); // greet(Ljava/lang/String;)Ljava/lang/Object;
@@ -65,6 +63,7 @@ package java.dyn;
  * which must be registered by the static initializer of the enclosing class.
  * @author John Rose, JSR 292 EG
  */
+@MethodHandle.PolymorphicSignature
 public final class InvokeDynamic {
     private InvokeDynamic() { throw new InternalError(); }  // do not instantiate
 
diff --git a/src/share/classes/java/dyn/InvokeDynamicBootstrapError.java b/src/share/classes/java/dyn/InvokeDynamicBootstrapError.java
index e0517361ecf9391f10ba96d8e8a1ad6520539f84..83ebcd464b47cdfec0bb11f5455b49ea99b341fd 100644
--- a/src/share/classes/java/dyn/InvokeDynamicBootstrapError.java
+++ b/src/share/classes/java/dyn/InvokeDynamicBootstrapError.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2010, 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
@@ -27,24 +27,29 @@ package java.dyn;
 
 /**
  * Thrown to indicate that an {@code invokedynamic} instruction has
- * failed to find its bootstrap method, or the bootstrap method has
- * failed to provide a call site with a non-null target.
+ * failed to find its
+ * {@linkplain Linkage#registerBootstrapMethod(Class, MethodHandle) bootstrap method},
+ * or the bootstrap method has
+ * failed to provide a
+ * {@linkplain CallSite} call site with a non-null {@linkplain MethodHandle target}
+ * of the correct {@linkplain MethodType method type}.
  * 

- * The boostrap method must have been declared during a class's initialization - * by a call to {@link Linkage#registerBootstrapMethod}. + * The bootstrap method must have been declared during a class's initialization + * by a call to one of the overloadings of + * {@link Linkage#registerBootstrapMethod registerBootstrapMethod}. * * @author John Rose, JSR 292 EG */ public class InvokeDynamicBootstrapError extends LinkageError { /** - * Constructs a {@code InvokeDynamicBootstrapError} with no detail message. + * Constructs an {@code InvokeDynamicBootstrapError} with no detail message. */ public InvokeDynamicBootstrapError() { super(); } /** - * Constructs a {@code InvokeDynamicBootstrapError} with the specified + * Constructs an {@code InvokeDynamicBootstrapError} with the specified * detail message. * * @param s the detail message. diff --git a/src/share/classes/java/dyn/JavaMethodHandle.java b/src/share/classes/java/dyn/JavaMethodHandle.java index 0507eecb23711379d18a0f0b066ba2ff73f4c4ae..d8cd87a5ed5688fc50d9c15cde3eca25ac4a4d7d 100644 --- a/src/share/classes/java/dyn/JavaMethodHandle.java +++ b/src/share/classes/java/dyn/JavaMethodHandle.java @@ -28,7 +28,8 @@ package java.dyn; import sun.dyn.Access; /** - * A Java method handle extends the basic method handle type with additional + * A Java method handle is a deprecated proposal for extending + * the basic method handle type with additional * programmer defined methods and fields. * Its behavior as a method handle is determined at instance creation time, * by providing the new instance with an "entry point" method handle @@ -62,11 +63,11 @@ import sun.dyn.Access; * greeter.run(); // prints "hello, world" * // Statically typed method handle invocation (most direct): * MethodHandle mh = greeter; - * mh.<void>invoke(); // also prints "hello, world" + * mh.<void>invokeExact(); // also prints "hello, world" * // Dynamically typed method handle invocation: - * MethodHandles.invoke(greeter); // also prints "hello, world" + * MethodHandles.invokeExact(greeter); // also prints "hello, world" * greeter.setGreeting("howdy"); - * mh.invoke(); // prints "howdy, world" (object-like mutable behavior) + * mh.invokeExact(); // prints "howdy, world" (object-like mutable behavior) *

*

* In the example of {@code Greeter}, the method {@code run} provides the entry point. @@ -81,7 +82,7 @@ import sun.dyn.Access; * inner class: *

  * // We can also do this with symbolic names and/or inner classes:
- * MethodHandles.invoke(new JavaMethodHandle("yow") {
+ * MethodHandles.invokeExact(new JavaMethodHandle("yow") {
  *     void yow() { System.out.println("yow, world"); }
  * });
  * 
@@ -101,7 +102,7 @@ import sun.dyn.Access; * Greeter greeter = new Greeter("world"); * greeter.run(); // prints "hello, world" * MethodHandle mh = MethodHanndles.insertArgument(Greeter.RUN, 0, greeter); - * mh.invoke(); // also prints "hello, world" + * mh.invokeExact(); // also prints "hello, world" * * Note that the method handle must be separately created as a view on the base object. * This increases footprint, complexity, and dynamic indirections. @@ -113,7 +114,7 @@ import sun.dyn.Access; * MethodHandle greeter = new JavaMethodHandle("run") { * private void run() { System.out.println("hello, "+greetee); } * } - * greeter.invoke(); // prints "hello, world" + * greeter.invokeExact(); // prints "hello, world" * *

* Here is an abstract parameterized lvalue, efficiently expressed as a subtype of MethodHandle, @@ -137,10 +138,12 @@ import sun.dyn.Access; * public Number get(long i) { return stuff[(int)i]; } * public void set(long i, Object x) { stuff[(int)i] = x; } * } - * int x = (Integer) stuffPtr.<Number>invoke(1L); // 456 - * stuffPtr.setter().<void>invoke(0L, (Number) 789); // replaces 123 with 789 + * int x = (Integer) stuffPtr.<Number>invokeExact(1L); // 456 + * stuffPtr.setter().<void>invokeExact(0L, (Number) 789); // replaces 123 with 789 * * @see MethodHandle + * @deprecated The JSR 292 EG intends to replace {@code JavaMethodHandle} with + * an interface-based API for mixing method handle behavior with other classes. * @author John Rose, JSR 292 EG */ public abstract class JavaMethodHandle diff --git a/src/share/classes/java/dyn/Linkage.java b/src/share/classes/java/dyn/Linkage.java index 9b6bd60ea9666c021ccd8ddd4378ef308b0d71ed..d65ae41c31c55ad71070b4a2b5b8030ad3d1769e 100644 --- a/src/share/classes/java/dyn/Linkage.java +++ b/src/share/classes/java/dyn/Linkage.java @@ -25,14 +25,19 @@ package java.dyn; +import java.lang.annotation.Annotation; import java.dyn.MethodHandles.Lookup; import java.util.WeakHashMap; import sun.dyn.Access; +import sun.dyn.MethodHandleImpl; import sun.reflect.Reflection; import static sun.dyn.util.VerifyAccess.checkBootstrapPrivilege; +import static sun.dyn.MemberName.newIllegalArgumentException; /** - * Static methods which control the linkage of invokedynamic call sites. + * This class consists exclusively of static methods that control + * the linkage of {@code invokedynamic} instructions, and specifically + * their reification as {@link CallSite} objects. * @author John Rose, JSR 292 EG */ public class Linkage { @@ -42,102 +47,137 @@ public class Linkage { /** * PROVISIONAL API, WORK IN PROGRESS: - * Register a bootstrap method to use when linking a given caller class. - * It must be a method handle of a type equivalent to {@link CallSite#CallSite}. - * In other words, it must act as a factory method which accepts the arguments - * to {@code CallSite}'s constructor (a class, a string, and a method type), + * Register a bootstrap method to use when linking dynamic call sites within + * a given caller class. + *

+ * A bootstrap method must be a method handle with a return type of {@link CallSite} + * and the following arguments: + *

    + *
  • the class containing the {@code invokedynamic} instruction, for which the bootstrap method was registered + *
  • the name of the method being invoked (a {@link String}) + *
  • the type of the method being invoked (a {@link MethodType}) + *
  • TBD optionally, an unordered array of {@link Annotation}s attached to the call site + * (Until this feature is implemented, this will always receive an empty array.) + *
+ * (TBD: The final argument type may be missing from the method handle's type. + * Additional arguments may be added in the future.) + * The bootstrap method acts as a factory method which accepts the given arguments * and returns a {@code CallSite} object (possibly of a subclass of {@code CallSite}). *

- * The registration will fail with an {@code IllegalStateException} if any of the following conditions hold: + * The registration must take place exactly once, either before the class has begun + * being initialized, or from within the class's static initializer. + * Registration will fail with an exception if any of the following conditions hold: *

    - *
  • The caller of this method is in a different package than the {@code callerClass}, + *
  • The immediate caller of this method is in a different package than the given caller class, * and there is a security manager, and its {@code checkPermission} call throws * when passed {@link LinkagePermission}("registerBootstrapMethod",callerClass). - *
  • The given class already has a bootstrap method from a previous - * call to this method. - *
  • The given class is already fully initialized. - *
  • The given class is in the process of initialization, in another thread. - *
  • The same {@code CallSite} object has already been returned from - * a bootstrap method call to another {@code invokedynamic} call site. + *
  • The given caller class already has a bootstrap method registered. + *
  • The given caller class is already fully initialized. + *
  • The given caller class is in the process of initialization, in another thread. *
* Because of these rules, a class may install its own bootstrap method in * a static initializer. * @param callerClass a class that may have {@code invokedynamic} sites * @param bootstrapMethod the method to use to bootstrap all such sites + * @exception IllegalArgumentException if the class argument is null or + * a primitive class, or if the bootstrap method is the wrong type + * @exception IllegalStateException if the class already has a bootstrap + * method, or if the its static initializer has already run + * or is already running in another thread + * @exception SecurityException if there is a security manager installed, + * and a {@link LinkagePermission} check fails for "registerBootstrapMethod" */ public static void registerBootstrapMethod(Class callerClass, MethodHandle bootstrapMethod) { Class callc = Reflection.getCallerClass(2); checkBootstrapPrivilege(callc, callerClass, "registerBootstrapMethod"); checkBSM(bootstrapMethod); - synchronized (bootstrapMethods) { - if (bootstrapMethods.containsKey(callerClass)) - throw new IllegalStateException("bootstrap method already declared in "+callerClass); - bootstrapMethods.put(callerClass, bootstrapMethod); - } + MethodHandleImpl.registerBootstrap(IMPL_TOKEN, callerClass, bootstrapMethod); } - static void checkBSM(MethodHandle mh) { - if (mh == null) throw new IllegalArgumentException("null bootstrap method"); - if (mh.type() == OLD_BOOTSTRAP_METHOD_TYPE) // FIXME: delete at EDR/PFD - throw new WrongMethodTypeException("bootstrap method must be a CallSite factory"); - if (mh.type() != BOOTSTRAP_METHOD_TYPE) - throw new WrongMethodTypeException(mh.toString()); + static private void checkBSM(MethodHandle mh) { + if (mh == null) throw newIllegalArgumentException("null bootstrap method"); + if (mh.type() == BOOTSTRAP_METHOD_TYPE_2) + // For now, always pass an empty array for the Annotations argument + mh = MethodHandles.insertArguments(mh, BOOTSTRAP_METHOD_TYPE_2.parameterCount()-1, + (Object)NO_ANNOTATIONS); + if (mh.type() == BOOTSTRAP_METHOD_TYPE) return; + throw new WrongMethodTypeException(mh.toString()); } + static private final Annotation[] NO_ANNOTATIONS = { }; /** * PROVISIONAL API, WORK IN PROGRESS: - * Simplified version of registerBootstrapMethod for self-registration, + * Simplified version of {@code registerBootstrapMethod} for self-registration, * to be called from a static initializer. * Finds a static method of the required type in the - * given class, and installs it on the caller. - * @throws IllegalArgumentException if there is no such method + * given runtime class, and installs it on the caller class. + * @throws NoSuchMethodException if there is no such method + * @throws IllegalStateException if the caller class's static initializer + * has already run, or is already running in another thread */ public static void registerBootstrapMethod(Class runtime, String name) { - Class callc = Reflection.getCallerClass(2); - Lookup lookup = new Lookup(IMPL_TOKEN, callc); - MethodHandle bootstrapMethod = - lookup.findStatic(runtime, name, BOOTSTRAP_METHOD_TYPE); - // FIXME: exception processing wrong here - checkBSM(bootstrapMethod); - Linkage.registerBootstrapMethod(callc, bootstrapMethod); + Class callerClass = Reflection.getCallerClass(2); + registerBootstrapMethodLookup(callerClass, runtime, name); } /** * PROVISIONAL API, WORK IN PROGRESS: - * Simplified version of registerBootstrapMethod for self-registration, + * Simplified version of {@code registerBootstrapMethod} for self-registration, * to be called from a static initializer. * Finds a static method of the required type in the - * caller's class, and installs it on the caller. + * caller class itself, and installs it on the caller class. * @throws IllegalArgumentException if there is no such method + * @throws IllegalStateException if the caller class's static initializer + * has already run, or is already running in another thread */ public static void registerBootstrapMethod(String name) { - Class callc = Reflection.getCallerClass(2); - Lookup lookup = new Lookup(IMPL_TOKEN, callc); - MethodHandle bootstrapMethod = - lookup.findStatic(callc, name, BOOTSTRAP_METHOD_TYPE); - // FIXME: exception processing wrong here + Class callerClass = Reflection.getCallerClass(2); + registerBootstrapMethodLookup(callerClass, callerClass, name); + } + + private static + void registerBootstrapMethodLookup(Class callerClass, Class runtime, String name) { + Lookup lookup = new Lookup(IMPL_TOKEN, callerClass); + MethodHandle bootstrapMethod; + // Try both types. TBD + try { + bootstrapMethod = lookup.findStatic(runtime, name, BOOTSTRAP_METHOD_TYPE_2); + } catch (NoAccessException ex) { + bootstrapMethod = null; + } + if (bootstrapMethod == null) { + try { + bootstrapMethod = lookup.findStatic(runtime, name, BOOTSTRAP_METHOD_TYPE); + } catch (NoAccessException ex) { + throw new IllegalArgumentException("no such bootstrap method in "+runtime+": "+name, ex); + } + } checkBSM(bootstrapMethod); - Linkage.registerBootstrapMethod(callc, bootstrapMethod); + MethodHandleImpl.registerBootstrap(IMPL_TOKEN, callerClass, bootstrapMethod); } /** * PROVISIONAL API, WORK IN PROGRESS: - * Report the bootstrap method registered for a given class. + * Report the bootstrap method registered for a given caller class. * Returns null if the class has never yet registered a bootstrap method. * Only callers privileged to set the bootstrap method may inquire * about it, because a bootstrap method is potentially a back-door entry * point into its class. + * @exception IllegalArgumentException if the argument is null or + * a primitive class + * @exception SecurityException if there is a security manager installed, + * and the immediate caller of this method is not in the same + * package as the caller class + * and a {@link LinkagePermission} check fails for "getBootstrapMethod" */ public static MethodHandle getBootstrapMethod(Class callerClass) { Class callc = Reflection.getCallerClass(2); - checkBootstrapPrivilege(callc, callerClass, "registerBootstrapMethod"); - synchronized (bootstrapMethods) { - return bootstrapMethods.get(callerClass); - } + checkBootstrapPrivilege(callc, callerClass, "getBootstrapMethod"); + return MethodHandleImpl.getBootstrap(IMPL_TOKEN, callerClass); } /** @@ -148,13 +188,10 @@ public class Linkage { public static final MethodType BOOTSTRAP_METHOD_TYPE = MethodType.methodType(CallSite.class, Class.class, String.class, MethodType.class); - - private static final MethodType OLD_BOOTSTRAP_METHOD_TYPE - = MethodType.methodType(Object.class, - CallSite.class, Object[].class); - - private static final WeakHashMap bootstrapMethods = - new WeakHashMap(); + static final MethodType BOOTSTRAP_METHOD_TYPE_2 + = MethodType.methodType(CallSite.class, + Class.class, String.class, MethodType.class, + Annotation[].class); /** * PROVISIONAL API, WORK IN PROGRESS: @@ -182,10 +219,8 @@ public class Linkage { /** * PROVISIONAL API, WORK IN PROGRESS: - * Invalidate all invokedynamic call sites in the bytecodes + * Invalidate all {@code invokedynamic} call sites in the bytecodes * of any methods of the given class. - * (These are exactly those sites which report the given class - * via the {@link CallSite#callerClass()} method.) *

* When this method returns, every matching invokedynamic * instruction will invoke its bootstrap method on next call. @@ -201,18 +236,4 @@ public class Linkage { } throw new UnsupportedOperationException("NYI"); } - - private static Object doNotBootstrap(CallSite site, Object... arguments) { - throw new UnsupportedOperationException("call site must not have null target: "+site); - } - - private static final MethodHandle DO_NOT_BOOTSTRAP = - MethodHandles.Lookup.IMPL_LOOKUP.findStatic(Linkage.class, "doNotBootstrap", - OLD_BOOTSTRAP_METHOD_TYPE); - - // Up-call from the JVM. Obsolete. FIXME: Delete from VM then from here. - static - MethodHandle findBootstrapMethod(Class callerClass, Class searchBootstrapClass) { - return DO_NOT_BOOTSTRAP; - } } diff --git a/src/share/classes/java/dyn/LinkagePermission.java b/src/share/classes/java/dyn/LinkagePermission.java index ab4ce04dd2b34ec999b70083f4aa07c52a7209ee..4478d959853a1f2f1ceaa1e085df52dfc56d90ce 100644 --- a/src/share/classes/java/dyn/LinkagePermission.java +++ b/src/share/classes/java/dyn/LinkagePermission.java @@ -31,23 +31,17 @@ import java.util.Hashtable; import java.util.StringTokenizer; /** - * This class is for runtime permissions. A RuntimePermission - * contains a name (also referred to as a "target name") but + * This class is for managing runtime permission checking for + * operations performed by methods in the {@link Linkage} class. + * Like a {@link RuntimePermission}, on which it is modeled, + * a {@code LinkagePermission} contains a target name but * no actions list; you either have the named permission * or you don't. - * - *

- * The target name is the name of the runtime permission (see below). The - * naming convention follows the hierarchical property naming convention. - * Also, an asterisk - * may appear at the end of the name, following a ".", or by itself, to - * signify a wildcard match. For example: "loadLibrary.*" or "*" is valid, - * "*loadLibrary" or "a*b" is not valid. - *

- * The following table lists all the possible RuntimePermission target names, + *

+ * The following table lists all the possible {@code LinkagePermission} target names, * and for each provides a description of what the permission allows * and a discussion of the risks of granting code the permission. - *

+ *

* * @@ -59,15 +53,17 @@ import java.util.StringTokenizer; * * * - * + * * + * has just been loaded, thus gaining control of its {@code invokedynamic} calls. * * * * * - * + * * * * @@ -78,7 +74,7 @@ import java.util.StringTokenizer; * *
registerBootstrapMethod.{class name}Specifying a bootstrap method for invokedynamic, within a class of the given nameSpecifying a bootstrap method for {@code invokedynamic} instructions within a class of the given nameAn attacker could attempt to attach a bootstrap method to a class which - * has just been loaded, thus gaining control of its invokedynamic calls.
invalidateAllForce the relinking of invokedynamic call sites everywhere.This could allow an attacker to slow down the system, or perhaps surface timing bugs in a dynamic language implementations, by forcing redundant relinking operations.This could allow an attacker to slow down the system, + * or perhaps expose timing bugs in a dynamic language implementations, + * by forcing redundant relinking operations.
* - * @see java.security.BasicPermission + * @see java.security.RuntimePermission * @see java.lang.SecurityManager * * @author John Rose, JSR 292 EG diff --git a/src/share/classes/java/dyn/MethodHandle.java b/src/share/classes/java/dyn/MethodHandle.java index 25d575b9f259929dea82fb83135caf370f3d51e9..20387ca6859f85e73ba9251652054044532d1979 100644 --- a/src/share/classes/java/dyn/MethodHandle.java +++ b/src/share/classes/java/dyn/MethodHandle.java @@ -34,32 +34,34 @@ import static java.dyn.MethodHandles.invokers; // package-private API import static sun.dyn.MemberName.newIllegalArgumentException; // utility /** - * A method handle is a typed reference to the entry point of a method. + * A method handle is a typed, directly executable reference to a method, + * constructor, field, or similar low-level operation, with optional + * conversion or substitution of arguments or return values. *

* Method handles are strongly typed according to signature. * They are not distinguished by method name or enclosing class. * A method handle must be invoked under a signature which exactly matches - * the method handle's own type. + * the method handle's own {@link MethodType method type}. *

- * Every method handle confesses its type via the type accessor. + * Every method handle confesses its type via the {@code type} accessor. * The structure of this type is a series of classes, one of which is - * the return type of the method (or void.class if none). + * the return type of the method (or {@code void.class} if none). *

* Every method handle appears as an object containing a method named - * invoke, whose signature exactly matches + * {@code invoke}, whose signature exactly matches * the method handle's type. * A Java method call expression, which compiles to an - * invokevirtual instruction, + * {@code invokevirtual} instruction, * can invoke this method from Java source code. *

* Every call to a method handle specifies an intended method type, * which must exactly match the type of the method handle. - * (The type is specified in the invokevirtual instruction, + * (The type is specified in the {@code invokevirtual} instruction, * via a {@code CONSTANT_NameAndType} constant pool entry.) * The call looks within the receiver object for a method - * named invoke of the intended method type. + * named {@code invoke} of the intended method type. * The call fails with a {@link WrongMethodTypeException} - * if the method does not exist, even if there is an invoke + * if the method does not exist, even if there is an {@code invoke} * method of a closely similar signature. * As with other kinds * of methods in the JVM, signature matching during method linkage @@ -76,13 +78,13 @@ import static sun.dyn.MemberName.newIllegalArgumentException; // utility * They should not be passed to untrusted code. *

* Bytecode in an extended JVM can directly call a method handle's - * invoke from an invokevirtual instruction. - * The receiver class type must be MethodHandle and the method name - * must be invoke. The signature of the invocation + * {@code invoke} from an {@code invokevirtual} instruction. + * The receiver class type must be {@code MethodHandle} and the method name + * must be {@code invoke}. The signature of the invocation * (after resolving symbolic type names) must exactly match the method type * of the target method. *

- * Every invoke method always throws {@link Exception}, + * Every {@code invoke} method always throws {@link Exception}, * which is to say that there is no static restriction on what a method handle * can throw. Since the JVM does not distinguish between checked * and unchecked exceptions (other than by their class, of course), @@ -92,11 +94,11 @@ import static sun.dyn.MemberName.newIllegalArgumentException; // utility * throw {@code Exception}, or else must catch all checked exceptions locally. *

* Bytecode in an extended JVM can directly obtain a method handle - * for any accessible method from a ldc instruction - * which refers to a CONSTANT_Methodref or - * CONSTANT_InterfaceMethodref constant pool entry. + * for any accessible method from a {@code ldc} instruction + * which refers to a {@code CONSTANT_Methodref} or + * {@code CONSTANT_InterfaceMethodref} constant pool entry. *

- * All JVMs can also use a reflective API called MethodHandles + * All JVMs can also use a reflective API called {@code MethodHandles} * for creating and calling method handles. *

* A method reference may refer either to a static or non-static method. @@ -104,7 +106,7 @@ import static sun.dyn.MemberName.newIllegalArgumentException; // utility * receiver argument, prepended before any other arguments. * In the method handle's type, the initial receiver argument is typed * according to the class under which the method was initially requested. - * (E.g., if a non-static method handle is obtained via ldc, + * (E.g., if a non-static method handle is obtained via {@code ldc}, * the type of the receiver is the class named in the constant pool entry.) *

* When a method handle to a virtual method is invoked, the method is @@ -113,38 +115,38 @@ import static sun.dyn.MemberName.newIllegalArgumentException; // utility * A non-virtual method handles to a specific virtual method implementation * can also be created. These do not perform virtual lookup based on * receiver type. Such a method handle simulates the effect of - * an invokespecial instruction to the same method. + * an {@code invokespecial} instruction to the same method. *

* Here are some examples of usage: *

- * Object x, y; String s; int i;
- * MethodType mt; MethodHandle mh;
- * MethodHandles.Lookup lookup = MethodHandles.lookup();
- * // mt is {(char,char) => String}
- * mt = MethodType.make(String.class, char.class, char.class);
- * mh = lookup.findVirtual(String.class, "replace", mt);
- * // (Ljava/lang/String;CC)Ljava/lang/String;
- * s = mh.<String>invoke("daddy",'d','n');
- * assert(s.equals("nanny"));
- * // weakly typed invocation (using MHs.invoke)
- * s = (String) MethodHandles.invoke(mh, "sappy", 'p', 'v');
- * assert(s.equals("savvy"));
- * // mt is {Object[] => List}
- * mt = MethodType.make(java.util.List.class, Object[].class);
- * mh = lookup.findStatic(java.util.Arrays.class, "asList", mt);
- * // mt is {(Object,Object,Object) => Object}
- * mt = MethodType.makeGeneric(3);
- * mh = MethodHandles.collectArguments(mh, mt);
- * // mt is {(Object,Object,Object) => Object}
- * // (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
- * x = mh.invoke((Object)1, (Object)2, (Object)3);
- * assert(x.equals(java.util.Arrays.asList(1,2,3)));
- * // mt is { => int}
- * mt = MethodType.make(int.class);
- * mh = lookup.findVirtual(java.util.List.class, "size", mt);
- * // (Ljava/util/List;)I
- * i = mh.<int>invoke(java.util.Arrays.asList(1,2,3));
- * assert(i == 3);
+Object x, y; String s; int i;
+MethodType mt; MethodHandle mh;
+MethodHandles.Lookup lookup = MethodHandles.lookup();
+// mt is {(char,char) => String}
+mt = MethodType.methodType(String.class, char.class, char.class);
+mh = lookup.findVirtual(String.class, "replace", mt);
+// (Ljava/lang/String;CC)Ljava/lang/String;
+s = mh.<String>invokeExact("daddy",'d','n');
+assert(s.equals("nanny"));
+// weakly typed invocation (using MHs.invoke)
+s = (String) mh.invokeVarargs("sappy", 'p', 'v');
+assert(s.equals("savvy"));
+// mt is {Object[] => List}
+mt = MethodType.methodType(java.util.List.class, Object[].class);
+mh = lookup.findStatic(java.util.Arrays.class, "asList", mt);
+// mt is {(Object,Object,Object) => Object}
+mt = MethodType.genericMethodType(3);
+mh = MethodHandles.collectArguments(mh, mt);
+// mt is {(Object,Object,Object) => Object}
+// (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+x = mh.invokeExact((Object)1, (Object)2, (Object)3);
+assert(x.equals(java.util.Arrays.asList(1,2,3)));
+// mt is { => int}
+mt = MethodType.methodType(int.class);
+mh = lookup.findVirtual(java.util.List.class, "size", mt);
+// (Ljava/util/List;)I
+i = mh.<int>invokeExact(java.util.Arrays.asList(1,2,3));
+assert(i == 3);
  * 
* Each of the above calls generates a single invokevirtual instruction * with the name {@code invoke} and the type descriptors indicated in the comments. @@ -167,6 +169,14 @@ import static sun.dyn.MemberName.newIllegalArgumentException; // utility * those of multiple arities. It is impossible to represent such * genericity with a Java type parameter. * + * Signature polymorphic methods in this class appear to be documented + * as having type parameters for return types and a parameter, but that is + * merely a documentation convention. These type parameters do + * not play a role in type-checking method handle invocations. + *

+ * Note: Like classes and strings, method handles that correspond directly + * to fields and methods can be represented directly as constants to be + * loaded by {@code ldc} bytecodes. * * @see MethodType * @see MethodHandles @@ -180,7 +190,15 @@ public abstract class MethodHandle private static Access IMPL_TOKEN = Access.getToken(); // interface MethodHandle - // { MethodType type(); public R invoke(A...) throws X; } + // { MethodType type(); public R invokeExact(A...) throws X; } + + /** + * Internal marker interface which distinguishes (to the Java compiler) + * those methods which are signature polymorphic. + */ + @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.TYPE}) + @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) + @interface PolymorphicSignature { } private MethodType type; @@ -232,85 +250,38 @@ public abstract class MethodHandle return MethodHandleImpl.getNameString(IMPL_TOKEN, this); } - //// First draft of the "Method Handle Kernel API" discussed at the JVM Language Summit, 9/2009. + //// This is the "Method Handle Kernel API" discussed at the JVM Language Summit, 9/2009. //// Implementations here currently delegate to statics in MethodHandles. Some of those statics //// will be deprecated. Others will be kept as "algorithms" to supply degrees of freedom //// not present in the Kernel API. /** * PROVISIONAL API, WORK IN PROGRESS: - * Perform an exact invocation. The signature at the call site of {@code invokeExact} must + * Invoke the method handle, allowing any caller signature, but requiring an exact signature match. + * The signature at the call site of {@code invokeExact} must * exactly match this method handle's {@code type}. * No conversions are allowed on arguments or return values. - * This is not yet implemented, pending required compiler and JVM support. */ - public final T invokeExact(Object... arguments) throws Throwable { - // This is an approximate implementation, which discards the caller's signature and refuses the call. - throw new InternalError("not yet implemented"); - } + public final native @PolymorphicSignature R invokeExact(A... args) throws Throwable; + + // FIXME: remove this transitional form + /** @deprecated transitional form defined in EDR but removed in PFD */ + public final native @PolymorphicSignature R invoke(A... args) throws Throwable; /** * PROVISIONAL API, WORK IN PROGRESS: - * Perform a generic invocation. The signature at the call site of {@code invokeExact} must + * Invoke the method handle, allowing any caller signature, + * and performing simple conversions for arguments and return types. + * The signature at the call site of {@code invokeGeneric} must * have the same arity as this method handle's {@code type}. * The same conversions are allowed on arguments or return values as are supported by * by {@link MethodHandles#convertArguments}. * If the call site signature exactly matches this method handle's {@code type}, * the call proceeds as if by {@link #invokeExact}. - * This is not fully implemented, pending required compiler and JVM support. */ - // This is an approximate implementation, which discards the caller's signature. - // When it is made signature polymorphic, the overloadings will disappear. - public final T invokeGeneric() throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this); - } - public final T invokeGeneric(Object a0) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0); - } - public final T invokeGeneric(Object a0, Object a1) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1); - } - public final T invokeGeneric(Object a0, Object a1, Object a2) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1, a2); - } - public final T invokeGeneric(Object a0, Object a1, Object a2, Object a3) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1, a2, a3); - } - public final T invokeGeneric(Object a0, Object a1, Object a2, Object a3, - Object a4) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1, a2, a3, a4); - } - public final T invokeGeneric(Object a0, Object a1, Object a2, Object a3, - Object a4, Object a5) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1, a2, a3, a4, a5); - } - public final T invokeGeneric(Object a0, Object a1, Object a2, Object a3, - Object a4, Object a5, Object a6) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1, a2, a3, a4, a5, a6); - } - public final T invokeGeneric(Object a0, Object a1, Object a2, Object a3, - Object a4, Object a5, Object a6, Object a7) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1, a2, a3, a4, a5, a6, a7); - } - public final T invokeGeneric(Object a0, Object a1, Object a2, Object a3, - Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1, a2, a3, a4, a5, a6, a7, a8); - } - public final T invokeGeneric(Object a0, Object a1, Object a2, Object a3, - Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - MethodHandle invoker = invokers(this.type()).genericInvoker(); - return invoker.invoke(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - } + public final native @PolymorphicSignature R invokeGeneric(A... args) throws Throwable; + + // ?? public final native @PolymorphicSignature R invokeVarargs(A args, V[] varargs) throws Throwable; /** * PROVISIONAL API, WORK IN PROGRESS: @@ -341,47 +312,47 @@ public abstract class MethodHandle * This call is equivalent to the following code: *

      *   MethodHandle invoker = MethodHandles.genericInvoker(this.type(), 0, true);
-     *   Object result = invoker.invoke(this, arguments);
+     *   Object result = invoker.invokeExact(this, arguments);
      * 
* @param arguments the arguments to pass to the target * @return the result returned by the target * @see MethodHandles#genericInvoker */ - public final Object invokeVarargs(Object[] arguments) throws Throwable { + public final Object invokeVarargs(Object... arguments) throws Throwable { int argc = arguments == null ? 0 : arguments.length; MethodType type = type(); if (argc <= 10) { MethodHandle invoker = MethodHandles.invokers(type).genericInvoker(); switch (argc) { - case 0: return invoker.invoke(this); - case 1: return invoker.invoke(this, + case 0: return invoker.invokeExact(this); + case 1: return invoker.invokeExact(this, arguments[0]); - case 2: return invoker.invoke(this, + case 2: return invoker.invokeExact(this, arguments[0], arguments[1]); - case 3: return invoker.invoke(this, + case 3: return invoker.invokeExact(this, arguments[0], arguments[1], arguments[2]); - case 4: return invoker.invoke(this, + case 4: return invoker.invokeExact(this, arguments[0], arguments[1], arguments[2], arguments[3]); - case 5: return invoker.invoke(this, + case 5: return invoker.invokeExact(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); - case 6: return invoker.invoke(this, + case 6: return invoker.invokeExact(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); - case 7: return invoker.invoke(this, + case 7: return invoker.invokeExact(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]); - case 8: return invoker.invoke(this, + case 8: return invoker.invokeExact(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7]); - case 9: return invoker.invoke(this, + case 9: return invoker.invokeExact(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8]); - case 10: return invoker.invoke(this, + case 10: return invoker.invokeExact(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], @@ -391,7 +362,7 @@ public abstract class MethodHandle // more than ten arguments get boxed in a varargs list: MethodHandle invoker = MethodHandles.invokers(type).varargsInvoker(0); - return invoker.invoke(this, arguments); + return invoker.invokeExact(this, arguments); } /** Equivalent to {@code invokeVarargs(arguments.toArray())}. */ public final Object invokeVarargs(java.util.List arguments) throws Throwable { diff --git a/src/share/classes/java/dyn/MethodHandles.java b/src/share/classes/java/dyn/MethodHandles.java index 3f53e4a19e9ba5833de607f5774aafec5eb3a072..ac35f88e14353b436992f4f4562ef21cf6670624 100644 --- a/src/share/classes/java/dyn/MethodHandles.java +++ b/src/share/classes/java/dyn/MethodHandles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2010, 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 @@ -44,13 +44,13 @@ import static sun.dyn.MemberName.newIllegalArgumentException; import static sun.dyn.MemberName.newNoAccessException; /** - * Fundamental operations and utilities for MethodHandle. - * They fall into several categories: + * This class consists exclusively of static methods that operate on or return + * method handles. They fall into several categories: *
    - *
  • Reifying methods and fields. This is subject to access checks. - *
  • Invoking method handles on dynamically typed arguments and/or varargs arrays. - *
  • Combining or transforming pre-existing method handles into new ones. - *
  • Miscellaneous emulation of common JVM operations or control flow patterns. + *
  • Factory methods which create method handles for methods and fields. + *
  • Invoker methods which can invoke method handles on dynamically typed arguments and/or varargs arrays. + *
  • Combinator methods, which combine or transforming pre-existing method handles into new ones. + *
  • Factory methods which create method handles that emulate other common JVM operations or control flow patterns. *
*

* @author John Rose, JSR 292 EG @@ -66,36 +66,44 @@ public class MethodHandles { //// Method handle creation from ordinary methods. - /** Create a {@link Lookup} lookup object on the caller. - * + /** + * Return a {@link Lookup lookup object} on the caller, + * which has the capability to access any method handle that the caller has access to, + * including direct method handles to private fields and methods. + * This lookup object is a capability which may be delegated to trusted agents. + * Do not store it in place where untrusted code can access it. */ public static Lookup lookup() { return new Lookup(); } - /** Version of lookup which is trusted minimally. - * It can only be used to create method handles to - * publicly accessible members. + /** + * Return a {@link Lookup lookup object} which is trusted minimally. + * It can only be used to create method handles to + * publicly accessible fields and methods. */ public static Lookup publicLookup() { return Lookup.PUBLIC_LOOKUP; } /** - * A factory object for creating method handles, when the creation - * requires access checking. Method handles do not perform + * A lookup object is a factory for creating method handles, + * when the creation requires access checking. + * Method handles do not perform * access checks when they are called; this is a major difference * from reflective {@link Method}, which performs access checking - * against every caller, on every call. Method handle access - * restrictions are enforced when a method handle is created. + * against every caller, on every call. + * Therefore, method handle access + * restrictions must be enforced when a method handle is created. * The caller class against which those restrictions are enforced - * is known as the "lookup class". {@link Lookup} embodies an + * is known as the {@linkplain #lookupClass lookup class}. + * A lookup object embodies an * authenticated lookup class, and can be used to create any number * of access-checked method handles, all checked against a single * lookup class. *

* A class which needs to create method handles will call - * {@code MethodHandles.lookup()} to create a factory for itself. + * {@link MethodHandles#lookup MethodHandles.lookup} to create a factory for itself. * It may then use this factory to create method handles on * all of its methods, including private ones. * It may also delegate the lookup (e.g., to a metaobject protocol) @@ -104,12 +112,13 @@ public class MethodHandles { * checked against the original lookup class, and not with any higher * privileges. *

- * Note that access checks only apply to named and reflected methods. - * Other method handle creation methods, such as {@link #convertArguments}, + * Access checks only apply to named and reflected methods. + * Other method handle creation methods, such as + * {@link #convertArguments MethodHandles.convertArguments}, * do not require any access checks, and can be done independently * of any lookup class. - *

- * A note about error conditions: A lookup can fail, because + *

How access errors are handled

+ * A lookup can fail, because * the containing class is not accessible to the lookup class, or * because the desired class member is missing, or because the * desired class member is not accessible to the lookup class. @@ -124,8 +133,25 @@ public class MethodHandles { */ public static final class Lookup { + /** The class on behalf of whom the lookup is being performed. */ private final Class lookupClass; + /** The allowed sorts of members which may be looked up (public, etc.), with STRICT for package. */ + private final int allowedModes; + + private static final int + PUBLIC = Modifier.PUBLIC, + PACKAGE = Modifier.STRICT, + PROTECTED = Modifier.PROTECTED, + PRIVATE = Modifier.PRIVATE, + ALL_MODES = (PUBLIC | PACKAGE | PROTECTED | PRIVATE), + TRUSTED = -1; + + private static int fixmods(int mods) { + mods &= (ALL_MODES - PACKAGE); + return (mods != 0) ? mods : PACKAGE; + } + /** Which class is performing the lookup? It is this class against * which checks are performed for visibility and access permissions. *

@@ -136,57 +162,90 @@ public class MethodHandles { return lookupClass; } + // This is just for calling out to MethodHandleImpl. + private Class lookupClassOrNull() { + return (allowedModes == TRUSTED) ? null : lookupClass; + } + + /** Which types of members can this lookup object produce? + * The result is a bit-mask of the modifier bits PUBLIC, PROTECTED, PRIVATE, and STRICT. + * The modifier bit STRICT stands in for the (non-existent) package protection mode. + */ + int lookupModes() { + return allowedModes & ALL_MODES; + } + /** Embody the current class (the lookupClass) as a lookup class * for method handle creation. * Must be called by from a method in this package, * which in turn is called by a method not in this package. + *

* Also, don't make it private, lest javac interpose * an access$N method. */ Lookup() { - this(IMPL_TOKEN, getCallerClassAtEntryPoint()); + this(getCallerClassAtEntryPoint(), ALL_MODES); + // make sure we haven't accidentally picked up a privileged class: + checkUnprivilegedlookupClass(lookupClass); } Lookup(Access token, Class lookupClass) { - // make sure we haven't accidentally picked up a privileged class: - checkUnprivilegedlookupClass(lookupClass); + this(lookupClass, ALL_MODES); + Access.check(token); + } + + private Lookup(Class lookupClass, int allowedModes) { this.lookupClass = lookupClass; + this.allowedModes = allowedModes; } /** - * Create a lookup on the specified class. - * The result is guaranteed to have no more access privileges - * than the original. + * Create a lookup on the specified new lookup class. + * The resulting object will report the specified + * class as its own {@link #lookupClass}. + *

+ * However, the resulting {@code Lookup} object is guaranteed + * to have no more access capabilities than the original. + * In particular:

    + *
  • If the new lookup class differs from the old one, + * protected members will not be accessible by virtue of inheritance. + *
  • If the new lookup class is in a different package + * than the old one, protected and default (package) members will not be accessible. + *
  • If the new lookup class is not within the same package member + * as the old one, private members will not be accessible. + *
  • In all cases, public members will continue to be accessible. + *
*/ - public Lookup in(Class newLookupClass) { - if (this == PUBLIC_LOOKUP) return PUBLIC_LOOKUP; - if (newLookupClass == null) return PUBLIC_LOOKUP; - if (newLookupClass == lookupClass) return this; - if (this != IMPL_LOOKUP) { - if (!VerifyAccess.isSamePackage(lookupClass, newLookupClass)) - throw newNoAccessException(new MemberName(newLookupClass), this); - checkUnprivilegedlookupClass(newLookupClass); + public Lookup in(Class requestedLookupClass) { + requestedLookupClass.getClass(); // null check + if (allowedModes == TRUSTED) // IMPL_LOOKUP can make any lookup at all + return new Lookup(requestedLookupClass, ALL_MODES); + if (requestedLookupClass == this.lookupClass) + return this; // keep same capabilities + int newModes = (allowedModes & (ALL_MODES & ~PROTECTED)); + if ((newModes & PACKAGE) != 0 + && !VerifyAccess.isSamePackage(this.lookupClass, requestedLookupClass)) { + newModes &= ~(PACKAGE|PRIVATE); } - return new Lookup(newLookupClass); - } - - private Lookup(Class lookupClass) { - this.lookupClass = lookupClass; + if ((newModes & PRIVATE) != 0 + && !VerifyAccess.isSamePackageMember(this.lookupClass, requestedLookupClass)) { + newModes &= ~PRIVATE; + } + checkUnprivilegedlookupClass(requestedLookupClass); + return new Lookup(requestedLookupClass, newModes); } // Make sure outer class is initialized first. static { IMPL_TOKEN.getClass(); } - private static final Class PUBLIC_ONLY = sun.dyn.empty.Empty.class; - /** Version of lookup which is trusted minimally. * It can only be used to create method handles to * publicly accessible members. */ - static final Lookup PUBLIC_LOOKUP = new Lookup(PUBLIC_ONLY); + static final Lookup PUBLIC_LOOKUP = new Lookup(Object.class, PUBLIC); /** Package-private version of lookup which is trusted. */ - static final Lookup IMPL_LOOKUP = new Lookup(null); + static final Lookup IMPL_LOOKUP = new Lookup(Object.class, TRUSTED); static { MethodHandleImpl.initLookup(IMPL_TOKEN, IMPL_LOOKUP); } private static void checkUnprivilegedlookupClass(Class lookupClass) { @@ -195,13 +254,35 @@ public class MethodHandles { throw newIllegalArgumentException("illegal lookupClass: "+lookupClass); } + /** Display the name of the class. + * If there are restrictions on the access permitted to this lookup, + * display those also. + */ @Override public String toString() { - if (lookupClass == PUBLIC_ONLY) - return "public"; - if (lookupClass == null) - return "privileged"; - return lookupClass.getName(); + String modestr; + String cname = lookupClass.getName(); + switch (allowedModes) { + case TRUSTED: + return "/trusted"; + case PUBLIC: + modestr = "/public"; + if (lookupClass == Object.class) + return modestr; + break; + case PUBLIC|PACKAGE: + return cname + "/package"; + case 0: // should not happen + return cname + "/empty"; + case ALL_MODES: + return cname; + } + StringBuilder buf = new StringBuilder(cname); + if ((allowedModes & PUBLIC) != 0) buf.append("/public"); + if ((allowedModes & PACKAGE) != 0) buf.append("/package"); + if ((allowedModes & PROTECTED) != 0) buf.append("/protected"); + if ((allowedModes & PRIVATE) != 0) buf.append("/private"); + return buf.toString(); } // call this from an entry point method in Lookup with extraFrames=0. @@ -219,11 +300,11 @@ public class MethodHandles { * The type of the method handle will be that of the method. * (Since static methods do not take receivers, there is no * additional receiver argument inserted into the method handle type, - * as there would be with {@linkplain #findVirtual} or {@linkplain #findSpecial}.) + * as there would be with {@link #findVirtual} or {@link #findSpecial}.) * The method and all its argument types must be accessible to the lookup class. * If the method's class has not yet been initialized, that is done * immediately, before the method handle is returned. - * @param defc the class from which the method is accessed + * @param refc the class from which the method is accessed * @param name the name of the method * @param type the type of the method * @return the desired method handle @@ -231,18 +312,16 @@ public class MethodHandles { * @exception NoAccessException if the method does not exist or access checking fails */ public - MethodHandle findStatic(Class defc, String name, MethodType type) throws NoAccessException { - MemberName method = IMPL_NAMES.resolveOrFail(new MemberName(defc, name, type, Modifier.STATIC), true, lookupClass()); - VerifyAccess.checkName(method, this); - checkStatic(true, method, this); - //throw NoSuchMethodException - return MethodHandleImpl.findMethod(IMPL_TOKEN, method, false, lookupClass()); + MethodHandle findStatic(Class refc, String name, MethodType type) throws NoAccessException { + MemberName method = resolveOrFail(refc, name, type, true); + checkMethod(refc, method, true); + return MethodHandleImpl.findMethod(IMPL_TOKEN, method, false, lookupClassOrNull()); } /** * Produce a method handle for a virtual method. * The type of the method handle will be that of the method, - * with the receiver type ({@code defc}) prepended. + * with the receiver type (usually {@code refc}) prepended. * The method and all its argument types must be accessible to the lookup class. *

* (BUG NOTE: The type {@code Object} may be prepended instead @@ -257,18 +336,44 @@ public class MethodHandles { * implementation to enter. * (The dispatching action is identical with that performed by an * {@code invokevirtual} or {@code invokeinterface} instruction.) - * @param defc the class or interface from which the method is accessed + * @param refc the class or interface from which the method is accessed * @param name the name of the method * @param type the type of the method, with the receiver argument omitted * @return the desired method handle * @exception SecurityException TBD * @exception NoAccessException if the method does not exist or access checking fails */ - public MethodHandle findVirtual(Class defc, String name, MethodType type) throws NoAccessException { - MemberName method = IMPL_NAMES.resolveOrFail(new MemberName(defc, name, type), true, lookupClass()); - VerifyAccess.checkName(method, this); - checkStatic(false, method, this); - return MethodHandleImpl.findMethod(IMPL_TOKEN, method, true, lookupClass()); + public MethodHandle findVirtual(Class refc, String name, MethodType type) throws NoAccessException { + MemberName method = resolveOrFail(refc, name, type, false); + checkMethod(refc, method, false); + MethodHandle mh = MethodHandleImpl.findMethod(IMPL_TOKEN, method, true, lookupClassOrNull()); + return restrictProtectedReceiver(method, mh); + } + + /** + * Produce a method handle which creates an object and initializes it, using + * the constructor of the specified type. + * The parameter types of the method handle will be those of the constructor, + * while the return type will be a reference to the constructor's class. + * The constructor and all its argument types must be accessible to the lookup class. + * If the constructor's class has not yet been initialized, that is done + * immediately, before the method handle is returned. + *

+ * Note: The requested type must have a return type of {@code void}. + * This is consistent with the JVM's treatment of constructor signatures. + * @param refc the class or interface from which the method is accessed + * @param type the type of the method, with the receiver argument omitted, and a void return type + * @return the desired method handle + * @exception SecurityException TBD + * @exception NoAccessException if the method does not exist or access checking fails + */ + public MethodHandle findConstructor(Class refc, MethodType type) throws NoAccessException { + String name = ""; + MemberName ctor = resolveOrFail(refc, name, type, false, false, lookupClassOrNull()); + assert(ctor.isConstructor()); + checkAccess(refc, ctor); + MethodHandle rawMH = MethodHandleImpl.findMethod(IMPL_TOKEN, ctor, false, lookupClassOrNull()); + return MethodHandleImpl.makeAllocator(IMPL_TOKEN, rawMH); } /** @@ -287,27 +392,87 @@ public class MethodHandles { *

* If the explicitly specified caller class is not identical with the * lookup class, a security check TBD is performed. - * @param defc the class or interface from which the method is accessed - * @param name the name of the method, or "" for a constructor + * @param refc the class or interface from which the method is accessed + * @param name the name of the method (which must not be "<init>") * @param type the type of the method, with the receiver argument omitted * @param specialCaller the proposed calling class to perform the {@code invokespecial} * @return the desired method handle * @exception SecurityException TBD * @exception NoAccessException if the method does not exist or access checking fails */ - public MethodHandle findSpecial(Class defc, String name, MethodType type, + public MethodHandle findSpecial(Class refc, String name, MethodType type, Class specialCaller) throws NoAccessException { - checkSpecialCaller(specialCaller, this); - Lookup slookup = this.in(specialCaller); - MemberName method = IMPL_NAMES.resolveOrFail(new MemberName(defc, name, type), false, slookup.lookupClass()); - VerifyAccess.checkName(method, this); - checkStatic(false, method, this); - if (name.equals("")) { - throw newNoAccessException("cannot directly invoke a constructor", method, null); - } else if (defc.isInterface() || !defc.isAssignableFrom(specialCaller)) { - throw newNoAccessException("method must be in a superclass of lookup class", method, slookup.lookupClass()); - } - return MethodHandleImpl.findMethod(IMPL_TOKEN, method, false, slookup.lookupClass()); + checkSpecialCaller(specialCaller); + MemberName method = resolveOrFail(refc, name, type, false, false, specialCaller); + checkMethod(refc, method, false); + MethodHandle mh = MethodHandleImpl.findMethod(IMPL_TOKEN, method, false, specialCaller); + return restrictReceiver(method, mh, specialCaller); + } + + /** + * PROVISIONAL API, WORK IN PROGRESS: + * Produce a method handle giving read access to a non-static field. + * The type of the method handle will have a return type of the field's + * value type. + * The method handle's single argument will be the instance containing + * the field. + * Access checking is performed immediately on behalf of the lookup class. + * @param name the field's name + * @param type the field's type + * @return a method handle which can load values from the field + * @exception NoAccessException if access checking fails + */ + public MethodHandle findGetter(Class refc, String name, Class type) throws NoAccessException { + return makeAccessor(refc, name, type, false, false); + } + + /** + * PROVISIONAL API, WORK IN PROGRESS: + * Produce a method handle giving write access to a non-static field. + * The type of the method handle will have a void return type. + * The method handle will take two arguments, the instance containing + * the field, and the value to be stored. + * The second argument will be of the field's value type. + * Access checking is performed immediately on behalf of the lookup class. + * @param name the field's name + * @param type the field's type + * @return a method handle which can store values into the field + * @exception NoAccessException if access checking fails + */ + public MethodHandle findSetter(Class refc, String name, Class type) throws NoAccessException { + return makeAccessor(refc, name, type, false, true); + } + + /** + * PROVISIONAL API, WORK IN PROGRESS: + * Produce a method handle giving read access to a static field. + * The type of the method handle will have a return type of the field's + * value type. + * The method handle will take no arguments. + * Access checking is performed immediately on behalf of the lookup class. + * @param name the field's name + * @param type the field's type + * @return a method handle which can load values from the field + * @exception NoAccessException if access checking fails + */ + public MethodHandle findStaticGetter(Class refc, String name, Class type) throws NoAccessException { + return makeAccessor(refc, name, type, true, false); + } + + /** + * PROVISIONAL API, WORK IN PROGRESS: + * Produce a method handle giving write access to a static field. + * The type of the method handle will have a void return type. + * The method handle will take a single + * argument, of the field's value type, the value to be stored. + * Access checking is performed immediately on behalf of the lookup class. + * @param name the field's name + * @param type the field's type + * @return a method handle which can store values into the field + * @exception NoAccessException if access checking fails + */ + public MethodHandle findStaticSetter(Class refc, String name, Class type) throws NoAccessException { + return makeAccessor(refc, name, type, true, true); } /** @@ -323,7 +488,7 @@ public class MethodHandles { *

* This is equivalent to the following expression: * - * {@link #insertArguments}({@link #findVirtual}(defc, name, type), receiver) + * {@link #insertArguments insertArguments}({@link #findVirtual findVirtual}(defc, name, type), receiver) * * where {@code defc} is either {@code receiver.getClass()} or a super * type of that class, in which the requested method is accessible @@ -336,15 +501,13 @@ public class MethodHandles { * @exception NoAccessException if the method does not exist or access checking fails */ public MethodHandle bind(Object receiver, String name, MethodType type) throws NoAccessException { - Class rcvc = receiver.getClass(); // may get NPE - MemberName reference = new MemberName(rcvc, name, type); - MemberName method = IMPL_NAMES.resolveOrFail(reference, true, lookupClass()); - VerifyAccess.checkName(method, this); - checkStatic(false, method, this); - MethodHandle dmh = MethodHandleImpl.findMethod(IMPL_TOKEN, method, true, lookupClass()); + Class refc = receiver.getClass(); // may get NPE + MemberName method = resolveOrFail(refc, name, type, false); + checkMethod(refc, method, false); + MethodHandle dmh = MethodHandleImpl.findMethod(IMPL_TOKEN, method, true, lookupClassOrNull()); MethodHandle bmh = MethodHandleImpl.bindReceiver(IMPL_TOKEN, dmh, receiver); if (bmh == null) - throw newNoAccessException(method, this); + throw newNoAccessException(method, lookupClass()); return bmh; } @@ -364,29 +527,37 @@ public class MethodHandles { * @exception NoAccessException if access checking fails */ public MethodHandle unreflect(Method m) throws NoAccessException { - return unreflectImpl(new MemberName(m), m.isAccessible(), true, false, this); + MemberName method = new MemberName(m); + assert(method.isMethod()); + if (!m.isAccessible()) checkMethod(method.getDeclaringClass(), method, method.isStatic()); + MethodHandle mh = MethodHandleImpl.findMethod(IMPL_TOKEN, method, true, lookupClassOrNull()); + if (!m.isAccessible()) mh = restrictProtectedReceiver(method, mh); + return mh; } /** * PROVISIONAL API, WORK IN PROGRESS: * Produce a method handle for a reflected method. * It will bypass checks for overriding methods on the receiver, - * as if by the {@code invokespecial} instruction. + * as if by a {@code invokespecial} instruction from within the {@code specialCaller}. * The type of the method handle will be that of the method, - * with the receiver type prepended. + * with the special caller type prepended (and not the receiver of the method). * If the method's {@code accessible} flag is not set, * access checking is performed immediately on behalf of the lookup class, * as if {@code invokespecial} instruction were being linked. * @param m the reflected method + * @param specialCaller the class nominally calling the method * @return a method handle which can invoke the reflected method * @exception NoAccessException if access checking fails */ public MethodHandle unreflectSpecial(Method m, Class specialCaller) throws NoAccessException { - checkSpecialCaller(specialCaller, this); - Lookup slookup = this.in(specialCaller); - MemberName mname = new MemberName(m); - checkStatic(false, mname, this); - return unreflectImpl(mname, m.isAccessible(), false, false, slookup); + checkSpecialCaller(specialCaller); + MemberName method = new MemberName(m); + assert(method.isMethod()); + // ignore m.isAccessible: this is a new kind of access + checkMethod(m.getDeclaringClass(), method, false); + MethodHandle mh = MethodHandleImpl.findMethod(IMPL_TOKEN, method, false, lookupClassOrNull()); + return restrictReceiver(method, mh, specialCaller); } /** @@ -400,13 +571,16 @@ public class MethodHandles { *

* If the constructor's {@code accessible} flag is not set, * access checking is performed immediately on behalf of the lookup class. - * @param ctor the reflected constructor + * @param c the reflected constructor * @return a method handle which can invoke the reflected constructor * @exception NoAccessException if access checking fails */ - public MethodHandle unreflectConstructor(Constructor ctor) throws NoAccessException { - MemberName m = new MemberName(ctor); - return unreflectImpl(m, ctor.isAccessible(), false, false, this); + public MethodHandle unreflectConstructor(Constructor c) throws NoAccessException { + MemberName ctor = new MemberName(c); + assert(ctor.isConstructor()); + if (!c.isAccessible()) checkAccess(c.getDeclaringClass(), ctor); + MethodHandle rawCtor = MethodHandleImpl.findMethod(IMPL_TOKEN, ctor, false, lookupClassOrNull()); + return MethodHandleImpl.makeAllocator(IMPL_TOKEN, rawCtor); } /** @@ -424,8 +598,7 @@ public class MethodHandles { * @exception NoAccessException if access checking fails */ public MethodHandle unreflectGetter(Field f) throws NoAccessException { - MemberName m = new MemberName(f); - return unreflectImpl(m, f.isAccessible(), false, false, this); + return makeAccessor(f.getDeclaringClass(), new MemberName(f), f.isAccessible(), false); } /** @@ -443,75 +616,134 @@ public class MethodHandles { * @exception NoAccessException if access checking fails */ public MethodHandle unreflectSetter(Field f) throws NoAccessException { - MemberName m = new MemberName(f); - return unreflectImpl(m, f.isAccessible(), false, true, this); + return makeAccessor(f.getDeclaringClass(), new MemberName(f), f.isAccessible(), true); } - } + /// Helper methods, all package-private. - static /*must not be public*/ - MethodHandle findStaticFrom(Lookup lookup, - Class defc, String name, MethodType type) throws NoAccessException { - MemberName method = IMPL_NAMES.resolveOrFail(new MemberName(defc, name, type, Modifier.STATIC), true, lookup.lookupClass()); - VerifyAccess.checkName(method, lookup); - checkStatic(true, method, lookup); - return MethodHandleImpl.findMethod(IMPL_TOKEN, method, false, lookup.lookupClass()); - } + MemberName resolveOrFail(Class refc, String name, Class type, boolean isStatic) { + checkSymbolicClass(refc); // do this before attempting to resolve + int mods = (isStatic ? Modifier.STATIC : 0); + return IMPL_NAMES.resolveOrFail(new MemberName(refc, name, type, mods), true, lookupClassOrNull()); + } - static void checkStatic(boolean wantStatic, MemberName m, Lookup lookup) { - if (wantStatic != m.isStatic()) { - String message = wantStatic ? "expected a static method" : "expected a non-static method"; - throw newNoAccessException(message, m, lookup.lookupClass()); + MemberName resolveOrFail(Class refc, String name, MethodType type, boolean isStatic) { + checkSymbolicClass(refc); // do this before attempting to resolve + int mods = (isStatic ? Modifier.STATIC : 0); + return IMPL_NAMES.resolveOrFail(new MemberName(refc, name, type, mods), true, lookupClassOrNull()); } - } - static void checkSpecialCaller(Class specialCaller, Lookup lookup) { - if (lookup == Lookup.IMPL_LOOKUP) - return; // privileged action - assert(lookup.lookupClass() != null); - if (!VerifyAccess.isSamePackageMember(specialCaller, lookup.lookupClass())) - throw newNoAccessException("no private access", new MemberName(specialCaller), lookup.lookupClass()); - } + MemberName resolveOrFail(Class refc, String name, MethodType type, boolean isStatic, + boolean searchSupers, Class specialCaller) { + checkSymbolicClass(refc); // do this before attempting to resolve + int mods = (isStatic ? Modifier.STATIC : 0); + return IMPL_NAMES.resolveOrFail(new MemberName(refc, name, type, mods), searchSupers, specialCaller); + } - // Helper for creating handles on reflected methods and constructors. - static MethodHandle unreflectImpl(MemberName m, boolean isAccessible, - boolean doDispatch, boolean isSetter, Lookup lookup) { - MethodType narrowMethodType = null; - Class defc = m.getDeclaringClass(); - boolean isSpecialInvoke = m.isInvocable() && !doDispatch; - int mods = m.getModifiers(); - if (m.isStatic()) { - if (!isAccessible && - VerifyAccess.isAccessible(defc, mods, lookup.lookupClass(), false) == null) - throw newNoAccessException(m, lookup); - } else { - Class constraint; - if (isAccessible) { - // abbreviated access check for "unlocked" method - constraint = doDispatch ? defc : lookup.lookupClass(); - } else { - constraint = VerifyAccess.isAccessible(defc, mods, lookup.lookupClass(), isSpecialInvoke); - } - if (constraint == null) { - throw newNoAccessException(m, lookup); - } - if (constraint != defc && !constraint.isAssignableFrom(defc)) { - if (!defc.isAssignableFrom(constraint)) - throw newNoAccessException("receiver must be in caller class", m, lookup.lookupClass()); - if (m.isInvocable()) - narrowMethodType = m.getInvocationType().changeParameterType(0, constraint); - else if (m.isField()) - narrowMethodType = (!isSetter - ? MethodType.methodType(m.getFieldType(), constraint) - : MethodType.methodType(void.class, constraint, m.getFieldType())); + void checkSymbolicClass(Class refc) { + Class caller = lookupClassOrNull(); + if (caller != null && !VerifyAccess.isClassAccessible(refc, caller)) + throw newNoAccessException("symbolic reference class is not public", new MemberName(refc), caller); + } + + void checkMethod(Class refc, MemberName m, boolean wantStatic) { + String message; + if (m.isConstructor()) + message = "expected a method, not a constructor"; + else if (!m.isMethod()) + message = "expected a method"; + else if (wantStatic != m.isStatic()) + message = wantStatic ? "expected a static method" : "expected a non-static method"; + else + { checkAccess(refc, m); return; } + throw newNoAccessException(message, m, lookupClass()); + } + + void checkAccess(Class refc, MemberName m) { + int allowedModes = this.allowedModes; + if (allowedModes == TRUSTED) return; + int mods = m.getModifiers(); + if (Modifier.isPublic(mods) && Modifier.isPublic(refc.getModifiers())) + return; // common case + int requestedModes = fixmods(mods); // adjust 0 => PACKAGE + if ((requestedModes & allowedModes) != 0 + && VerifyAccess.isMemberAccessible(refc, m.getDeclaringClass(), + mods, lookupClass())) + return; + if (((requestedModes & ~allowedModes) & PROTECTED) != 0 + && VerifyAccess.isSamePackage(m.getDeclaringClass(), lookupClass())) + // Protected members can also be checked as if they were package-private. + return; + throw newNoAccessException(accessFailedMessage(refc, m), m, lookupClass()); + } + + String accessFailedMessage(Class refc, MemberName m) { + Class defc = m.getDeclaringClass(); + int mods = m.getModifiers(); + if (!VerifyAccess.isClassAccessible(defc, lookupClass())) + return "class is not public"; + if (refc != defc && !VerifyAccess.isClassAccessible(refc, lookupClass())) + return "symbolic reference "+refc.getName()+" is not public"; + if (Modifier.isPublic(mods)) + return "access to public member failed"; // (how?) + else if (allowedModes == PUBLIC) + return "member is not public"; + if (Modifier.isPrivate(mods)) + return "member is private"; + if (Modifier.isProtected(mods)) + return "member is protected"; + return "member is private to package"; + } + + void checkSpecialCaller(Class specialCaller) { + if (allowedModes == TRUSTED) return; + if (!VerifyAccess.isSamePackageMember(specialCaller, lookupClass())) + throw newNoAccessException("no private access for invokespecial", + new MemberName(specialCaller), lookupClass()); + } + + MethodHandle restrictProtectedReceiver(MemberName method, MethodHandle mh) { + // The accessing class only has the right to use a protected member + // on itself or a subclass. Enforce that restriction, from JVMS 5.4.4, etc. + if (!method.isProtected() || method.isStatic() + || allowedModes == TRUSTED + || VerifyAccess.isSamePackageMember(method.getDeclaringClass(), lookupClass())) + return mh; + else + return restrictReceiver(method, mh, lookupClass()); + } + MethodHandle restrictReceiver(MemberName method, MethodHandle mh, Class caller) { + assert(!method.isStatic()); + Class defc = method.getDeclaringClass(); // receiver type of mh is too wide + if (defc.isInterface() || !defc.isAssignableFrom(caller)) { + throw newNoAccessException("caller class must be a subclass below the method", method, caller); } + MethodType rawType = mh.type(); + if (rawType.parameterType(0) == caller) return mh; + MethodType narrowType = rawType.changeParameterType(0, caller); + return MethodHandleImpl.convertArguments(IMPL_TOKEN, mh, narrowType, rawType, null); + } + + MethodHandle makeAccessor(Class refc, String name, Class type, + boolean isStatic, boolean isSetter) throws NoAccessException { + MemberName field = resolveOrFail(refc, name, type, isStatic); + if (isStatic != field.isStatic()) + throw newNoAccessException(isStatic + ? "expected a static field" + : "expected a non-static field", + field, lookupClass()); + return makeAccessor(refc, field, false, isSetter); + } + + MethodHandle makeAccessor(Class refc, MemberName field, + boolean trusted, boolean isSetter) throws NoAccessException { + assert(field.isField()); + if (trusted) + return MethodHandleImpl.accessField(IMPL_TOKEN, field, isSetter, lookupClassOrNull()); + checkAccess(refc, field); + MethodHandle mh = MethodHandleImpl.accessField(IMPL_TOKEN, field, isSetter, lookupClassOrNull()); + return restrictProtectedReceiver(field, mh); } - if (m.isInvocable()) - return MethodHandleImpl.findMethod(IMPL_TOKEN, m, doDispatch, lookup.lookupClass()); - else if (m.isField()) - return MethodHandleImpl.accessField(IMPL_TOKEN, m, isSetter, lookup.lookupClass()); - else - throw new InternalError(); } /** @@ -667,10 +899,15 @@ public class MethodHandles { */ public static MethodHandle dynamicInvoker(CallSite site) { - MethodHandle getTarget = MethodHandleImpl.bindReceiver(IMPL_TOKEN, CallSite.GET_TARGET, site); + MethodHandle getCSTarget = GET_TARGET; + if (getCSTarget == null) + GET_TARGET = getCSTarget = Lookup.IMPL_LOOKUP. + findVirtual(CallSite.class, "getTarget", MethodType.methodType(MethodHandle.class)); + MethodHandle getTarget = MethodHandleImpl.bindReceiver(IMPL_TOKEN, getCSTarget, site); MethodHandle invoker = exactInvoker(site.type()); return foldArguments(invoker, getTarget); } + private static MethodHandle GET_TARGET = null; // link this lazily, not eagerly static Invokers invokers(MethodType type) { return MethodTypeImpl.invokers(IMPL_TOKEN, type); @@ -1025,15 +1262,15 @@ public class MethodHandles { *

      *   MethodHandle cat = MethodHandles.lookup().
      *     findVirtual(String.class, "concat", String.class, String.class);
-     *   System.out.println(cat.<String>invoke("x", "y")); // xy
+     *   System.out.println(cat.<String>invokeExact("x", "y")); // xy
      *   MethodHandle d0 = dropArguments(cat, 0, String.class);
-     *   System.out.println(d0.<String>invoke("x", "y", "z")); // xy
+     *   System.out.println(d0.<String>invokeExact("x", "y", "z")); // xy
      *   MethodHandle d1 = dropArguments(cat, 1, String.class);
-     *   System.out.println(d1.<String>invoke("x", "y", "z")); // xz
+     *   System.out.println(d1.<String>invokeExact("x", "y", "z")); // xz
      *   MethodHandle d2 = dropArguments(cat, 2, String.class);
-     *   System.out.println(d2.<String>invoke("x", "y", "z")); // yz
+     *   System.out.println(d2.<String>invokeExact("x", "y", "z")); // yz
      *   MethodHandle d12 = dropArguments(cat, 1, String.class, String.class);
-     *   System.out.println(d12.<String>invoke("w", "x", "y", "z")); // wz
+     *   System.out.println(d12.<String>invokeExact("w", "x", "y", "z")); // wz
      * 
* @param target the method handle to invoke after the argument is dropped * @param valueTypes the type(s) of the argument to drop @@ -1254,7 +1491,7 @@ public class MethodHandles { MethodHandle dispatch = compose(choose, test); // dispatch = \(a...).(test(a...) ? target : fallback) return combineArguments(invoke, dispatch, 0); - // return \(a...).((test(a...) ? target : fallback).invoke(a...)) + // return \(a...).((test(a...) ? target : fallback).invokeExact(a...)) } */ return MethodHandleImpl.makeGuardWithTest(IMPL_TOKEN, test, target, fallback); } @@ -1325,22 +1562,4 @@ public class MethodHandles { MethodHandle throwException(Class returnType, Class exType) { return MethodHandleImpl.throwException(IMPL_TOKEN, MethodType.methodType(returnType, exType)); } - - /** Alias for {@link MethodType#methodType}. */ - @Deprecated // "use MethodType.methodType instead" - public static MethodType methodType(Class rtype) { - return MethodType.methodType(rtype); - } - - /** Alias for {@link MethodType#methodType}. */ - @Deprecated // "use MethodType.methodType instead" - public static MethodType methodType(Class rtype, Class ptype) { - return MethodType.methodType(rtype, ptype); - } - - /** Alias for {@link MethodType#methodType}. */ - @Deprecated // "use MethodType.methodType instead" - public static MethodType methodType(Class rtype, Class ptype0, Class... ptypes) { - return MethodType.methodType(rtype, ptype0, ptypes); - } } diff --git a/src/share/classes/java/dyn/MethodType.java b/src/share/classes/java/dyn/MethodType.java index f50ea446199252dc646521a9d65f8f6cb4eeca47..c9001bd25a63c5c702d0e49b0116900cef156377 100644 --- a/src/share/classes/java/dyn/MethodType.java +++ b/src/share/classes/java/dyn/MethodType.java @@ -36,15 +36,24 @@ import sun.dyn.util.BytecodeDescriptor; import static sun.dyn.MemberName.newIllegalArgumentException; /** - * Run-time token used to match call sites with method handles. + * A method type represents the arguments and return type accepted and + * returned by a method handle, or the arguments and return type passed + * and expected by a method handle caller. Method types must be properly + * matched between a method handle and all its callers, + * and the JVM's operations enforce this matching at all times. + *

* The structure is a return type accompanied by any number of parameter types. * The types (primitive, void, and reference) are represented by Class objects. + *

* All instances of MethodType are immutable. * Two instances are completely interchangeable if they compare equal. - * Equality depends exactly on the return and parameter types. + * Equality depends on pairwise correspondence of the return and parameter types and on nothing else. *

- * This type can be created only by factory methods, which manage interning. - * + * This type can be created only by factory methods. + * All factory methods may cache values, though caching is not guaranteed. + *

+ * Note: Like classes and strings, method types can be represented directly + * as constants to be loaded by {@code ldc} bytecodes. * @author John Rose, JSR 292 EG */ public final @@ -109,7 +118,7 @@ class MethodType { /** Find or create an instance of the given method type. * @param rtype the return type * @param ptypes the parameter types - * @return the interned method type with the given parts + * @return a method type with the given parts * @throws NullPointerException if rtype or any ptype is null * @throws IllegalArgumentException if any of the ptypes is void */ @@ -626,7 +635,7 @@ class MethodType { } /** Convenience method for {@link #methodType(java.lang.Class, java.lang.Class[])}. - * Find or create an instance (interned) of the given method type. + * Find or create an instance of the given method type. * Any class or interface name embedded in the signature string * will be resolved by calling {@link ClassLoader#loadClass(java.lang.String)} * on the given loader (or if it is null, on the system class loader). diff --git a/src/share/classes/java/dyn/NoAccessException.java b/src/share/classes/java/dyn/NoAccessException.java index 8547a5d777fc6cadb6294f81dac14080b12a09a3..5e76f6a4aae574218ce9ec6e08afaaa73c62e9b4 100644 --- a/src/share/classes/java/dyn/NoAccessException.java +++ b/src/share/classes/java/dyn/NoAccessException.java @@ -27,11 +27,12 @@ package java.dyn; /** * Thrown to indicate that a caller has attempted to create a method handle - * which calls a method to which the caller does not have access. + * which accesses a field, method, or class to which the caller does not have access. * This unchecked exception is analogous to {@link IllegalAccessException}, * which is a checked exception thrown when reflective invocation fails * because of an access check. With method handles, this same access - * checking is performed on behalf of the method handle creator, + * checking is performed by the {@link MethodHandles.Lookup lookup object} + * on behalf of the method handle creator, * at the time of creation. * @author John Rose, JSR 292 EG */ diff --git a/src/share/classes/java/dyn/package-info.java b/src/share/classes/java/dyn/package-info.java index a1ed722ff9d007885d5481c058d0340a7b9b9a12..7a285b75d22be3dfe78d5914da85aa6246cfbcca 100644 --- a/src/share/classes/java/dyn/package-info.java +++ b/src/share/classes/java/dyn/package-info.java @@ -27,6 +27,105 @@ * PROVISIONAL API, WORK IN PROGRESS: * This package contains dynamic language support provided directly by * the Java core class libraries and virtual machine. + *

+ * Certain types in this package have special relations to dynamic + * language support in the virtual machine: + *

    + *
  • In source code, a call to + * {@link java.dyn.MethodHandle#invokeExact MethodHandle.invokeExact} or + * {@link java.dyn.MethodHandle#invokeGeneric MethodHandle.invokeGeneric} + * will compile and link, regardless of the requested type signature. + * As usual, the Java compiler emits an {@code invokevirtual} + * instruction with the given signature against the named method. + * The JVM links any such call (regardless of signature) to a dynamically + * typed method handle invocation. In the case of {@code invokeGeneric}, + * argument and return value conversions are applied. + * + *
  • In source code, the class {@link java.dyn.InvokeDynamic} appears to accept + * any static method invocation, of any name and any signature. + * But instead of emitting + * an {@code invokestatic} instruction for such a call, the Java compiler emits + * an {@code invokedynamic} instruction with the given name and signature. + * + *
  • When the JVM links an {@code invokedynamic} instruction, it calls the + * {@linkplain java.dyn.Linkage#registerBootstrapMethod(Class, MethodHandle) bootstrap method} + * of the containing class to obtain a {@linkplain java.dyn.CallSite call site} object through which + * the call site will link its target {@linkplain java.dyn.MethodHandle method handle}. + * + *
  • The JVM bytecode format supports immediate constants of + * the classes {@link java.dyn.MethodHandle} and {@link java.dyn.MethodType}. + *
+ * + *

Corresponding JVM bytecode format changes

+ * The following low-level information is presented here as a preview of + * changes being made to the Java Virtual Machine specification for JSR 292. + * + *

{@code invokedynamic} instruction format

+ * In bytecode, an {@code invokedynamic} instruction is formatted as five bytes. + * The first byte is the opcode 186 (hexadecimal {@code BA}). + * The next two bytes are a constant pool index (in the same format as for the other {@code invoke} instructions). + * The final two bytes are reserved for future use and required to be zero. + * The constant pool reference is to a entry with tag {@code CONSTANT_NameAndType} + * (decimal 12). It is thus not a method reference of any sort, but merely + * the method name, argument types, and return type of the dynamic call site. + * (TBD: The EG is discussing the possibility of a special constant pool entry type, + * so that other information may be added, such as a per-instruction bootstrap + * method and/or annotations.) + * + *

constant pool entries for {@code MethodType}s

+ * If a constant pool entry has the tag {@code CONSTANT_MethodType} (decimal 16), + * it must contain exactly two more bytes, which are an index to a {@code CONSTANT_Utf8} + * entry which represents a method type signature. The JVM will ensure that on first + * execution of an {@code ldc} instruction for this entry, a {@link java.dyn.MethodType} + * will be created which represents the signature. + * Any classes mentioned in the {@code MethodType} will be loaded if necessary, + * but not initialized. + * Access checking and error reporting is performed exactly as it is for + * references by {@code ldc} instructions to {@code CONSTANT_Class} constants. + * + *

constant pool entries for {@code MethodHandle}s

+ * If a constant pool entry has the tag {@code CONSTANT_MethodHandle} (decimal 15), + * it must contain exactly three more bytes. The first byte after the tag is a subtag + * value in the range 1 through 9, and the last two are an index to a + * {@code CONSTANT_Fieldref}, {@code CONSTANT_Methodref}, or + * {@code CONSTANT_InterfaceMethodref} entry which represents a field or method + * for which a method handle is to be created. + * The JVM will ensure that on first execution of an {@code ldc} instruction + * for this entry, a {@link java.dyn.MethodHandle} will be created which represents + * the field or method reference, according to the specific mode implied by the subtag. + *

+ * As with {@code CONSTANT_Class} and {@code CONSTANT_MethodType} constants, + * the {@code Class} or {@code MethodType} object which reifies the field or method's + * type is created. Any classes mentioned in this reificaiton will be loaded if necessary, + * but not initialized, and access checking and error reporting performed as usual. + *

+ * The method handle itself will have a type and behavior determined by the subtag as follows: + * + * + * + * + * + * + * + * + * + * + * + * + *
Nsubtag namememberMH typeMH behavior
1REF_getFieldC.f:T(C)Tgetfield C.f:T
2REF_getStaticC.f:T( )Tgetstatic C.f:T
3REF_putFieldC.f:T(C,T)voidputfield C.f:T
4REF_putStaticC.f:T(T)voidputstatic C.f:T
5REF_invokeVirtualC.m(A*)T(C,A*)Tinvokevirtual C.m(A*)T
6REF_invokeStaticC.m(A*)T(C,A*)Tinvokestatic C.m(A*)T
7REF_invokeSpecialC.m(A*)T(C,A*)Tinvokespecial C.m(A*)T
8REF_newInvokeSpecialC.<init>(A*)void(A*)Cnew C; dup; invokespecial C.<init>(A*)void
9REF_invokeInterfaceC.m(A*)T(C,A*)Tinvokeinterface C.m(A*)T
+ *
+ *

+ * The special names {@code } and {@code } are not allowed except for subtag 8 as shown. + *

+ * The verifier applies the same access checks and restrictions for these references as for the hypothetical + * bytecode instructions specified in the last column of the table. In particular, method handles to + * private and protected members can be created in exactly those classes for which the corresponding + * normal accesses are legal. + *

+ * None of these constant types force class initialization. + * Method handles for subtags {@code REF_getStatic}, {@code REF_putStatic}, and {@code REF_invokeStatic} + * may force class initialization on their first invocation, just like the corresponding bytecodes. + * * @author John Rose, JSR 292 EG */ diff --git a/src/share/classes/java/lang/AssertionError.java b/src/share/classes/java/lang/AssertionError.java index 75e8cd8f02d8036535331ddfbe2c032bc02e7db1..8fb577a6e32191c4df7f57f575d3fc744828b4b5 100644 --- a/src/share/classes/java/lang/AssertionError.java +++ b/src/share/classes/java/lang/AssertionError.java @@ -66,7 +66,7 @@ public class AssertionError extends Error { * defined in The Java Language Specification, Second * Edition, Section 15.18.1.1. *

- * If the specified object is an instance of Throwable, it + * If the specified object is an instance of {@code Throwable}, it * becomes the cause of the newly constructed assertion error. * * @param detailMessage value to be used in constructing detail message @@ -149,4 +149,21 @@ public class AssertionError extends Error { public AssertionError(double detailMessage) { this("" + detailMessage); } + + /** + * Constructs a new {@code AssertionError} with the specified + * detail message and cause. + * + *

Note that the detail message associated with + * {@code cause} is not automatically incorporated in + * this error's detail message. + * + * @param message the detail message, may be {@code null} + * @param cause the cause, may be {@code null} + * + * @since 1.7 + */ + public AssertionError(String message, Throwable cause) { + super(message, cause); + } } diff --git a/src/share/classes/java/lang/Math.java b/src/share/classes/java/lang/Math.java index 7ce31265d6066f1197cc181b8a2524d781d81a38..455a21f9a4c09fd0554053389e5250087e9439d9 100644 --- a/src/share/classes/java/lang/Math.java +++ b/src/share/classes/java/lang/Math.java @@ -681,9 +681,9 @@ public final class Math { private static Random randomNumberGenerator; - private static synchronized void initRNG() { - if (randomNumberGenerator == null) - randomNumberGenerator = new Random(); + private static synchronized Random initRNG() { + Random rnd = randomNumberGenerator; + return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd; } /** @@ -694,9 +694,11 @@ public final class Math { * *

When this method is first called, it creates a single new * pseudorandom-number generator, exactly as if by the expression - *

{@code new java.util.Random}
This - * new pseudorandom-number generator is used thereafter for all - * calls to this method and is used nowhere else. + * + *
{@code new java.util.Random()}
+ * + * This new pseudorandom-number generator is used thereafter for + * all calls to this method and is used nowhere else. * *

This method is properly synchronized to allow correct use by * more than one thread. However, if many threads need to generate @@ -705,11 +707,12 @@ public final class Math { * * @return a pseudorandom {@code double} greater than or equal * to {@code 0.0} and less than {@code 1.0}. - * @see java.util.Random#nextDouble() + * @see Random#nextDouble() */ public static double random() { - if (randomNumberGenerator == null) initRNG(); - return randomNumberGenerator.nextDouble(); + Random rnd = randomNumberGenerator; + if (rnd == null) rnd = initRNG(); + return rnd.nextDouble(); } /** diff --git a/src/share/classes/java/lang/ProcessBuilder.java b/src/share/classes/java/lang/ProcessBuilder.java index 82fad4a2b42b2f9ca9c45a55ee2ffa9ec3c6922b..97ce45cdf658eccb2d0e29119d4c82c98cae0c40 100644 --- a/src/share/classes/java/lang/ProcessBuilder.java +++ b/src/share/classes/java/lang/ProcessBuilder.java @@ -418,6 +418,8 @@ public final class ProcessBuilder * Implements a null input stream. */ static class NullInputStream extends InputStream { + static final NullInputStream INSTANCE = new NullInputStream(); + private NullInputStream() {} public int read() { return -1; } public int available() { return 0; } } @@ -426,6 +428,8 @@ public final class ProcessBuilder * Implements a null output stream. */ static class NullOutputStream extends OutputStream { + static final NullOutputStream INSTANCE = new NullOutputStream(); + private NullOutputStream() {} public void write(int b) throws IOException { throw new IOException("Stream closed"); } diff --git a/src/share/classes/java/lang/StrictMath.java b/src/share/classes/java/lang/StrictMath.java index f2f275b5ca78f4446f1c8fd50b91bf1a76df67e8..916b82ff9d043e30076d0063fe783d7d68d6f3e4 100644 --- a/src/share/classes/java/lang/StrictMath.java +++ b/src/share/classes/java/lang/StrictMath.java @@ -667,9 +667,9 @@ public final class StrictMath { private static Random randomNumberGenerator; - private static synchronized void initRNG() { - if (randomNumberGenerator == null) - randomNumberGenerator = new Random(); + private static synchronized Random initRNG() { + Random rnd = randomNumberGenerator; + return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd; } /** @@ -680,9 +680,11 @@ public final class StrictMath { * *

When this method is first called, it creates a single new * pseudorandom-number generator, exactly as if by the expression - *

{@code new java.util.Random}
This - * new pseudorandom-number generator is used thereafter for all - * calls to this method and is used nowhere else. + * + *
{@code new java.util.Random()}
+ * + * This new pseudorandom-number generator is used thereafter for + * all calls to this method and is used nowhere else. * *

This method is properly synchronized to allow correct use by * more than one thread. However, if many threads need to generate @@ -691,11 +693,12 @@ public final class StrictMath { * * @return a pseudorandom {@code double} greater than or equal * to {@code 0.0} and less than {@code 1.0}. - * @see java.util.Random#nextDouble() + * @see Random#nextDouble() */ public static double random() { - if (randomNumberGenerator == null) initRNG(); - return randomNumberGenerator.nextDouble(); + Random rnd = randomNumberGenerator; + if (rnd == null) rnd = initRNG(); + return rnd.nextDouble(); } /** diff --git a/src/share/classes/java/security/Security.java b/src/share/classes/java/security/Security.java index 4aea17e38630cbfd533a41ce7b49e5a37567d4b1..81e029b8e968e0c020a4b3f635e23163b714c849 100644 --- a/src/share/classes/java/security/Security.java +++ b/src/share/classes/java/security/Security.java @@ -678,7 +678,7 @@ public final class Security { spiMap.put(type, clazz); return clazz; } catch (ClassNotFoundException e) { - throw (Error)new AssertionError("Spi class not found").initCause(e); + throw new AssertionError("Spi class not found", e); } } diff --git a/src/share/classes/java/util/Collections.java b/src/share/classes/java/util/Collections.java index 8b20182f7450af3fe17f183b6cec9d65d066c3bc..e4329dc0e43d83295acf48d6918aa927aae94af8 100644 --- a/src/share/classes/java/util/Collections.java +++ b/src/share/classes/java/util/Collections.java @@ -463,10 +463,10 @@ public class Collections { * its list-iterator does not support the set operation. */ public static void shuffle(List list) { - if (r == null) { - r = new Random(); - } - shuffle(list, r); + Random rnd = r; + if (rnd == null) + r = rnd = new Random(); + shuffle(list, rnd); } private static Random r; diff --git a/src/share/classes/java/util/concurrent/ThreadLocalRandom.java b/src/share/classes/java/util/concurrent/ThreadLocalRandom.java index ba83c80a779d0babfcac04a022290bb5db278454..c8a67dd651022703ce4bddcf8235fbbbedec4b2f 100644 --- a/src/share/classes/java/util/concurrent/ThreadLocalRandom.java +++ b/src/share/classes/java/util/concurrent/ThreadLocalRandom.java @@ -73,10 +73,10 @@ public class ThreadLocalRandom extends Random { private long rnd; /** - * Initialization flag to permit the first and only allowed call - * to setSeed (inside Random constructor) to succeed. We can't - * allow others since it would cause setting seed in one part of a - * program to unintentionally impact other usages by the thread. + * Initialization flag to permit calls to setSeed to succeed only + * while executing the Random constructor. We can't allow others + * since it would cause setting seed in one part of a program to + * unintentionally impact other usages by the thread. */ boolean initialized; @@ -98,11 +98,10 @@ public class ThreadLocalRandom extends Random { /** * Constructor called only by localRandom.initialValue. - * We rely on the fact that the superclass no-arg constructor - * invokes setSeed exactly once to initialize. */ ThreadLocalRandom() { super(); + initialized = true; } /** @@ -123,7 +122,6 @@ public class ThreadLocalRandom extends Random { public void setSeed(long seed) { if (initialized) throw new UnsupportedOperationException(); - initialized = true; rnd = (seed ^ multiplier) & mask; } diff --git a/src/share/classes/java/util/jar/Pack200.java b/src/share/classes/java/util/jar/Pack200.java index 83a5d2049a8f62a91e450333838e5f1f1f42724f..41dec9180921630c0d97354a3e5fa09289bbf40f 100644 --- a/src/share/classes/java/util/jar/Pack200.java +++ b/src/share/classes/java/util/jar/Pack200.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003,2010, 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 @@ -212,10 +212,18 @@ public abstract class Pack200 { * to produce a specific bytewise image for any given transmission * ordering of archive elements.) *

- * In order to maintain backward compatibility, if the input JAR-files are - * solely comprised of 1.5 (or lesser) classfiles, a 1.5 compatible - * pack file is produced. Otherwise a 1.6 compatible pack200 file is - * produced. + * In order to maintain backward compatibility, the pack file's version is + * set to accommodate the class files present in the input JAR file. In + * other words, the pack file version will be the latest, if the class files + * are the latest and conversely the pack file version will be the oldest + * if the class file versions are also the oldest. For intermediate class + * file versions the corresponding pack file version will be used. + * For example: + * If the input JAR-files are solely comprised of 1.5 (or lesser) + * class files, a 1.5 compatible pack file is produced. This will also be + * the case for archives that have no class files. + * If the input JAR-files contains a 1.6 class file, then the pack file + * version will be set to 1.6. *

* @since 1.5 */ @@ -236,9 +244,10 @@ public abstract class Pack200 { * input file to be transmitted in the segment, along with the size * of its name and other transmitted properties. *

- * The default is 1000000 (a million bytes). This allows input JAR files - * of moderate size to be transmitted in one segment. It also puts - * a limit on memory requirements for packers and unpackers. + * The default is -1, which means the packer will always create a single + * segment output file. In cases where extremely large output files are + * generated, users are strongly encouraged to use segmenting or break + * up the input file into smaller JARs. *

* A 10Mb JAR packed without this limit will * typically pack about 10% smaller, but the packer may require diff --git a/src/share/classes/sun/dyn/AdapterMethodHandle.java b/src/share/classes/sun/dyn/AdapterMethodHandle.java index 3c243de55b1745b1e84cb93570bdec0ff3dea032..fb9b7fa26c26b3e6a056c24df4b22f58e97b4edb 100644 --- a/src/share/classes/sun/dyn/AdapterMethodHandle.java +++ b/src/share/classes/sun/dyn/AdapterMethodHandle.java @@ -366,7 +366,7 @@ public class AdapterMethodHandle extends BoundMethodHandle { } private static boolean convOpSupported(int convOp) { assert(convOp >= 0 && convOp <= CONV_OP_LIMIT); - return ((1< caller, String name, MethodType type, - int callerMID, int callerBCI) { - MethodHandle bsm = Linkage.getBootstrapMethod(caller); - if (bsm == null) - throw new InvokeDynamicBootstrapError("class has no bootstrap method: "+caller); - CallSite site; - try { - site = bsm.invoke(caller, name, type); - } catch (Throwable ex) { - throw new InvokeDynamicBootstrapError("exception thrown while linking", ex); + // this implements the upcall from the JVM, MethodHandleNatives.makeDynamicCallSite: + static CallSite makeSite(MethodHandle bootstrapMethod, + // Callee information: + String name, MethodType type, + // Call-site attributes, if any: + Object info, + // Caller information: + MemberName callerMethod, int callerBCI) { + Class caller = callerMethod.getDeclaringClass(); + if (bootstrapMethod == null) { + // If there is no bootstrap method, throw IncompatibleClassChangeError. + // This is a valid generic error type for resolution (JLS 12.3.3). + throw new IncompatibleClassChangeError + ("Class "+caller.getName()+" has not declared a bootstrap method for invokedynamic"); } - if (site == null) - throw new InvokeDynamicBootstrapError("class bootstrap method failed to create a call site: "+caller); - if (site.type() != type) - throw new InvokeDynamicBootstrapError("call site type not initialized correctly: "+site); - if (site.callerClass() != caller) - throw new InvokeDynamicBootstrapError("call site caller not initialized correctly: "+site); - if ((Object)site.name() != name) - throw new InvokeDynamicBootstrapError("call site name not initialized correctly: "+site); + CallSite site; try { - PRIVATE_INITIALIZE_CALL_SITE.invoke(site, callerMID, callerBCI); + if (bootstrapMethod.type().parameterCount() == 3) + site = bootstrapMethod.invokeExact(caller, name, type); + else if (bootstrapMethod.type().parameterCount() == 4) + site = bootstrapMethod.invokeExact(caller, name, type, + !(info instanceof java.lang.annotation.Annotation[]) ? null + : (java.lang.annotation.Annotation[]) info); + else + throw new InternalError("bad BSM: "+bootstrapMethod); + if (!(site instanceof CallSite)) + throw new InvokeDynamicBootstrapError("class bootstrap method failed to create a call site: "+caller); + PRIVATE_INITIALIZE_CALL_SITE.invokeExact(site, + name, type, + callerMethod, callerBCI); + assert(site.getTarget() != null); + assert(site.getTarget().type().equals(type)); } catch (Throwable ex) { - throw new InvokeDynamicBootstrapError("call site initialization exception", ex); + InvokeDynamicBootstrapError bex; + if (ex instanceof InvokeDynamicBootstrapError) + bex = (InvokeDynamicBootstrapError) ex; + else + bex = new InvokeDynamicBootstrapError("call site initialization exception", ex); + throw bex; } return site; } + + // This method is private in CallSite because it touches private fields in CallSite. + // These private fields (vmmethod, vmindex) are specific to the JVM. + private static final MethodHandle PRIVATE_INITIALIZE_CALL_SITE = + MethodHandleImpl.IMPL_LOOKUP.findVirtual(CallSite.class, "initializeFromJVM", + MethodType.methodType(void.class, + String.class, MethodType.class, + MemberName.class, int.class)); + + public static void setCallSiteTarget(Access token, CallSite site, MethodHandle target) { + Access.check(token); + MethodHandleNatives.setCallSiteTarget(site, target); + } } diff --git a/src/share/classes/sun/dyn/FilterGeneric.java b/src/share/classes/sun/dyn/FilterGeneric.java index f75d42cd92cf882366cf1368297675822ba70e20..21540e6647e65b7738031a4fa2dc3d2ad6dc4fcc 100644 --- a/src/share/classes/sun/dyn/FilterGeneric.java +++ b/src/share/classes/sun/dyn/FilterGeneric.java @@ -301,13 +301,13 @@ class FilterGeneric { { super(e, f, t); } protected F1X makeInstance(MethodHandle e, MethodHandle f, MethodHandle t) { return new F1X(e, f, t); } - protected Object invoke_V0(Object a0) { return target.invoke(filter.invoke(a0)); } - protected Object invoke_F0(Object a0) { return target.invoke(filter.invoke(), a0); } - protected Object invoke_F1(Object a0) { return target.invoke(filter.invoke(a0), a0); } - protected Object invoke_C0(Object a0) { return target.invoke(filter.invoke(a0)); } - protected Object invoke_C1(Object a0) { return target.invoke(a0, filter.invoke()); } + protected Object invoke_V0(Object a0) { return target.invokeExact(filter.invokeExact(a0)); } + protected Object invoke_F0(Object a0) { return target.invokeExact(filter.invokeExact(), a0); } + protected Object invoke_F1(Object a0) { return target.invokeExact(filter.invokeExact(a0), a0); } + protected Object invoke_C0(Object a0) { return target.invokeExact(filter.invokeExact(a0)); } + protected Object invoke_C1(Object a0) { return target.invokeExact(a0, filter.invokeExact()); } protected Object invoke_Y0(Object a0) { Object[] av = { a0 }; - filter.invoke(av); return target.invoke(av[0]); } + filter.invokeExact(av); return target.invokeExact(av[0]); } } static class F2X extends Adapter { protected F2X(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -315,16 +315,16 @@ class FilterGeneric { { super(e, f, t); } protected F2X makeInstance(MethodHandle e, MethodHandle f, MethodHandle t) { return new F2X(e, f, t); } - protected Object invoke_V0(Object a0, Object a1) { return target.invoke(filter.invoke(a0), a1); } - protected Object invoke_V1(Object a0, Object a1) { return target.invoke(a0, filter.invoke(a1)); } - protected Object invoke_F0(Object a0, Object a1) { return target.invoke(filter.invoke(), a0, a1); } - protected Object invoke_F1(Object a0, Object a1) { return target.invoke(filter.invoke(a0), a0, a1); } - protected Object invoke_F2(Object a0, Object a1) { return target.invoke(filter.invoke(a0, a1), a0, a1); } - protected Object invoke_C0(Object a0, Object a1) { return target.invoke(filter.invoke(a0, a1)); } - protected Object invoke_C1(Object a0, Object a1) { return target.invoke(a0, filter.invoke(a1)); } - protected Object invoke_C2(Object a0, Object a1) { return target.invoke(a0, a1, filter.invoke()); } + protected Object invoke_V0(Object a0, Object a1) { return target.invokeExact(filter.invokeExact(a0), a1); } + protected Object invoke_V1(Object a0, Object a1) { return target.invokeExact(a0, filter.invokeExact(a1)); } + protected Object invoke_F0(Object a0, Object a1) { return target.invokeExact(filter.invokeExact(), a0, a1); } + protected Object invoke_F1(Object a0, Object a1) { return target.invokeExact(filter.invokeExact(a0), a0, a1); } + protected Object invoke_F2(Object a0, Object a1) { return target.invokeExact(filter.invokeExact(a0, a1), a0, a1); } + protected Object invoke_C0(Object a0, Object a1) { return target.invokeExact(filter.invokeExact(a0, a1)); } + protected Object invoke_C1(Object a0, Object a1) { return target.invokeExact(a0, filter.invokeExact(a1)); } + protected Object invoke_C2(Object a0, Object a1) { return target.invokeExact(a0, a1, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1) { Object[] av = { a0, a1 }; - filter.invoke(av); return target.invoke(av[0], av[1]); } + filter.invokeExact(av); return target.invokeExact(av[0], av[1]); } } // */ @@ -336,13 +336,13 @@ class FilterGeneric { protected F0 makeInstance(MethodHandle e, MethodHandle f, MethodHandle t) { return new F0(e, f, t); } protected Object invoke_F0() throws Throwable { - return target.invoke(filter.invoke()); } + return target.invokeExact(filter.invokeExact()); } protected Object invoke_C0() throws Throwable { - return target.invoke(filter.invoke()); } + return target.invokeExact(filter.invokeExact()); } static final Object[] NO_ARGS = { }; protected Object invoke_Y0() throws Throwable { - filter.invoke(NO_ARGS); // make the flyby - return target.invoke(); } + filter.invokeExact(NO_ARGS); // make the flyby + return target.invokeExact(); } } /* @@ -361,26 +361,26 @@ class genclasses { " return new @cat@(e, f, t); }", " //@each-P@", " protected Object invoke_V@P@(@Tvav@) throws Throwable {", - " return target.invoke(@a0_@@Psp@filter.invoke(a@P@)@_aN@); }", + " return target.invokeExact(@a0_@@Psp@filter.invokeExact(a@P@)@_aN@); }", " //@end-P@", " //@each-P@", " protected Object invoke_F@P@(@Tvav@) throws Throwable {", - " return target.invoke(filter.invoke(@a0@),", + " return target.invokeExact(filter.invokeExact(@a0@),", " @av@); }", " //@end-P@", " protected Object invoke_F@N@(@Tvav@) throws Throwable {", - " return target.invoke(filter.invoke(@av@),", + " return target.invokeExact(filter.invokeExact(@av@),", " @av@); }", " //@each-P@", " protected Object invoke_C@P@(@Tvav@) throws Throwable {", - " return target.invoke(@a0_@filter.invoke(a@P@@_aN@)); }", + " return target.invokeExact(@a0_@filter.invokeExact(a@P@@_aN@)); }", " //@end-P@", " protected Object invoke_C@N@(@Tvav@) throws Throwable {", - " return target.invoke(@av@, filter.invoke()); }", + " return target.invokeExact(@av@, filter.invokeExact()); }", " protected Object invoke_Y0(@Tvav@) throws Throwable {", " Object[] av = { @av@ };", - " filter.invoke(av); // make the flyby", - " return target.invoke(@av[i]@); }", + " filter.invokeExact(av); // make the flyby", + " return target.invokeExact(@av[i]@); }", " }", } }; static final String NEWLINE_INDENT = " //\n "; @@ -509,21 +509,21 @@ class genclasses { protected F1 makeInstance(MethodHandle e, MethodHandle f, MethodHandle t) { return new F1(e, f, t); } protected Object invoke_V0(Object a0) throws Throwable { - return target.invoke(filter.invoke(a0)); } + return target.invokeExact(filter.invokeExact(a0)); } protected Object invoke_F0(Object a0) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0); } protected Object invoke_F1(Object a0) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0); } protected Object invoke_C0(Object a0) throws Throwable { - return target.invoke(filter.invoke(a0)); } + return target.invokeExact(filter.invokeExact(a0)); } protected Object invoke_C1(Object a0) throws Throwable { - return target.invoke(a0, filter.invoke()); } + return target.invokeExact(a0, filter.invokeExact()); } protected Object invoke_Y0(Object a0) throws Throwable { Object[] av = { a0 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0]); } } static class F2 extends Adapter { protected F2(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -532,28 +532,28 @@ class genclasses { protected F2 makeInstance(MethodHandle e, MethodHandle f, MethodHandle t) { return new F2(e, f, t); } protected Object invoke_V0(Object a0, Object a1) throws Throwable { - return target.invoke(filter.invoke(a0), a1); } + return target.invokeExact(filter.invokeExact(a0), a1); } protected Object invoke_V1(Object a0, Object a1) throws Throwable { - return target.invoke(a0, filter.invoke(a1)); } + return target.invokeExact(a0, filter.invokeExact(a1)); } protected Object invoke_F0(Object a0, Object a1) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1); } protected Object invoke_F1(Object a0, Object a1) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1); } protected Object invoke_F2(Object a0, Object a1) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1); } protected Object invoke_C0(Object a0, Object a1) throws Throwable { - return target.invoke(filter.invoke(a0, a1)); } + return target.invokeExact(filter.invokeExact(a0, a1)); } protected Object invoke_C1(Object a0, Object a1) throws Throwable { - return target.invoke(a0, filter.invoke(a1)); } + return target.invokeExact(a0, filter.invokeExact(a1)); } protected Object invoke_C2(Object a0, Object a1) throws Throwable { - return target.invoke(a0, a1, filter.invoke()); } + return target.invokeExact(a0, a1, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1) throws Throwable { Object[] av = { a0, a1 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1]); } } static class F3 extends Adapter { protected F3(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -562,35 +562,35 @@ class genclasses { protected F3 makeInstance(MethodHandle e, MethodHandle f, MethodHandle t) { return new F3(e, f, t); } protected Object invoke_V0(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2); } + return target.invokeExact(filter.invokeExact(a0), a1, a2); } protected Object invoke_V1(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2); } + return target.invokeExact(a0, filter.invokeExact(a1), a2); } protected Object invoke_V2(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2)); } protected Object invoke_F0(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2); } protected Object invoke_F1(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2); } protected Object invoke_F2(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2); } protected Object invoke_F3(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2); } protected Object invoke_C0(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2)); } + return target.invokeExact(filter.invokeExact(a0, a1, a2)); } protected Object invoke_C1(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2)); } + return target.invokeExact(a0, filter.invokeExact(a1, a2)); } protected Object invoke_C2(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2)); } protected Object invoke_C3(Object a0, Object a1, Object a2) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke()); } + return target.invokeExact(a0, a1, a2, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2) throws Throwable { Object[] av = { a0, a1, a2 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2]); } } static class F4 extends Adapter { protected F4(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -599,42 +599,42 @@ class genclasses { protected F4 makeInstance(MethodHandle e, MethodHandle f, MethodHandle t) { return new F4(e, f, t); } protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3); } + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3); } + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3); } + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3)); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3)); } + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3)); } + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3)); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3) throws Throwable { Object[] av = { a0, a1, a2, a3 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3]); } } static class F5 extends Adapter { protected F5(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -644,66 +644,66 @@ class genclasses { return new F5(e, f, t); } protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4); } + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4); } + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4); } + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4)); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4)); } + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4)); } + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4)); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4)); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { Object[] av = { a0, a1, a2, a3, a4 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4]); } } static class F6 extends Adapter { protected F6(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -713,76 +713,76 @@ class genclasses { return new F6(e, f, t); } protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5); } + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5); } + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5); } + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5)); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5)); } + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5)); } + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5)); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5)); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5)); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5]); } } static class F7 extends Adapter { protected F7(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -792,86 +792,86 @@ class genclasses { return new F7(e, f, t); } protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6); } + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6); } + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6); } + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6)); } + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6)); } + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6)); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6)); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6)); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6]); } } static class F8 extends Adapter { protected F8(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -881,96 +881,96 @@ class genclasses { return new F8(e, f, t); } protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7); } + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7); } + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7); } + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7)); } + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7)); } + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7)); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7)); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7)); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7]); } } static class F9 extends Adapter { protected F9(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -981,135 +981,135 @@ class genclasses { protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8); } + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8); } + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8); } + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8)); } + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8)); } + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8)); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8)); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8)); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8]); } } static class F10 extends Adapter { protected F10(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -1120,148 +1120,148 @@ class genclasses { protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9); } + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9); } + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9); } + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9)); } + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9)); } + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9)); } + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9)); } + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9)); } + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9]); } } static class F11 extends Adapter { protected F11(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -1272,182 +1272,182 @@ class genclasses { protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10]); } } static class F12 extends Adapter { protected F12(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -1458,198 +1458,198 @@ class genclasses { protected Object invoke_V0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11]); } } static class F13 extends Adapter { protected F13(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -1661,255 +1661,255 @@ class genclasses { Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11, a12); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11, a12); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11, a12); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11, a12); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11, a12); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11, a12); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11), a12); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11), a12); } protected Object invoke_V12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_F13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11, a12)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11, a12)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11, a12)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11, a12)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11, a12)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11, a12)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11, a12)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11, a12)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11, a12)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11, a12)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12)); } protected Object invoke_C13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12]); } } static class F14 extends Adapter { protected F14(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -1921,274 +1921,274 @@ class genclasses { Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11, a12, a13); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11, a12, a13); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11, a12, a13); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11, a12, a13); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11, a12, a13); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11), a12, a13); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11), a12, a13); } protected Object invoke_V12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12), a13); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12), a13); } protected Object invoke_V13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_F14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11, a12, a13)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11, a12, a13)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11, a12, a13)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11, a12, a13)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11, a12, a13)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11, a12, a13)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11, a12, a13)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11, a12, a13)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11, a12, a13)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12, a13)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12, a13)); } protected Object invoke_C13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13)); } protected Object invoke_C14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13]); } } static class F15 extends Adapter { protected F15(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -2200,293 +2200,293 @@ class genclasses { Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11, a12, a13, a14); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11, a12, a13, a14); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11, a12, a13, a14); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11, a12, a13, a14); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11), a12, a13, a14); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11), a12, a13, a14); } protected Object invoke_V12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12), a13, a14); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12), a13, a14); } protected Object invoke_V13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13), a14); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13), a14); } protected Object invoke_V14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_F15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11, a12, a13, a14)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11, a12, a13, a14)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11, a12, a13, a14)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11, a12, a13, a14)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11, a12, a13, a14)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11, a12, a13, a14)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12, a13, a14)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12, a13, a14)); } protected Object invoke_C13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13, a14)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13, a14)); } protected Object invoke_C14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14)); } protected Object invoke_C15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14]); } } static class F16 extends Adapter { protected F16(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -2498,312 +2498,312 @@ class genclasses { Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11, a12, a13, a14, a15); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11, a12, a13, a14, a15); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11, a12, a13, a14, a15); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11), a12, a13, a14, a15); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11), a12, a13, a14, a15); } protected Object invoke_V12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12), a13, a14, a15); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12), a13, a14, a15); } protected Object invoke_V13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13), a14, a15); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13), a14, a15); } protected Object invoke_V14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14), a15); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14), a15); } protected Object invoke_V15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_F16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11, a12, a13, a14, a15)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11, a12, a13, a14, a15)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11, a12, a13, a14, a15)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11, a12, a13, a14, a15)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11, a12, a13, a14, a15)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12, a13, a14, a15)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12, a13, a14, a15)); } protected Object invoke_C13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13, a14, a15)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13, a14, a15)); } protected Object invoke_C14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14, a15)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14, a15)); } protected Object invoke_C15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15)); } protected Object invoke_C16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15]); } } static class F17 extends Adapter { protected F17(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -2816,203 +2816,203 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11, a12, a13, a14, a15, a16); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11, a12, a13, a14, a15, a16); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11), a12, a13, a14, a15, a16); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11), a12, a13, a14, a15, a16); } protected Object invoke_V12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12), a13, a14, a15, a16); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12), a13, a14, a15, a16); } protected Object invoke_V13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13), a14, a15, a16); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13), a14, a15, a16); } protected Object invoke_V14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14), a15, a16); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14), a15, a16); } protected Object invoke_V15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15), a16); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15), a16); } protected Object invoke_V16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, filter.invoke(a16)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, filter.invokeExact(a16)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, @@ -3020,7 +3020,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F13(Object a0, Object a1, Object a2, Object a3, @@ -3028,7 +3028,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F14(Object a0, Object a1, Object a2, Object a3, @@ -3036,7 +3036,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F15(Object a0, Object a1, Object a2, Object a3, @@ -3044,7 +3044,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F16(Object a0, Object a1, Object a2, Object a3, @@ -3052,7 +3052,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_F17(Object a0, Object a1, Object a2, Object a3, @@ -3060,140 +3060,140 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11, a12, a13, a14, a15, a16)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11, a12, a13, a14, a15, a16)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11, a12, a13, a14, a15, a16)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11, a12, a13, a14, a15, a16)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12, a13, a14, a15, a16)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12, a13, a14, a15, a16)); } protected Object invoke_C13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13, a14, a15, a16)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13, a14, a15, a16)); } protected Object invoke_C14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14, a15, a16)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14, a15, a16)); } protected Object invoke_C15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15, a16)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15, a16)); } protected Object invoke_C16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, filter.invoke(a16)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, filter.invokeExact(a16)); } protected Object invoke_C17(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15], av[16]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15], av[16]); } } static class F18 extends Adapter { protected F18(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -3206,210 +3206,210 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11, a12, a13, a14, a15, a16, a17); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11), a12, a13, a14, a15, a16, a17); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11), a12, a13, a14, a15, a16, a17); } protected Object invoke_V12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12), a13, a14, a15, a16, a17); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12), a13, a14, a15, a16, a17); } protected Object invoke_V13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13), a14, a15, a16, a17); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13), a14, a15, a16, a17); } protected Object invoke_V14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14), a15, a16, a17); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14), a15, a16, a17); } protected Object invoke_V15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15), a16, a17); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15), a16, a17); } protected Object invoke_V16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, filter.invoke(a16), a17); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, filter.invokeExact(a16), a17); } protected Object invoke_V17(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, filter.invoke(a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, filter.invokeExact(a17)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, @@ -3417,7 +3417,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F13(Object a0, Object a1, Object a2, Object a3, @@ -3425,7 +3425,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F14(Object a0, Object a1, Object a2, Object a3, @@ -3433,7 +3433,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F15(Object a0, Object a1, Object a2, Object a3, @@ -3441,7 +3441,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F16(Object a0, Object a1, Object a2, Object a3, @@ -3449,7 +3449,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F17(Object a0, Object a1, Object a2, Object a3, @@ -3457,7 +3457,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_F18(Object a0, Object a1, Object a2, Object a3, @@ -3465,147 +3465,147 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11, a12, a13, a14, a15, a16, a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11, a12, a13, a14, a15, a16, a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11, a12, a13, a14, a15, a16, a17)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12, a13, a14, a15, a16, a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12, a13, a14, a15, a16, a17)); } protected Object invoke_C13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13, a14, a15, a16, a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13, a14, a15, a16, a17)); } protected Object invoke_C14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14, a15, a16, a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14, a15, a16, a17)); } protected Object invoke_C15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15, a16, a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15, a16, a17)); } protected Object invoke_C16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, filter.invoke(a16, a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, filter.invokeExact(a16, a17)); } protected Object invoke_C17(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, filter.invoke(a17)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, filter.invokeExact(a17)); } protected Object invoke_C18(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15], av[16], av[17]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15], av[16], av[17]); } } static class F19 extends Adapter { protected F19(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -3618,217 +3618,217 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11, a12, a13, a14, a15, a16, a17, a18); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11), a12, a13, a14, a15, a16, a17, a18); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11), a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_V12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12), a13, a14, a15, a16, a17, a18); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12), a13, a14, a15, a16, a17, a18); } protected Object invoke_V13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13), a14, a15, a16, a17, a18); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13), a14, a15, a16, a17, a18); } protected Object invoke_V14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14), a15, a16, a17, a18); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14), a15, a16, a17, a18); } protected Object invoke_V15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15), a16, a17, a18); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15), a16, a17, a18); } protected Object invoke_V16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, filter.invoke(a16), a17, a18); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, filter.invokeExact(a16), a17, a18); } protected Object invoke_V17(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, filter.invoke(a17), a18); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, filter.invokeExact(a17), a18); } protected Object invoke_V18(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, a17, filter.invoke(a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, filter.invokeExact(a18)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, @@ -3836,7 +3836,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F13(Object a0, Object a1, Object a2, Object a3, @@ -3844,7 +3844,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F14(Object a0, Object a1, Object a2, Object a3, @@ -3852,7 +3852,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F15(Object a0, Object a1, Object a2, Object a3, @@ -3860,7 +3860,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F16(Object a0, Object a1, Object a2, Object a3, @@ -3868,7 +3868,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F17(Object a0, Object a1, Object a2, Object a3, @@ -3876,7 +3876,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F18(Object a0, Object a1, Object a2, Object a3, @@ -3884,7 +3884,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_F19(Object a0, Object a1, Object a2, Object a3, @@ -3892,154 +3892,154 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11, a12, a13, a14, a15, a16, a17, a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11, a12, a13, a14, a15, a16, a17, a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11, a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12, a13, a14, a15, a16, a17, a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12, a13, a14, a15, a16, a17, a18)); } protected Object invoke_C13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13, a14, a15, a16, a17, a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13, a14, a15, a16, a17, a18)); } protected Object invoke_C14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14, a15, a16, a17, a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14, a15, a16, a17, a18)); } protected Object invoke_C15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15, a16, a17, a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15, a16, a17, a18)); } protected Object invoke_C16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, filter.invoke(a16, a17, a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, filter.invokeExact(a16, a17, a18)); } protected Object invoke_C17(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, filter.invoke(a17, a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, filter.invokeExact(a17, a18)); } protected Object invoke_C18(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, a17, filter.invoke(a18)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, filter.invokeExact(a18)); } protected Object invoke_C19(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15], av[16], av[17], av[18]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15], av[16], av[17], av[18]); } } static class F20 extends Adapter { protected F20(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -4052,224 +4052,224 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, filter.invoke(a1), a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2), a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2), a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3), a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3), a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4), a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4), a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5), a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5), a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6), a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6), a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7), a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7), a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8), a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8), a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9), + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9), a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - filter.invoke(a10), a11, a12, a13, a14, a15, a16, a17, a18, a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + filter.invokeExact(a10), a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11), a12, a13, a14, a15, a16, a17, a18, a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11), a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12), a13, a14, a15, a16, a17, a18, a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12), a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_V13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13), a14, a15, a16, a17, a18, a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13), a14, a15, a16, a17, a18, a19); } protected Object invoke_V14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14), a15, a16, a17, a18, a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14), a15, a16, a17, a18, a19); } protected Object invoke_V15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15), a16, a17, a18, a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15), a16, a17, a18, a19); } protected Object invoke_V16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, filter.invoke(a16), a17, a18, a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, filter.invokeExact(a16), a17, a18, a19); } protected Object invoke_V17(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, filter.invoke(a17), a18, a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, filter.invokeExact(a17), a18, a19); } protected Object invoke_V18(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, a17, filter.invoke(a18), a19); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, filter.invokeExact(a18), a19); } protected Object invoke_V19(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, a17, a18, filter.invoke(a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, a18, filter.invokeExact(a19)); } protected Object invoke_F0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(), + return target.invokeExact(filter.invokeExact(), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0), + return target.invokeExact(filter.invokeExact(a0), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1), + return target.invokeExact(filter.invokeExact(a0, a1), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2), + return target.invokeExact(filter.invokeExact(a0, a1, a2), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F12(Object a0, Object a1, Object a2, Object a3, @@ -4277,7 +4277,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F13(Object a0, Object a1, Object a2, Object a3, @@ -4285,7 +4285,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F14(Object a0, Object a1, Object a2, Object a3, @@ -4293,7 +4293,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F15(Object a0, Object a1, Object a2, Object a3, @@ -4301,7 +4301,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F16(Object a0, Object a1, Object a2, Object a3, @@ -4309,7 +4309,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F17(Object a0, Object a1, Object a2, Object a3, @@ -4317,7 +4317,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F18(Object a0, Object a1, Object a2, Object a3, @@ -4325,7 +4325,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F19(Object a0, Object a1, Object a2, Object a3, @@ -4333,7 +4333,7 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_F20(Object a0, Object a1, Object a2, Object a3, @@ -4341,160 +4341,160 @@ class genclasses { Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19), + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19), a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } protected Object invoke_C0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(filter.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(filter.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, filter.invoke(a1, a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, filter.invokeExact(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, filter.invoke(a2, a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, filter.invokeExact(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, filter.invoke(a3, a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, filter.invokeExact(a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, filter.invoke(a4, a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, filter.invokeExact(a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C5(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, filter.invoke(a5, a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, filter.invokeExact(a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, filter.invoke(a6, a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, filter.invokeExact(a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, filter.invoke(a7, a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, filter.invokeExact(a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, filter.invoke(a8, a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, filter.invokeExact(a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invoke(a9, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, filter.invokeExact(a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invoke(a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, filter.invokeExact(a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C11(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, filter.invoke(a11, a12, a13, a14, a15, a16, a17, a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, filter.invokeExact(a11, a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C12(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, filter.invoke(a12, a13, a14, a15, a16, a17, a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, filter.invokeExact(a12, a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C13(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, filter.invoke(a13, a14, a15, a16, a17, a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, filter.invokeExact(a13, a14, a15, a16, a17, a18, a19)); } protected Object invoke_C14(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, filter.invoke(a14, a15, a16, a17, a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, filter.invokeExact(a14, a15, a16, a17, a18, a19)); } protected Object invoke_C15(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, filter.invoke(a15, a16, a17, a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, filter.invokeExact(a15, a16, a17, a18, a19)); } protected Object invoke_C16(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, filter.invoke(a16, a17, a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, filter.invokeExact(a16, a17, a18, a19)); } protected Object invoke_C17(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, filter.invoke(a17, a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, filter.invokeExact(a17, a18, a19)); } protected Object invoke_C18(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, a17, filter.invoke(a18, a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, filter.invokeExact(a18, a19)); } protected Object invoke_C19(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, a17, a18, filter.invoke(a19)); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, a18, filter.invokeExact(a19)); } protected Object invoke_C20(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, filter.invoke()); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, filter.invokeExact()); } protected Object invoke_Y0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object a10, Object a11, Object a12, Object a13, Object a14, Object a15, Object a16, Object a17, Object a18, Object a19) throws Throwable { Object[] av = { a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19 }; - filter.invoke(av); // make the flyby - return target.invoke(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15], av[16], av[17], av[18], av[19]); } + filter.invokeExact(av); // make the flyby + return target.invokeExact(av[0], av[1], av[2], av[3], av[4], av[5], av[6], av[7], av[8], av[9], av[10], av[11], av[12], av[13], av[14], av[15], av[16], av[17], av[18], av[19]); } } } diff --git a/src/share/classes/sun/dyn/FilterOneArgument.java b/src/share/classes/sun/dyn/FilterOneArgument.java index 9a7eb07ca8f1f90f710b1490c8437afb0eb64763..354694f49a421f568be545b43ccba9e1c2fb13b1 100644 --- a/src/share/classes/sun/dyn/FilterOneArgument.java +++ b/src/share/classes/sun/dyn/FilterOneArgument.java @@ -47,8 +47,8 @@ public class FilterOneArgument extends JavaMethodHandle { } protected Object invoke(Object argument) throws Throwable { - Object filteredArgument = filter.invoke(argument); - return target.invoke(filteredArgument); + Object filteredArgument = filter.invokeExact(argument); + return target.invokeExact(filteredArgument); } private static final MethodHandle INVOKE = diff --git a/src/share/classes/sun/dyn/FromGeneric.java b/src/share/classes/sun/dyn/FromGeneric.java index 2e18e089038f446b2e571913c400006f36493b46..f4a1969f8ff6fa5dcd2606a9802bb248e22df07a 100644 --- a/src/share/classes/sun/dyn/FromGeneric.java +++ b/src/share/classes/sun/dyn/FromGeneric.java @@ -289,11 +289,11 @@ class FromGeneric { // { return new ThisType(entryPoint, convert, target); } /// Conversions on the value returned from the target. - protected Object convert_L(Object result) throws Throwable { return convert.invoke(result); } - protected Object convert_I(int result) throws Throwable { return convert.invoke(result); } - protected Object convert_J(long result) throws Throwable { return convert.invoke(result); } - protected Object convert_F(float result) throws Throwable { return convert.invoke(result); } - protected Object convert_D(double result) throws Throwable { return convert.invoke(result); } + protected Object convert_L(Object result) throws Throwable { return convert.invokeExact(result); } + protected Object convert_I(int result) throws Throwable { return convert.invokeExact(result); } + protected Object convert_J(long result) throws Throwable { return convert.invokeExact(result); } + protected Object convert_F(float result) throws Throwable { return convert.invokeExact(result); } + protected Object convert_D(double result) throws Throwable { return convert.invokeExact(result); } static private final String CLASS_PREFIX; // "sun.dyn.FromGeneric$" static { @@ -322,11 +322,11 @@ class FromGeneric { { super(e, i, c, t); } protected xA2 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new xA2(e, i, c, t); } - protected Object invoke_L2(Object a0, Object a1) throws Throwable { return convert_L(invoker.invoke(target, a0, a1)); } - protected Object invoke_I2(Object a0, Object a1) throws Throwable { return convert_I(invoker.invoke(target, a0, a1)); } - protected Object invoke_J2(Object a0, Object a1) throws Throwable { return convert_J(invoker.invoke(target, a0, a1)); } - protected Object invoke_F2(Object a0, Object a1) throws Throwable { return convert_F(invoker.invoke(target, a0, a1)); } - protected Object invoke_D2(Object a0, Object a1) throws Throwable { return convert_D(invoker.invoke(target, a0, a1)); } + protected Object invoke_L2(Object a0, Object a1) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1)); } + protected Object invoke_I2(Object a0, Object a1) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1)); } + protected Object invoke_J2(Object a0, Object a1) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1)); } + protected Object invoke_F2(Object a0, Object a1) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1)); } + protected Object invoke_D2(Object a0, Object a1) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1)); } } // */ @@ -347,7 +347,7 @@ class genclasses { " protected @cat@ makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t)", " { return new @cat@(e, i, c, t); }", " //@each-R@", - " protected Object invoke_@catN@(@Tvav@) throws Throwable { return convert_@Rc@(invoker.<@R@>invoke(target@av@)); }", + " protected Object invoke_@catN@(@Tvav@) throws Throwable { return convert_@Rc@(invoker.<@R@>invokeExact(target@av@)); }", " //@end-R@", " }", } }; @@ -503,11 +503,11 @@ class genclasses { { super(e, i, c, t); } protected A0 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A0(e, i, c, t); } - protected Object invoke_L0() throws Throwable { return convert_L(invoker.invoke(target)); } - protected Object invoke_I0() throws Throwable { return convert_I(invoker.invoke(target)); } - protected Object invoke_J0() throws Throwable { return convert_J(invoker.invoke(target)); } - protected Object invoke_F0() throws Throwable { return convert_F(invoker.invoke(target)); } - protected Object invoke_D0() throws Throwable { return convert_D(invoker.invoke(target)); } + protected Object invoke_L0() throws Throwable { return convert_L(invoker.invokeExact(target)); } + protected Object invoke_I0() throws Throwable { return convert_I(invoker.invokeExact(target)); } + protected Object invoke_J0() throws Throwable { return convert_J(invoker.invokeExact(target)); } + protected Object invoke_F0() throws Throwable { return convert_F(invoker.invokeExact(target)); } + protected Object invoke_D0() throws Throwable { return convert_D(invoker.invokeExact(target)); } } static class A1 extends Adapter { protected A1(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -515,11 +515,11 @@ class genclasses { { super(e, i, c, t); } protected A1 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A1(e, i, c, t); } - protected Object invoke_L1(Object a0) throws Throwable { return convert_L(invoker.invoke(target, a0)); } - protected Object invoke_I1(Object a0) throws Throwable { return convert_I(invoker.invoke(target, a0)); } - protected Object invoke_J1(Object a0) throws Throwable { return convert_J(invoker.invoke(target, a0)); } - protected Object invoke_F1(Object a0) throws Throwable { return convert_F(invoker.invoke(target, a0)); } - protected Object invoke_D1(Object a0) throws Throwable { return convert_D(invoker.invoke(target, a0)); } + protected Object invoke_L1(Object a0) throws Throwable { return convert_L(invoker.invokeExact(target, a0)); } + protected Object invoke_I1(Object a0) throws Throwable { return convert_I(invoker.invokeExact(target, a0)); } + protected Object invoke_J1(Object a0) throws Throwable { return convert_J(invoker.invokeExact(target, a0)); } + protected Object invoke_F1(Object a0) throws Throwable { return convert_F(invoker.invokeExact(target, a0)); } + protected Object invoke_D1(Object a0) throws Throwable { return convert_D(invoker.invokeExact(target, a0)); } } static class A2 extends Adapter { protected A2(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -527,11 +527,11 @@ class genclasses { { super(e, i, c, t); } protected A2 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A2(e, i, c, t); } - protected Object invoke_L2(Object a0, Object a1) throws Throwable { return convert_L(invoker.invoke(target, a0, a1)); } - protected Object invoke_I2(Object a0, Object a1) throws Throwable { return convert_I(invoker.invoke(target, a0, a1)); } - protected Object invoke_J2(Object a0, Object a1) throws Throwable { return convert_J(invoker.invoke(target, a0, a1)); } - protected Object invoke_F2(Object a0, Object a1) throws Throwable { return convert_F(invoker.invoke(target, a0, a1)); } - protected Object invoke_D2(Object a0, Object a1) throws Throwable { return convert_D(invoker.invoke(target, a0, a1)); } + protected Object invoke_L2(Object a0, Object a1) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1)); } + protected Object invoke_I2(Object a0, Object a1) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1)); } + protected Object invoke_J2(Object a0, Object a1) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1)); } + protected Object invoke_F2(Object a0, Object a1) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1)); } + protected Object invoke_D2(Object a0, Object a1) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1)); } } static class A3 extends Adapter { protected A3(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -539,11 +539,11 @@ class genclasses { { super(e, i, c, t); } protected A3 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A3(e, i, c, t); } - protected Object invoke_L3(Object a0, Object a1, Object a2) throws Throwable { return convert_L(invoker.invoke(target, a0, a1, a2)); } - protected Object invoke_I3(Object a0, Object a1, Object a2) throws Throwable { return convert_I(invoker.invoke(target, a0, a1, a2)); } - protected Object invoke_J3(Object a0, Object a1, Object a2) throws Throwable { return convert_J(invoker.invoke(target, a0, a1, a2)); } - protected Object invoke_F3(Object a0, Object a1, Object a2) throws Throwable { return convert_F(invoker.invoke(target, a0, a1, a2)); } - protected Object invoke_D3(Object a0, Object a1, Object a2) throws Throwable { return convert_D(invoker.invoke(target, a0, a1, a2)); } + protected Object invoke_L3(Object a0, Object a1, Object a2) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1, a2)); } + protected Object invoke_I3(Object a0, Object a1, Object a2) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1, a2)); } + protected Object invoke_J3(Object a0, Object a1, Object a2) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1, a2)); } + protected Object invoke_F3(Object a0, Object a1, Object a2) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1, a2)); } + protected Object invoke_D3(Object a0, Object a1, Object a2) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1, a2)); } } static class A4 extends Adapter { protected A4(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -551,11 +551,11 @@ class genclasses { { super(e, i, c, t); } protected A4 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A4(e, i, c, t); } - protected Object invoke_L4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_L(invoker.invoke(target, a0, a1, a2, a3)); } - protected Object invoke_I4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_I(invoker.invoke(target, a0, a1, a2, a3)); } - protected Object invoke_J4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_J(invoker.invoke(target, a0, a1, a2, a3)); } - protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_F(invoker.invoke(target, a0, a1, a2, a3)); } - protected Object invoke_D4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_D(invoker.invoke(target, a0, a1, a2, a3)); } + protected Object invoke_L4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1, a2, a3)); } + protected Object invoke_I4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1, a2, a3)); } + protected Object invoke_J4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1, a2, a3)); } + protected Object invoke_F4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1, a2, a3)); } + protected Object invoke_D4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1, a2, a3)); } } static class A5 extends Adapter { protected A5(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -563,11 +563,11 @@ class genclasses { { super(e, i, c, t); } protected A5 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A5(e, i, c, t); } - protected Object invoke_L5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_L(invoker.invoke(target, a0, a1, a2, a3, a4)); } - protected Object invoke_I5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_I(invoker.invoke(target, a0, a1, a2, a3, a4)); } - protected Object invoke_J5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_J(invoker.invoke(target, a0, a1, a2, a3, a4)); } - protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_F(invoker.invoke(target, a0, a1, a2, a3, a4)); } - protected Object invoke_D5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_D(invoker.invoke(target, a0, a1, a2, a3, a4)); } + protected Object invoke_L5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1, a2, a3, a4)); } + protected Object invoke_I5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1, a2, a3, a4)); } + protected Object invoke_J5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1, a2, a3, a4)); } + protected Object invoke_F5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1, a2, a3, a4)); } + protected Object invoke_D5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1, a2, a3, a4)); } } static class A6 extends Adapter { protected A6(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -575,11 +575,11 @@ class genclasses { { super(e, i, c, t); } protected A6 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A6(e, i, c, t); } - protected Object invoke_L6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_L(invoker.invoke(target, a0, a1, a2, a3, a4, a5)); } - protected Object invoke_I6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_I(invoker.invoke(target, a0, a1, a2, a3, a4, a5)); } - protected Object invoke_J6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_J(invoker.invoke(target, a0, a1, a2, a3, a4, a5)); } - protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_F(invoker.invoke(target, a0, a1, a2, a3, a4, a5)); } - protected Object invoke_D6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_D(invoker.invoke(target, a0, a1, a2, a3, a4, a5)); } + protected Object invoke_L6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5)); } + protected Object invoke_I6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5)); } + protected Object invoke_J6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5)); } + protected Object invoke_F6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5)); } + protected Object invoke_D6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5)); } } static class A7 extends Adapter { protected A7(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -587,11 +587,11 @@ class genclasses { { super(e, i, c, t); } protected A7 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A7(e, i, c, t); } - protected Object invoke_L7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_L(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6)); } - protected Object invoke_I7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_I(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6)); } - protected Object invoke_J7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_J(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6)); } - protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_F(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6)); } - protected Object invoke_D7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_D(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6)); } + protected Object invoke_L7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6)); } + protected Object invoke_I7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6)); } + protected Object invoke_J7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6)); } + protected Object invoke_F7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6)); } + protected Object invoke_D7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6)); } } static class A8 extends Adapter { protected A8(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -599,11 +599,11 @@ class genclasses { { super(e, i, c, t); } protected A8 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A8(e, i, c, t); } - protected Object invoke_L8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_L(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7)); } - protected Object invoke_I8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_I(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7)); } - protected Object invoke_J8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_J(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7)); } - protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_F(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7)); } - protected Object invoke_D8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_D(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7)); } + protected Object invoke_L8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7)); } + protected Object invoke_I8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7)); } + protected Object invoke_J8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7)); } + protected Object invoke_F8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7)); } + protected Object invoke_D8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7)); } } static class A9 extends Adapter { protected A9(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -611,11 +611,11 @@ class genclasses { { super(e, i, c, t); } protected A9 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A9(e, i, c, t); } - protected Object invoke_L9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_L(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } - protected Object invoke_I9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_I(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } - protected Object invoke_J9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_J(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } - protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_F(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } - protected Object invoke_D9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_D(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } + protected Object invoke_L9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } + protected Object invoke_I9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } + protected Object invoke_J9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } + protected Object invoke_F9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } + protected Object invoke_D9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8)); } } static class A10 extends Adapter { protected A10(MethodHandle entryPoint) { super(entryPoint); } // to build prototype @@ -623,10 +623,10 @@ class genclasses { { super(e, i, c, t); } protected A10 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A10(e, i, c, t); } - protected Object invoke_L10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_L(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } - protected Object invoke_I10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_I(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } - protected Object invoke_J10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_J(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } - protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_F(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } - protected Object invoke_D10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_D(invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } + protected Object invoke_L10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_L(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } + protected Object invoke_I10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_I(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } + protected Object invoke_J10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_J(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } + protected Object invoke_F10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_F(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } + protected Object invoke_D10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return convert_D(invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); } } } diff --git a/src/share/classes/sun/dyn/MemberName.java b/src/share/classes/sun/dyn/MemberName.java index 4e11e5b6e313eb74bfffd2b9ef0718ab27d5ab23..db21f2b4121cd4c53fef37a1b3626fade411c055 100644 --- a/src/share/classes/sun/dyn/MemberName.java +++ b/src/share/classes/sun/dyn/MemberName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2010, 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 @@ -40,15 +40,29 @@ import java.util.List; import static sun.dyn.MethodHandleNatives.Constants.*; /** - * Compact information which fully characterizes a method or field reference. - * When resolved, it includes a direct pointer to JVM metadata. + * A {@code MemberName} is a compact symbolic datum which fully characterizes + * a method or field reference. + * A member name refers to a field, method, constructor, or member type. + * Every member name has a simple name (a string) and a type (either a Class or MethodType). + * A member name may also have a non-null declaring class, or it may be simply + * a naked name/type pair. + * A member name may also have non-zero modifier flags. + * Finally, a member name may be either resolved or unresolved. + * If it is resolved, the existence of the named + *

+ * Whether resolved or not, a member name provides no access rights or + * invocation capability to its possessor. It is merely a compact + * representation of all symbolic information necessary to link to + * and properly use the named member. + *

+ * When resolved, a member name's internal implementation may include references to JVM metadata. * This representation is stateless and only decriptive. * It provides no private information and no capability to use the member. *

- * By contrast, a java.lang.reflect.Method contains fuller information + * By contrast, a {@linkplain java.lang.reflect.Method} contains fuller information * about the internals of a method (except its bytecodes) and also - * allows invocation. A MemberName is much lighter than a reflect.Method, - * since it contains about 7 fields to Method's 16 (plus its sub-arrays), + * allows invocation. A MemberName is much lighter than a Method, + * since it contains about 7 fields to the 16 of Method (plus its sub-arrays), * and those seven fields omit much of the information in Method. * @author jrose */ @@ -63,6 +77,9 @@ public final class MemberName implements Member, Cloneable { { vmindex = VM_INDEX_UNINITIALIZED; } + /** Return the declaring class of this member. + * In the case of a bare name and type, the declaring class will be null. + */ public Class getDeclaringClass() { if (clazz == null && isResolved()) { expandFromVM(); @@ -70,10 +87,16 @@ public final class MemberName implements Member, Cloneable { return clazz; } + /** Utility method producing the class loader of the declaring class. */ public ClassLoader getClassLoader() { return clazz.getClassLoader(); } + /** Return the simple name of this member. + * For a type, it is the same as {@link Class#getSimpleName}. + * For a method or field, it is the simple name of the member. + * For a constructor, it is always {@code "<init>"}. + */ public String getName() { if (name == null) { expandFromVM(); @@ -82,6 +105,9 @@ public final class MemberName implements Member, Cloneable { return name; } + /** Return the declared type of this member, which + * must be a method or constructor. + */ public MethodType getMethodType() { if (type == null) { expandFromVM(); @@ -109,6 +135,10 @@ public final class MemberName implements Member, Cloneable { throw new InternalError("bad method type "+type); } + /** Return the actual type under which this method or constructor must be invoked. + * For non-static methods or constructors, this is the type with a leading parameter, + * a reference to declaring class. For static methods, it is the same as the declared type. + */ public MethodType getInvocationType() { MethodType itype = getMethodType(); if (!isStatic()) @@ -116,14 +146,20 @@ public final class MemberName implements Member, Cloneable { return itype; } + /** Utility method producing the parameter types of the method type. */ public Class[] getParameterTypes() { return getMethodType().parameterArray(); } + /** Utility method producing the return type of the method type. */ public Class getReturnType() { return getMethodType().returnType(); } + /** Return the declared type of this member, which + * must be a field or type. + * If it is a type member, that type itself is returned. + */ public Class getFieldType() { if (type == null) { expandFromVM(); @@ -144,10 +180,14 @@ public final class MemberName implements Member, Cloneable { throw new InternalError("bad field type "+type); } + /** Utility method to produce either the method type or field type of this member. */ public Object getType() { return (isInvocable() ? getMethodType() : getFieldType()); } + /** Utility method to produce the signature of this member, + * used within the class file format to describe its type. + */ public String getSignature() { if (type == null) { expandFromVM(); @@ -161,6 +201,9 @@ public final class MemberName implements Member, Cloneable { return BytecodeDescriptor.unparse(getFieldType()); } + /** Return the modifier flags of this member. + * @see java.lang.reflect.Modifier + */ public int getModifiers() { return (flags & RECOGNIZED_MODIFIERS); } @@ -180,21 +223,27 @@ public final class MemberName implements Member, Cloneable { return !testFlags(mask, 0); } + /** Utility method to query the modifier flags of this member. */ public boolean isStatic() { return Modifier.isStatic(flags); } + /** Utility method to query the modifier flags of this member. */ public boolean isPublic() { return Modifier.isPublic(flags); } + /** Utility method to query the modifier flags of this member. */ public boolean isPrivate() { return Modifier.isPrivate(flags); } + /** Utility method to query the modifier flags of this member. */ public boolean isProtected() { return Modifier.isProtected(flags); } + /** Utility method to query the modifier flags of this member. */ public boolean isFinal() { return Modifier.isFinal(flags); } + /** Utility method to query the modifier flags of this member. */ public boolean isAbstract() { return Modifier.isAbstract(flags); } @@ -206,12 +255,15 @@ public final class MemberName implements Member, Cloneable { static final int SYNTHETIC = 0x00001000; static final int ANNOTATION= 0x00002000; static final int ENUM = 0x00004000; + /** Utility method to query the modifier flags of this member; returns false if the member is not a method. */ public boolean isBridge() { return testAllFlags(IS_METHOD | BRIDGE); } + /** Utility method to query the modifier flags of this member; returns false if the member is not a method. */ public boolean isVarargs() { return testAllFlags(VARARGS) && isInvocable(); } + /** Utility method to query the modifier flags of this member; returns false if the member is not a method. */ public boolean isSynthetic() { return testAllFlags(SYNTHETIC); } @@ -237,24 +289,31 @@ public final class MemberName implements Member, Cloneable { static final int IS_FIELD_OR_METHOD = IS_METHOD | IS_FIELD; static final int SEARCH_ALL_SUPERS = SEARCH_SUPERCLASSES | SEARCH_INTERFACES; + /** Utility method to query whether this member is a method or constructor. */ public boolean isInvocable() { return testAnyFlags(IS_INVOCABLE); } + /** Utility method to query whether this member is a method, constructor, or field. */ public boolean isFieldOrMethod() { return testAnyFlags(IS_FIELD_OR_METHOD); } + /** Query whether this member is a method. */ public boolean isMethod() { return testAllFlags(IS_METHOD); } + /** Query whether this member is a constructor. */ public boolean isConstructor() { return testAllFlags(IS_CONSTRUCTOR); } + /** Query whether this member is a field. */ public boolean isField() { return testAllFlags(IS_FIELD); } + /** Query whether this member is a type. */ public boolean isType() { return testAllFlags(IS_TYPE); } + /** Utility method to query whether this member is neither public, private, nor protected. */ public boolean isPackage() { return !testAnyFlags(ALL_ACCESS); } @@ -262,8 +321,8 @@ public final class MemberName implements Member, Cloneable { /** Initialize a query. It is not resolved. */ private void init(Class defClass, String name, Object type, int flags) { // defining class is allowed to be null (for a naked name/type pair) - name.toString(); // null check - type.equals(type); // null check + //name.toString(); // null check + //type.equals(type); // null check // fill in fields: this.clazz = defClass; this.name = name; @@ -285,6 +344,7 @@ public final class MemberName implements Member, Cloneable { assert((mods & ~RECOGNIZED_MODIFIERS) == 0); return flags | mods; } + /** Create a name for the given reflected method. The resulting name will be in a resolved state. */ public MemberName(Method m) { Object[] typeInfo = { m.getReturnType(), m.getParameterTypes() }; init(m.getDeclaringClass(), m.getName(), typeInfo, flagsMods(IS_METHOD, m.getModifiers())); @@ -292,6 +352,7 @@ public final class MemberName implements Member, Cloneable { MethodHandleNatives.init(this, m); assert(isResolved()); } + /** Create a name for the given reflected constructor. The resulting name will be in a resolved state. */ public MemberName(Constructor ctor) { Object[] typeInfo = { void.class, ctor.getParameterTypes() }; init(ctor.getDeclaringClass(), CONSTRUCTOR_NAME, typeInfo, flagsMods(IS_CONSTRUCTOR, ctor.getModifiers())); @@ -299,12 +360,14 @@ public final class MemberName implements Member, Cloneable { MethodHandleNatives.init(this, ctor); assert(isResolved()); } + /** Create a name for the given reflected field. The resulting name will be in a resolved state. */ public MemberName(Field fld) { init(fld.getDeclaringClass(), fld.getName(), fld.getType(), flagsMods(IS_FIELD, fld.getModifiers())); // fill in vmtarget, vmindex while we have fld in hand: MethodHandleNatives.init(this, fld); assert(isResolved()); } + /** Create a name for the given class. The resulting name will be in a resolved state. */ public MemberName(Class type) { init(type.getDeclaringClass(), type.getSimpleName(), type, flagsMods(IS_TYPE, type.getModifiers())); vmindex = 0; // isResolved @@ -326,28 +389,62 @@ public final class MemberName implements Member, Cloneable { // %%% define equals/hashcode? // Construction from symbolic parts, for queries: + /** Create a field or type name from the given components: Declaring class, name, type, modifiers. + * The declaring class may be supplied as null if this is to be a bare name and type. + * The resulting name will in an unresolved state. + */ public MemberName(Class defClass, String name, Class type, int modifiers) { init(defClass, name, type, IS_FIELD | (modifiers & RECOGNIZED_MODIFIERS)); } + /** Create a field or type name from the given components: Declaring class, name, type. + * The declaring class may be supplied as null if this is to be a bare name and type. + * The modifier flags default to zero. + * The resulting name will in an unresolved state. + */ public MemberName(Class defClass, String name, Class type) { this(defClass, name, type, 0); } + /** Create a method or constructor name from the given components: Declaring class, name, type, modifiers. + * It will be a constructor if and only if the name is {@code "<init>"}. + * The declaring class may be supplied as null if this is to be a bare name and type. + * The resulting name will in an unresolved state. + */ public MemberName(Class defClass, String name, MethodType type, int modifiers) { int flagBit = (name.equals(CONSTRUCTOR_NAME) ? IS_CONSTRUCTOR : IS_METHOD); init(defClass, name, type, flagBit | (modifiers & RECOGNIZED_MODIFIERS)); } + /** Create a method or constructor name from the given components: Declaring class, name, type, modifiers. + * It will be a constructor if and only if the name is {@code "<init>"}. + * The declaring class may be supplied as null if this is to be a bare name and type. + * The modifier flags default to zero. + * The resulting name will in an unresolved state. + */ public MemberName(Class defClass, String name, MethodType type) { this(defClass, name, type, 0); } - boolean isResolved() { + /** Query whether this member name is resolved. + * A resolved member name is one for which the JVM has found + * a method, constructor, field, or type binding corresponding exactly to the name. + * (Document?) + */ + public boolean isResolved() { return (vmindex != VM_INDEX_UNINITIALIZED); } + /** Query whether this member name is resolved to a non-static, non-final method. + */ public boolean hasReceiverTypeDispatch() { return (isMethod() && getVMIndex(Access.TOKEN) >= 0); } + /** Produce a string form of this member name. + * For types, it is simply the type's own string (as reported by {@code toString}). + * For fields, it is {@code "DeclaringClass.name/type"}. + * For methods and constructors, it is {@code "DeclaringClass.name(ptype...)rtype"}. + * If the declaring class is null, the prefix {@code "DeclaringClass."} is omitted. + * If the member is unresolved, a prefix {@code "*."} is prepended. + */ @Override public String toString() { if (isType()) @@ -360,9 +457,15 @@ public final class MemberName implements Member, Cloneable { buf.append(getName(clazz)); buf.append('.'); } - buf.append(getName()); - if (!isInvocable()) buf.append('/'); - buf.append(getName(getType())); + String name = getName(); + buf.append(name == null ? "*" : name); + Object type = getType(); + if (!isInvocable()) { + buf.append('/'); + buf.append(type == null ? "*" : getName(type)); + } else { + buf.append(type == null ? "(*)*" : getName(type)); + } /* buf.append('/'); // key: Public, private, pRotected, sTatic, Final, sYnchronized, @@ -374,7 +477,7 @@ public final class MemberName implements Member, Cloneable { for (int i = 0; i < modChars.length(); i++) { if ((flags & (1 << i)) != 0) { char mc = modChars.charAt(i); - if (mc != '.') + if (mc != '?') buf.append(mc); } } @@ -388,6 +491,7 @@ public final class MemberName implements Member, Cloneable { } // Queries to the JVM: + /** Document? */ public int getVMIndex(Access token) { Access.check(token); if (!isResolved()) @@ -411,9 +515,6 @@ public final class MemberName implements Member, Cloneable { public static NoAccessException newNoAccessException(MemberName name, Class lookupClass) { return newNoAccessException("cannot access", name, lookupClass); } - public static NoAccessException newNoAccessException(MemberName name, MethodHandles.Lookup lookup) { - return newNoAccessException(name, lookup.lookupClass()); - } public static NoAccessException newNoAccessException(String message, MemberName name, Class lookupClass) { message += ": " + name; @@ -429,6 +530,9 @@ public final class MemberName implements Member, Cloneable { public static Factory getFactory() { return getFactory(Access.getToken()); } + /** A factory type for resolving member names with the help of the VM. + * TBD: Define access-safe public constructors for this factory. + */ public static class Factory { private Factory() { } // singleton pattern static Factory INSTANCE = new Factory(); @@ -494,6 +598,21 @@ public final class MemberName implements Member, Cloneable { return result; } boolean resolveInPlace(MemberName m, boolean searchSupers, Class lookupClass) { + if (m.name == null || m.type == null) { // find unique non-overloaded name + Class defc = m.getDeclaringClass(); + List choices = null; + if (m.isMethod()) + choices = getMethods(defc, searchSupers, m.name, (MethodType) m.type, lookupClass); + else if (m.isConstructor()) + choices = getConstructors(defc, lookupClass); + else if (m.isField()) + choices = getFields(defc, searchSupers, m.name, (Class) m.type, lookupClass); + //System.out.println("resolving "+m+" to "+choices); + if (choices == null || choices.size() != 1) + return false; + if (m.name == null) m.name = choices.get(0).name; + if (m.type == null) m.type = choices.get(0).type; + } MethodHandleNatives.resolve(m, lookupClass); if (m.isResolved()) return true; int matchFlags = m.flags | (searchSupers ? SEARCH_ALL_SUPERS : 0); @@ -504,39 +623,82 @@ public final class MemberName implements Member, Cloneable { if (n != 1) return false; return m.isResolved(); } + /** Produce a resolved version of the given member. + * Super types are searched (for inherited members) if {@code searchSupers} is true. + * Access checking is performed on behalf of the given {@code lookupClass}. + * If lookup fails or access is not permitted, null is returned. + * Otherwise a fresh copy of the given member is returned, with modifier bits filled in. + */ public MemberName resolveOrNull(MemberName m, boolean searchSupers, Class lookupClass) { MemberName result = m.clone(); if (resolveInPlace(result, searchSupers, lookupClass)) return result; return null; } + /** Produce a resolved version of the given member. + * Super types are searched (for inherited members) if {@code searchSupers} is true. + * Access checking is performed on behalf of the given {@code lookupClass}. + * If lookup fails or access is not permitted, a {@linkplain NoAccessException} is thrown. + * Otherwise a fresh copy of the given member is returned, with modifier bits filled in. + */ public MemberName resolveOrFail(MemberName m, boolean searchSupers, Class lookupClass) { MemberName result = resolveOrNull(m, searchSupers, lookupClass); if (result != null) return result; throw newNoAccessException(m, lookupClass); } + /** Return a list of all methods defined by the given class. + * Super types are searched (for inherited members) if {@code searchSupers} is true. + * Access checking is performed on behalf of the given {@code lookupClass}. + * Inaccessible members are not added to the last. + */ public List getMethods(Class defc, boolean searchSupers, Class lookupClass) { return getMethods(defc, searchSupers, null, null, lookupClass); } + /** Return a list of matching methods defined by the given class. + * Super types are searched (for inherited members) if {@code searchSupers} is true. + * Returned methods will match the name (if not null) and the type (if not null). + * Access checking is performed on behalf of the given {@code lookupClass}. + * Inaccessible members are not added to the last. + */ public List getMethods(Class defc, boolean searchSupers, String name, MethodType type, Class lookupClass) { int matchFlags = IS_METHOD | (searchSupers ? SEARCH_ALL_SUPERS : 0); return getMembers(defc, name, type, matchFlags, lookupClass); } + /** Return a list of all constructors defined by the given class. + * Access checking is performed on behalf of the given {@code lookupClass}. + * Inaccessible members are not added to the last. + */ public List getConstructors(Class defc, Class lookupClass) { return getMembers(defc, null, null, IS_CONSTRUCTOR, lookupClass); } + /** Return a list of all fields defined by the given class. + * Super types are searched (for inherited members) if {@code searchSupers} is true. + * Access checking is performed on behalf of the given {@code lookupClass}. + * Inaccessible members are not added to the last. + */ public List getFields(Class defc, boolean searchSupers, Class lookupClass) { return getFields(defc, searchSupers, null, null, lookupClass); } + /** Return a list of all fields defined by the given class. + * Super types are searched (for inherited members) if {@code searchSupers} is true. + * Returned fields will match the name (if not null) and the type (if not null). + * Access checking is performed on behalf of the given {@code lookupClass}. + * Inaccessible members are not added to the last. + */ public List getFields(Class defc, boolean searchSupers, String name, Class type, Class lookupClass) { int matchFlags = IS_FIELD | (searchSupers ? SEARCH_ALL_SUPERS : 0); return getMembers(defc, name, type, matchFlags, lookupClass); } + /** Return a list of all nested types defined by the given class. + * Super types are searched (for inherited members) if {@code searchSupers} is true. + * Access checking is performed on behalf of the given {@code lookupClass}. + * Inaccessible members are not added to the last. + */ public List getNestedTypes(Class defc, boolean searchSupers, Class lookupClass) { int matchFlags = IS_TYPE | (searchSupers ? SEARCH_ALL_SUPERS : 0); diff --git a/src/share/classes/sun/dyn/MethodHandleImpl.java b/src/share/classes/sun/dyn/MethodHandleImpl.java index fc91792af56932906526cf1781898a7158ce4250..25dc470d061228539a7a73f8b894f2d36eb56dba 100644 --- a/src/share/classes/sun/dyn/MethodHandleImpl.java +++ b/src/share/classes/sun/dyn/MethodHandleImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2010, 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 @@ -127,7 +127,7 @@ public abstract class MethodHandleImpl { public static void initLookup(Access token, Lookup lookup) { Access.check(token); - if (IMPL_LOOKUP_INIT != null || lookup.lookupClass() != null) + if (IMPL_LOOKUP_INIT != null) throw new InternalError(); IMPL_LOOKUP_INIT = lookup; } @@ -176,28 +176,164 @@ public abstract class MethodHandleImpl { boolean doDispatch, Class lookupClass) { Access.check(token); // only trusted calls MethodType mtype = method.getMethodType(); - MethodType rtype = mtype; - if (method.isStatic()) { - doDispatch = false; - } else { + if (!method.isStatic()) { // adjust the advertised receiver type to be exactly the one requested // (in the case of invokespecial, this will be the calling class) Class recvType = method.getDeclaringClass(); mtype = mtype.insertParameterTypes(0, recvType); - if (method.isConstructor()) - doDispatch = true; - // FIXME: JVM has trouble building MH.invoke sites for - // classes off the boot class path - rtype = mtype; - if (recvType.getClassLoader() != null) - rtype = rtype.changeParameterType(0, Object.class); } DirectMethodHandle mh = new DirectMethodHandle(mtype, method, doDispatch, lookupClass); if (!mh.isValid()) throw newNoAccessException(method, lookupClass); - MethodHandle rmh = AdapterMethodHandle.makePairwiseConvert(token, rtype, mh); - if (rmh == null) throw new InternalError(); - return rmh; + assert(mh.type() == mtype); + return mh; + } + + public static + MethodHandle makeAllocator(Access token, MethodHandle rawConstructor) { + Access.check(token); + MethodType rawConType = rawConstructor.type(); + // Wrap the raw (unsafe) constructor with the allocation of a suitable object. + MethodHandle allocator + = AllocateObject.make(token, rawConType.parameterType(0), rawConstructor); + assert(allocator.type() + .equals(rawConType.dropParameterTypes(0, 1).changeReturnType(rawConType.parameterType(0)))); + return allocator; + } + + static final class AllocateObject extends JavaMethodHandle { + private static final Unsafe unsafe = Unsafe.getUnsafe(); + + private final Class allocateClass; + private final MethodHandle rawConstructor; + + private AllocateObject(MethodHandle invoker, + Class allocateClass, MethodHandle rawConstructor) { + super(invoker); + this.allocateClass = allocateClass; + this.rawConstructor = rawConstructor; + } + static MethodHandle make(Access token, + Class allocateClass, MethodHandle rawConstructor) { + Access.check(token); + MethodType rawConType = rawConstructor.type(); + assert(rawConType.parameterType(0) == allocateClass); + MethodType newType = rawConType.dropParameterTypes(0, 1).changeReturnType(allocateClass); + int nargs = rawConType.parameterCount() - 1; + if (nargs < INVOKES.length) { + MethodHandle invoke = INVOKES[nargs]; + MethodType conType = CON_TYPES[nargs]; + MethodHandle gcon = convertArguments(token, rawConstructor, conType, rawConType, null); + if (gcon == null) return null; + MethodHandle galloc = new AllocateObject(invoke, allocateClass, gcon); + assert(galloc.type() == newType.generic()); + return convertArguments(token, galloc, newType, galloc.type(), null); + } else { + MethodHandle invoke = VARARGS_INVOKE; + MethodType conType = CON_TYPES[nargs]; + MethodHandle gcon = spreadArguments(token, rawConstructor, conType, 1); + if (gcon == null) return null; + MethodHandle galloc = new AllocateObject(invoke, allocateClass, gcon); + return collectArguments(token, galloc, newType, 1, null); + } + } + @Override + public String toString() { + return allocateClass.getSimpleName(); + } + @SuppressWarnings("unchecked") + private C allocate() throws InstantiationException { + return (C) unsafe.allocateInstance(allocateClass); + } + private C invoke_V(Object... av) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, av); + return obj; + } + private C invoke_L0() throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj); + return obj; + } + private C invoke_L1(Object a0) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, a0); + return obj; + } + private C invoke_L2(Object a0, Object a1) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, a0, a1); + return obj; + } + private C invoke_L3(Object a0, Object a1, Object a2) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, a0, a1, a2); + return obj; + } + private C invoke_L4(Object a0, Object a1, Object a2, Object a3) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, a0, a1, a2, a3); + return obj; + } + private C invoke_L5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, a0, a1, a2, a3, a4); + return obj; + } + private C invoke_L6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, a0, a1, a2, a3, a4, a5); + return obj; + } + private C invoke_L7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, a0, a1, a2, a3, a4, a5, a6); + return obj; + } + private C invoke_L8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { + C obj = allocate(); + rawConstructor.invokeExact((Object)obj, a0, a1, a2, a3, a4, a5, a6, a7); + return obj; + } + static MethodHandle[] makeInvokes() { + ArrayList invokes = new ArrayList(); + MethodHandles.Lookup lookup = IMPL_LOOKUP; + for (;;) { + int nargs = invokes.size(); + String name = "invoke_L"+nargs; + MethodHandle invoke = null; + try { + invoke = lookup.findVirtual(AllocateObject.class, name, MethodType.genericMethodType(nargs)); + } catch (NoAccessException ex) { + } + if (invoke == null) break; + invokes.add(invoke); + } + assert(invokes.size() == 9); // current number of methods + return invokes.toArray(new MethodHandle[0]); + }; + static final MethodHandle[] INVOKES = makeInvokes(); + // For testing use this: + //static final MethodHandle[] INVOKES = Arrays.copyOf(makeInvokes(), 2); + static final MethodHandle VARARGS_INVOKE; + static { + try { + VARARGS_INVOKE = IMPL_LOOKUP.findVirtual(AllocateObject.class, "invoke_V", MethodType.genericMethodType(0, true)); + } catch (NoAccessException ex) { + throw new InternalError(""); + } + } + // Corresponding generic constructor types: + static final MethodType[] CON_TYPES = new MethodType[INVOKES.length]; + static { + for (int i = 0; i < INVOKES.length; i++) + CON_TYPES[i] = makeConType(INVOKES[i]); + } + static final MethodType VARARGS_CON_TYPE = makeConType(VARARGS_INVOKE); + static MethodType makeConType(MethodHandle invoke) { + MethodType invType = invoke.type(); + return invType.changeParameterType(0, Object.class).changeReturnType(void.class); + } } public static @@ -469,6 +605,7 @@ public abstract class MethodHandleImpl { MethodType oldType, int[] permutationOrNull) { Access.check(token); + assert(oldType.parameterCount() == target.type().parameterCount()); if (permutationOrNull != null) { int outargs = oldType.parameterCount(), inargs = newType.parameterCount(); if (permutationOrNull.length != outargs) @@ -781,69 +918,93 @@ public abstract class MethodHandleImpl { private static class GuardWithTest extends JavaMethodHandle { private final MethodHandle test, target, fallback; - public GuardWithTest(MethodHandle test, MethodHandle target, MethodHandle fallback) { - this(INVOKES[target.type().parameterCount()], test, target, fallback); - } - public GuardWithTest(MethodHandle invoker, - MethodHandle test, MethodHandle target, MethodHandle fallback) { + private GuardWithTest(MethodHandle invoker, + MethodHandle test, MethodHandle target, MethodHandle fallback) { super(invoker); this.test = test; this.target = target; this.fallback = fallback; } + static MethodHandle make(Access token, + MethodHandle test, MethodHandle target, MethodHandle fallback) { + Access.check(token); + MethodType type = target.type(); + int nargs = type.parameterCount(); + if (nargs < INVOKES.length) { + MethodHandle invoke = INVOKES[nargs]; + MethodType gtype = type.generic(); + assert(invoke.type().dropParameterTypes(0,1) == gtype); + MethodHandle gtest = convertArguments(token, test, gtype.changeReturnType(boolean.class), test.type(), null); + MethodHandle gtarget = convertArguments(token, target, gtype, type, null); + MethodHandle gfallback = convertArguments(token, fallback, gtype, type, null); + if (gtest == null || gtarget == null || gfallback == null) return null; + MethodHandle gguard = new GuardWithTest(invoke, gtest, gtarget, gfallback); + return convertArguments(token, gguard, type, gtype, null); + } else { + MethodHandle invoke = VARARGS_INVOKE; + MethodType gtype = MethodType.genericMethodType(1); + assert(invoke.type().dropParameterTypes(0,1) == gtype); + MethodHandle gtest = spreadArguments(token, test, gtype.changeReturnType(boolean.class), 0); + MethodHandle gtarget = spreadArguments(token, target, gtype, 0); + MethodHandle gfallback = spreadArguments(token, fallback, gtype, 0); + MethodHandle gguard = new GuardWithTest(invoke, gtest, gtarget, gfallback); + if (gtest == null || gtarget == null || gfallback == null) return null; + return collectArguments(token, gguard, type, 0, null); + } + } @Override public String toString() { return target.toString(); } private Object invoke_V(Object... av) throws Throwable { - if (test.invoke(av)) - return target.invoke(av); - return fallback.invoke(av); + if (test.invokeExact(av)) + return target.invokeExact(av); + return fallback.invokeExact(av); } private Object invoke_L0() throws Throwable { - if (test.invoke()) - return target.invoke(); - return fallback.invoke(); + if (test.invokeExact()) + return target.invokeExact(); + return fallback.invokeExact(); } private Object invoke_L1(Object a0) throws Throwable { - if (test.invoke(a0)) - return target.invoke(a0); - return fallback.invoke(a0); + if (test.invokeExact(a0)) + return target.invokeExact(a0); + return fallback.invokeExact(a0); } private Object invoke_L2(Object a0, Object a1) throws Throwable { - if (test.invoke(a0, a1)) - return target.invoke(a0, a1); - return fallback.invoke(a0, a1); + if (test.invokeExact(a0, a1)) + return target.invokeExact(a0, a1); + return fallback.invokeExact(a0, a1); } private Object invoke_L3(Object a0, Object a1, Object a2) throws Throwable { - if (test.invoke(a0, a1, a2)) - return target.invoke(a0, a1, a2); - return fallback.invoke(a0, a1, a2); + if (test.invokeExact(a0, a1, a2)) + return target.invokeExact(a0, a1, a2); + return fallback.invokeExact(a0, a1, a2); } private Object invoke_L4(Object a0, Object a1, Object a2, Object a3) throws Throwable { - if (test.invoke(a0, a1, a2, a3)) - return target.invoke(a0, a1, a2, a3); - return fallback.invoke(a0, a1, a2, a3); + if (test.invokeExact(a0, a1, a2, a3)) + return target.invokeExact(a0, a1, a2, a3); + return fallback.invokeExact(a0, a1, a2, a3); } private Object invoke_L5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { - if (test.invoke(a0, a1, a2, a3, a4)) - return target.invoke(a0, a1, a2, a3, a4); - return fallback.invoke(a0, a1, a2, a3, a4); + if (test.invokeExact(a0, a1, a2, a3, a4)) + return target.invokeExact(a0, a1, a2, a3, a4); + return fallback.invokeExact(a0, a1, a2, a3, a4); } private Object invoke_L6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { - if (test.invoke(a0, a1, a2, a3, a4, a5)) - return target.invoke(a0, a1, a2, a3, a4, a5); - return fallback.invoke(a0, a1, a2, a3, a4, a5); + if (test.invokeExact(a0, a1, a2, a3, a4, a5)) + return target.invokeExact(a0, a1, a2, a3, a4, a5); + return fallback.invokeExact(a0, a1, a2, a3, a4, a5); } private Object invoke_L7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { - if (test.invoke(a0, a1, a2, a3, a4, a5, a6)) - return target.invoke(a0, a1, a2, a3, a4, a5, a6); - return fallback.invoke(a0, a1, a2, a3, a4, a5, a6); + if (test.invokeExact(a0, a1, a2, a3, a4, a5, a6)) + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6); + return fallback.invokeExact(a0, a1, a2, a3, a4, a5, a6); } private Object invoke_L8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { - if (test.invoke(a0, a1, a2, a3, a4, a5, a6, a7)) - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7); - return fallback.invoke(a0, a1, a2, a3, a4, a5, a6, a7); + if (test.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7)) + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7); + return fallback.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7); } static MethodHandle[] makeInvokes() { ArrayList invokes = new ArrayList(); @@ -880,26 +1041,7 @@ public abstract class MethodHandleImpl { MethodHandle test, MethodHandle target, MethodHandle fallback) { - Access.check(token); - MethodType type = target.type(); - int nargs = type.parameterCount(); - if (nargs < GuardWithTest.INVOKES.length) { - MethodType gtype = type.generic(); - MethodHandle gtest = convertArguments(token, test, gtype.changeReturnType(boolean.class), test.type(), null); - MethodHandle gtarget = convertArguments(token, target, gtype, type, null); - MethodHandle gfallback = convertArguments(token, fallback, gtype, type, null); - if (gtest == null || gtarget == null || gfallback == null) return null; - MethodHandle gguard = new GuardWithTest(gtest, gtarget, gfallback); - return convertArguments(token, gguard, type, gtype, null); - } else { - MethodType gtype = MethodType.genericMethodType(0, true); - MethodHandle gtest = spreadArguments(token, test, gtype.changeReturnType(boolean.class), 0); - MethodHandle gtarget = spreadArguments(token, target, gtype, 0); - MethodHandle gfallback = spreadArguments(token, fallback, gtype, 0); - MethodHandle gguard = new GuardWithTest(GuardWithTest.VARARGS_INVOKE, gtest, gtarget, gfallback); - if (gtest == null || gtarget == null || gfallback == null) return null; - return collectArguments(token, gguard, type, 0, null); - } + return GuardWithTest.make(token, test, target, fallback); } private static class GuardWithCatch extends JavaMethodHandle { @@ -922,82 +1064,82 @@ public abstract class MethodHandleImpl { } private Object invoke_V(Object... av) throws Throwable { try { - return target.invoke(av); + return target.invokeExact(av); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, av); + return catcher.invokeExact(t, av); } } private Object invoke_L0() throws Throwable { try { - return target.invoke(); + return target.invokeExact(); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t); + return catcher.invokeExact(t); } } private Object invoke_L1(Object a0) throws Throwable { try { - return target.invoke(a0); + return target.invokeExact(a0); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, a0); + return catcher.invokeExact(t, a0); } } private Object invoke_L2(Object a0, Object a1) throws Throwable { try { - return target.invoke(a0, a1); + return target.invokeExact(a0, a1); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, a0, a1); + return catcher.invokeExact(t, a0, a1); } } private Object invoke_L3(Object a0, Object a1, Object a2) throws Throwable { try { - return target.invoke(a0, a1, a2); + return target.invokeExact(a0, a1, a2); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, a0, a1, a2); + return catcher.invokeExact(t, a0, a1, a2); } } private Object invoke_L4(Object a0, Object a1, Object a2, Object a3) throws Throwable { try { - return target.invoke(a0, a1, a2, a3); + return target.invokeExact(a0, a1, a2, a3); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, a0, a1, a2, a3); + return catcher.invokeExact(t, a0, a1, a2, a3); } } private Object invoke_L5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { try { - return target.invoke(a0, a1, a2, a3, a4); + return target.invokeExact(a0, a1, a2, a3, a4); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, a0, a1, a2, a3, a4); + return catcher.invokeExact(t, a0, a1, a2, a3, a4); } } private Object invoke_L6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { try { - return target.invoke(a0, a1, a2, a3, a4, a5); + return target.invokeExact(a0, a1, a2, a3, a4, a5); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, a0, a1, a2, a3, a4, a5); + return catcher.invokeExact(t, a0, a1, a2, a3, a4, a5); } } private Object invoke_L7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { try { - return target.invoke(a0, a1, a2, a3, a4, a5, a6); + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, a0, a1, a2, a3, a4, a5, a6); + return catcher.invokeExact(t, a0, a1, a2, a3, a4, a5, a6); } } private Object invoke_L8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { try { - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7); + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7); } catch (Throwable t) { if (!exType.isInstance(t)) throw t; - return catcher.invoke(t, a0, a1, a2, a3, a4, a5, a6, a7); + return catcher.invokeExact(t, a0, a1, a2, a3, a4, a5, a6, a7); } } static MethodHandle[] makeInvokes() { @@ -1106,4 +1248,14 @@ public abstract class MethodHandleImpl { throw new InternalError("unexpected code "+code+": "+message); } } + + // Linkage support: + public static void registerBootstrap(Access token, Class callerClass, MethodHandle bootstrapMethod) { + Access.check(token); + MethodHandleNatives.registerBootstrap(callerClass, bootstrapMethod); + } + public static MethodHandle getBootstrap(Access token, Class callerClass) { + Access.check(token); + return MethodHandleNatives.getBootstrap(callerClass); + } } diff --git a/src/share/classes/sun/dyn/MethodHandleNatives.java b/src/share/classes/sun/dyn/MethodHandleNatives.java index 0e8d6c045c49aefd65a235e11196e7e6c8944a73..84470c8a870b923f6c4baed7389b448516ab69e3 100644 --- a/src/share/classes/sun/dyn/MethodHandleNatives.java +++ b/src/share/classes/sun/dyn/MethodHandleNatives.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2010, 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 @@ -28,12 +28,16 @@ package sun.dyn; import java.dyn.CallSite; import java.dyn.MethodHandle; import java.dyn.MethodType; +import java.dyn.MethodHandles.Lookup; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; import static sun.dyn.MethodHandleNatives.Constants.*; +import static sun.dyn.MethodHandleImpl.IMPL_LOOKUP; /** * The JVM interface for the method handles package is all here. + * This is an interface internal and private to an implemetantion of JSR 292. + * This class is not part of the JSR 292 standard. * @author jrose */ class MethodHandleNatives { @@ -60,8 +64,14 @@ class MethodHandleNatives { /** Initialize a method type, once per form. */ static native void init(MethodType self); + /** Tell the JVM about a class's bootstrap method. */ + static native void registerBootstrap(Class caller, MethodHandle bootstrapMethod); + + /** Ask the JVM about a class's bootstrap method. */ + static native MethodHandle getBootstrap(Class caller); + /** Tell the JVM that we need to change the target of an invokedynamic. */ - static native void linkCallSite(CallSite site, MethodHandle target); + static native void setCallSiteTarget(CallSite site, MethodHandle target); /** Fetch the vmtarget field. * It will be sanitized as necessary to avoid exposing non-Java references. @@ -114,22 +124,28 @@ class MethodHandleNatives { */ static final int JVM_STACK_MOVE_UNIT; + /** Which conv-ops are implemented by the JVM? */ + static final int CONV_OP_IMPLEMENTED_MASK; + private static native void registerNatives(); static { boolean JVM_SUPPORT_; int JVM_PUSH_LIMIT_; int JVM_STACK_MOVE_UNIT_; + int CONV_OP_IMPLEMENTED_MASK_; try { registerNatives(); JVM_SUPPORT_ = true; JVM_PUSH_LIMIT_ = getConstant(Constants.GC_JVM_PUSH_LIMIT); JVM_STACK_MOVE_UNIT_ = getConstant(Constants.GC_JVM_STACK_MOVE_UNIT); + CONV_OP_IMPLEMENTED_MASK_ = getConstant(Constants.GC_CONV_OP_IMPLEMENTED_MASK); //sun.reflect.Reflection.registerMethodsToFilter(MethodHandleImpl.class, "init"); } catch (UnsatisfiedLinkError ee) { // ignore; if we use init() methods later we'll see linkage errors JVM_SUPPORT_ = false; JVM_PUSH_LIMIT_ = 3; // arbitrary JVM_STACK_MOVE_UNIT_ = -1; // arbitrary + CONV_OP_IMPLEMENTED_MASK_ = 0; //System.out.println("Warning: Running with JVM_SUPPORT=false"); //System.out.println(ee); JVM_SUPPORT = JVM_SUPPORT_; @@ -140,6 +156,9 @@ class MethodHandleNatives { JVM_SUPPORT = JVM_SUPPORT_; JVM_PUSH_LIMIT = JVM_PUSH_LIMIT_; JVM_STACK_MOVE_UNIT = JVM_STACK_MOVE_UNIT_; + if (CONV_OP_IMPLEMENTED_MASK_ == 0) + CONV_OP_IMPLEMENTED_MASK_ = DEFAULT_CONV_OP_IMPLEMENTED_MASK; + CONV_OP_IMPLEMENTED_MASK = CONV_OP_IMPLEMENTED_MASK_; } // All compile-time constants go here. @@ -149,7 +168,8 @@ class MethodHandleNatives { // MethodHandleImpl static final int // for getConstant GC_JVM_PUSH_LIMIT = 0, - GC_JVM_STACK_MOVE_UNIT = 1; + GC_JVM_STACK_MOVE_UNIT = 1, + GC_CONV_OP_IMPLEMENTED_MASK = 2; static final int ETF_HANDLE_OR_METHOD_NAME = 0, // all available data (immediate MH or method) ETF_DIRECT_HANDLE = 1, // ultimate method handle (will be a DMH, may be self) @@ -206,9 +226,8 @@ class MethodHandleNatives { CONV_STACK_MOVE_MASK = (1 << (32 - CONV_STACK_MOVE_SHIFT)) - 1; /** Which conv-ops are implemented by the JVM? */ - static final int CONV_OP_IMPLEMENTED_MASK = - // TODO: The following expression should be replaced by - // a JVM query. + static final int DEFAULT_CONV_OP_IMPLEMENTED_MASK = + // Value to use if the corresponding JVM query fails. ((1< rtype, Class[] ptypes) { + MethodType.genericMethodType(0); // trigger initialization + return MethodTypeImpl.makeImpl(Access.TOKEN, rtype, ptypes, true); + } + + /** + * The JVM is resolving a CONSTANT_MethodHandle CP entry. And it wants our help. + * It will make an up-call to this method. (Do not change the name or signature.) + */ + static MethodHandle linkMethodHandleConstant(Class callerClass, int refKind, + Class defc, String name, Object type) { + Lookup lookup = IMPL_LOOKUP.in(callerClass); + switch (refKind) { + case REF_getField: return lookup.findGetter( defc, name, (Class) type ); + case REF_getStatic: return lookup.findStaticGetter( defc, name, (Class) type ); + case REF_putField: return lookup.findSetter( defc, name, (Class) type ); + case REF_putStatic: return lookup.findStaticSetter( defc, name, (Class) type ); + case REF_invokeVirtual: return lookup.findVirtual( defc, name, (MethodType) type ); + case REF_invokeStatic: return lookup.findStatic( defc, name, (MethodType) type ); + case REF_invokeSpecial: return lookup.findSpecial( defc, name, (MethodType) type, callerClass ); + case REF_newInvokeSpecial: return lookup.findConstructor( defc, (MethodType) type ); + case REF_invokeInterface: return lookup.findVirtual( defc, name, (MethodType) type ); + } + throw new IllegalArgumentException("bad MethodHandle constant "+name+" : "+type); + } } diff --git a/src/share/classes/sun/dyn/MethodTypeImpl.java b/src/share/classes/sun/dyn/MethodTypeImpl.java index 5ec50e9a38683ea23aa028f55b34df5a169eabf0..0a318148a7315835ae18b7ec27a44fc46d4d1768 100644 --- a/src/share/classes/sun/dyn/MethodTypeImpl.java +++ b/src/share/classes/sun/dyn/MethodTypeImpl.java @@ -88,6 +88,11 @@ public class MethodTypeImpl { } static private MethodTypeFriend METHOD_TYPE_FRIEND; + static MethodType makeImpl(Access token, Class rtype, Class[] ptypes, boolean trusted) { + Access.check(token); + return METHOD_TYPE_FRIEND.makeImpl(rtype, ptypes, trusted); + } + protected MethodTypeImpl(MethodType erasedType) { this.erasedType = erasedType; @@ -233,8 +238,10 @@ public class MethodTypeImpl { return primsAtEnd = t; // known to have a mix of 2 or 3 of ref, int, long - return primsAtEnd = reorderParameters(t, primsAtEndOrder(t), null); - + int[] reorder = primsAtEndOrder(t); + ct = reorderParameters(t, reorder, null); + //System.out.println("t="+t+" / reorder="+java.util.Arrays.toString(reorder)+" => "+ct); + return primsAtEnd = ct; } /** Compute a new ordering of parameters so that all references @@ -273,7 +280,8 @@ public class MethodTypeImpl { else if (!hasTwoArgSlots(pt)) ord = ifill++; else ord = lfill++; if (ord != i) changed = true; - paramOrder[i] = ord; + assert(paramOrder[ord] == 0); + paramOrder[ord] = i; } assert(rfill == argc - pac && ifill == argc - lac && lfill == argc); if (!changed) { @@ -292,15 +300,15 @@ public class MethodTypeImpl { if (newParamOrder == null) return mt; // no-op reordering Class[] ptypes = METHOD_TYPE_FRIEND.ptypes(mt); Class[] ntypes = new Class[newParamOrder.length]; - int ordMax = ptypes.length + (moreParams == null ? 0 : moreParams.length); + int maxParam = ptypes.length + (moreParams == null ? 0 : moreParams.length); boolean changed = (ntypes.length != ptypes.length); for (int i = 0; i < newParamOrder.length; i++) { - int ord = newParamOrder[i]; - if (ord != i) changed = true; + int param = newParamOrder[i]; + if (param != i) changed = true; Class nt; - if (ord < ptypes.length) nt = ptypes[ord]; - else if (ord == ordMax) nt = mt.returnType(); - else nt = moreParams[ord - ptypes.length]; + if (param < ptypes.length) nt = ptypes[param]; + else if (param == maxParam) nt = mt.returnType(); + else nt = moreParams[param - ptypes.length]; ntypes[i] = nt; } if (!changed) return mt; diff --git a/src/share/classes/sun/dyn/SpreadGeneric.java b/src/share/classes/sun/dyn/SpreadGeneric.java index bbdac5a3a0feffebeca960e07417be355220f068..e88611c3f2f1799035de4dffd40d9142e9ff6ff6 100644 --- a/src/share/classes/sun/dyn/SpreadGeneric.java +++ b/src/share/classes/sun/dyn/SpreadGeneric.java @@ -281,12 +281,12 @@ class SpreadGeneric { protected xS2(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected xS2 makeInstance(SpreadGeneric outer, MethodHandle t) { return new xS2(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object av) throws Throwable { av = super.check(av,0); - return target.invoke(a0, a1)); } + return target.invokeExact(a0, a1)); } protected Object invoke_S1(Object a0, Object av) throws Throwable { av = super.check(av,1); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0)); } protected Object invoke_S2(Object a0, Object av) throws Throwable { av = super.check(av,1); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1)); } } // */ @@ -304,10 +304,10 @@ class genclasses { " protected @cat@(SpreadGeneric outer, MethodHandle t) { super(outer, t); }", " protected @cat@ makeInstance(SpreadGeneric outer, MethodHandle t) { return new @cat@(outer, t); }", " protected Object invoke_S0(@Tvav,@Object av) throws Throwable { av = super.check(av, 0);", - " return target.invoke(@av@); }", + " return target.invokeExact(@av@); }", " //@each-S@", " protected Object invoke_S@S@(@Tvav,@Object av) throws Throwable { av = super.check(av, @S@);", - " return target.invoke(@av,@@sv@); }", + " return target.invokeExact(@av,@@sv@); }", " //@end-S@", " }", } }; @@ -418,16 +418,16 @@ class genclasses { protected S0(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S0 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S0(outer, t); } protected Object invoke_S0(Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(); } + return target.invokeExact(); } } static class S1 extends Adapter { protected S1(SpreadGeneric outer) { super(outer); } // to build prototype protected S1(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S1 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S1(outer, t); } protected Object invoke_S0(Object a0, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0); } + return target.invokeExact(a0); } protected Object invoke_S1(Object av) throws Throwable { av = super.check(av, 1); - return target.invoke( + return target.invokeExact( super.select(av,0)); } } static class S2 extends Adapter { @@ -435,12 +435,12 @@ class genclasses { protected S2(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S2 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S2(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1); } + return target.invokeExact(a0, a1); } protected Object invoke_S1(Object a0, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0)); } protected Object invoke_S2(Object av) throws Throwable { av = super.check(av, 2); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1)); } } static class S3 extends Adapter { @@ -448,15 +448,15 @@ class genclasses { protected S3(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S3 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S3(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object a2, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1, a2); } + return target.invokeExact(a0, a1, a2); } protected Object invoke_S1(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, a1, + return target.invokeExact(a0, a1, super.select(av,0)); } protected Object invoke_S2(Object a0, Object av) throws Throwable { av = super.check(av, 2); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0), super.select(av,1)); } protected Object invoke_S3(Object av) throws Throwable { av = super.check(av, 3); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1), super.select(av,2)); } } static class S4 extends Adapter { @@ -464,18 +464,18 @@ class genclasses { protected S4(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S4 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S4(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object a2, Object a3, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1, a2, a3); } + return target.invokeExact(a0, a1, a2, a3); } protected Object invoke_S1(Object a0, Object a1, Object a2, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, a1, a2, + return target.invokeExact(a0, a1, a2, super.select(av,0)); } protected Object invoke_S2(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 2); - return target.invoke(a0, a1, + return target.invokeExact(a0, a1, super.select(av,0), super.select(av,1)); } protected Object invoke_S3(Object a0, Object av) throws Throwable { av = super.check(av, 3); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0), super.select(av,1), super.select(av,2)); } protected Object invoke_S4(Object av) throws Throwable { av = super.check(av, 4); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3)); } } static class S5 extends Adapter { @@ -483,21 +483,21 @@ class genclasses { protected S5(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S5 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S5(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object a2, Object a3, Object a4, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1, a2, a3, a4); } + return target.invokeExact(a0, a1, a2, a3, a4); } protected Object invoke_S1(Object a0, Object a1, Object a2, Object a3, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, a1, a2, a3, + return target.invokeExact(a0, a1, a2, a3, super.select(av,0)); } protected Object invoke_S2(Object a0, Object a1, Object a2, Object av) throws Throwable { av = super.check(av, 2); - return target.invoke(a0, a1, a2, + return target.invokeExact(a0, a1, a2, super.select(av,0), super.select(av,1)); } protected Object invoke_S3(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 3); - return target.invoke(a0, a1, + return target.invokeExact(a0, a1, super.select(av,0), super.select(av,1), super.select(av,2)); } protected Object invoke_S4(Object a0, Object av) throws Throwable { av = super.check(av, 4); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3)); } protected Object invoke_S5(Object av) throws Throwable { av = super.check(av, 5); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4)); } } @@ -506,25 +506,25 @@ class genclasses { protected S6(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S6 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S6(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1, a2, a3, a4, a5); } + return target.invokeExact(a0, a1, a2, a3, a4, a5); } protected Object invoke_S1(Object a0, Object a1, Object a2, Object a3, Object a4, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, a1, a2, a3, a4, + return target.invokeExact(a0, a1, a2, a3, a4, super.select(av,0)); } protected Object invoke_S2(Object a0, Object a1, Object a2, Object a3, Object av) throws Throwable { av = super.check(av, 2); - return target.invoke(a0, a1, a2, a3, + return target.invokeExact(a0, a1, a2, a3, super.select(av,0), super.select(av,1)); } protected Object invoke_S3(Object a0, Object a1, Object a2, Object av) throws Throwable { av = super.check(av, 3); - return target.invoke(a0, a1, a2, + return target.invokeExact(a0, a1, a2, super.select(av,0), super.select(av,1), super.select(av,2)); } protected Object invoke_S4(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 4); - return target.invoke(a0, a1, + return target.invokeExact(a0, a1, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3)); } protected Object invoke_S5(Object a0, Object av) throws Throwable { av = super.check(av, 5); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4)); } protected Object invoke_S6(Object av) throws Throwable { av = super.check(av, 6); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5)); } } @@ -533,29 +533,29 @@ class genclasses { protected S7(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S7 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S7(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1, a2, a3, a4, a5, a6); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6); } protected Object invoke_S1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, a1, a2, a3, a4, a5, + return target.invokeExact(a0, a1, a2, a3, a4, a5, super.select(av,0)); } protected Object invoke_S2(Object a0, Object a1, Object a2, Object a3, Object a4, Object av) throws Throwable { av = super.check(av, 2); - return target.invoke(a0, a1, a2, a3, a4, + return target.invokeExact(a0, a1, a2, a3, a4, super.select(av,0), super.select(av,1)); } protected Object invoke_S3(Object a0, Object a1, Object a2, Object a3, Object av) throws Throwable { av = super.check(av, 3); - return target.invoke(a0, a1, a2, a3, + return target.invokeExact(a0, a1, a2, a3, super.select(av,0), super.select(av,1), super.select(av,2)); } protected Object invoke_S4(Object a0, Object a1, Object a2, Object av) throws Throwable { av = super.check(av, 4); - return target.invoke(a0, a1, a2, + return target.invokeExact(a0, a1, a2, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3)); } protected Object invoke_S5(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 5); - return target.invoke(a0, a1, + return target.invokeExact(a0, a1, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4)); } protected Object invoke_S6(Object a0, Object av) throws Throwable { av = super.check(av, 6); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5)); } protected Object invoke_S7(Object av) throws Throwable { av = super.check(av, 7); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6)); } } @@ -564,33 +564,33 @@ class genclasses { protected S8(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S8 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S8(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7); } protected Object invoke_S1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, super.select(av,0)); } protected Object invoke_S2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object av) throws Throwable { av = super.check(av, 2); - return target.invoke(a0, a1, a2, a3, a4, a5, + return target.invokeExact(a0, a1, a2, a3, a4, a5, super.select(av,0), super.select(av,1)); } protected Object invoke_S3(Object a0, Object a1, Object a2, Object a3, Object a4, Object av) throws Throwable { av = super.check(av, 3); - return target.invoke(a0, a1, a2, a3, a4, + return target.invokeExact(a0, a1, a2, a3, a4, super.select(av,0), super.select(av,1), super.select(av,2)); } protected Object invoke_S4(Object a0, Object a1, Object a2, Object a3, Object av) throws Throwable { av = super.check(av, 4); - return target.invoke(a0, a1, a2, a3, + return target.invokeExact(a0, a1, a2, a3, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3)); } protected Object invoke_S5(Object a0, Object a1, Object a2, Object av) throws Throwable { av = super.check(av, 5); - return target.invoke(a0, a1, a2, + return target.invokeExact(a0, a1, a2, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4)); } protected Object invoke_S6(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 6); - return target.invoke(a0, a1, + return target.invokeExact(a0, a1, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5)); } protected Object invoke_S7(Object a0, Object av) throws Throwable { av = super.check(av, 7); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6)); } protected Object invoke_S8(Object av) throws Throwable { av = super.check(av, 8); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6), super.select(av,7)); } } @@ -599,37 +599,37 @@ class genclasses { protected S9(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S9 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S9(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object invoke_S1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, super.select(av,0)); } protected Object invoke_S2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object av) throws Throwable { av = super.check(av, 2); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, super.select(av,0), super.select(av,1)); } protected Object invoke_S3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object av) throws Throwable { av = super.check(av, 3); - return target.invoke(a0, a1, a2, a3, a4, a5, + return target.invokeExact(a0, a1, a2, a3, a4, a5, super.select(av,0), super.select(av,1), super.select(av,2)); } protected Object invoke_S4(Object a0, Object a1, Object a2, Object a3, Object a4, Object av) throws Throwable { av = super.check(av, 4); - return target.invoke(a0, a1, a2, a3, a4, + return target.invokeExact(a0, a1, a2, a3, a4, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3)); } protected Object invoke_S5(Object a0, Object a1, Object a2, Object a3, Object av) throws Throwable { av = super.check(av, 5); - return target.invoke(a0, a1, a2, a3, + return target.invokeExact(a0, a1, a2, a3, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4)); } protected Object invoke_S6(Object a0, Object a1, Object a2, Object av) throws Throwable { av = super.check(av, 6); - return target.invoke(a0, a1, a2, + return target.invokeExact(a0, a1, a2, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5)); } protected Object invoke_S7(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 7); - return target.invoke(a0, a1, + return target.invokeExact(a0, a1, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6)); } protected Object invoke_S8(Object a0, Object av) throws Throwable { av = super.check(av, 8); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6), super.select(av,7)); } protected Object invoke_S9(Object av) throws Throwable { av = super.check(av, 9); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6), super.select(av,7), super.select(av,8)); } @@ -639,42 +639,42 @@ class genclasses { protected S10(SpreadGeneric outer, MethodHandle t) { super(outer, t); } protected S10 makeInstance(SpreadGeneric outer, MethodHandle t) { return new S10(outer, t); } protected Object invoke_S0(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9, Object av) throws Throwable { av = super.check(av, 0); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object invoke_S1(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object av) throws Throwable { av = super.check(av, 1); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, a8, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, a8, super.select(av,0)); } protected Object invoke_S2(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object av) throws Throwable { av = super.check(av, 2); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, a7, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7, super.select(av,0), super.select(av,1)); } protected Object invoke_S3(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object av) throws Throwable { av = super.check(av, 3); - return target.invoke(a0, a1, a2, a3, a4, a5, a6, + return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, super.select(av,0), super.select(av,1), super.select(av,2)); } protected Object invoke_S4(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object av) throws Throwable { av = super.check(av, 4); - return target.invoke(a0, a1, a2, a3, a4, a5, + return target.invokeExact(a0, a1, a2, a3, a4, a5, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3)); } protected Object invoke_S5(Object a0, Object a1, Object a2, Object a3, Object a4, Object av) throws Throwable { av = super.check(av, 5); - return target.invoke(a0, a1, a2, a3, a4, + return target.invokeExact(a0, a1, a2, a3, a4, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4)); } protected Object invoke_S6(Object a0, Object a1, Object a2, Object a3, Object av) throws Throwable { av = super.check(av, 6); - return target.invoke(a0, a1, a2, a3, + return target.invokeExact(a0, a1, a2, a3, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5)); } protected Object invoke_S7(Object a0, Object a1, Object a2, Object av) throws Throwable { av = super.check(av, 7); - return target.invoke(a0, a1, a2, + return target.invokeExact(a0, a1, a2, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6)); } protected Object invoke_S8(Object a0, Object a1, Object av) throws Throwable { av = super.check(av, 8); - return target.invoke(a0, a1, + return target.invokeExact(a0, a1, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6), super.select(av,7)); } protected Object invoke_S9(Object a0, Object av) throws Throwable { av = super.check(av, 9); - return target.invoke(a0, + return target.invokeExact(a0, super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6), super.select(av,7), super.select(av,8)); } protected Object invoke_S10(Object av) throws Throwable { av = super.check(av, 10); - return target.invoke( + return target.invokeExact( super.select(av,0), super.select(av,1), super.select(av,2), super.select(av,3), super.select(av,4), super.select(av,5), super.select(av,6), super.select(av,7), super.select(av,8), super.select(av,9)); } diff --git a/src/share/classes/sun/dyn/ToGeneric.java b/src/share/classes/sun/dyn/ToGeneric.java index 45744841bc717114081cd89f0b40f1a56ef1da95..eaaa89bfa9b5e0a167c0205961e6c8cdf67c60b9 100644 --- a/src/share/classes/sun/dyn/ToGeneric.java +++ b/src/share/classes/sun/dyn/ToGeneric.java @@ -99,12 +99,12 @@ class ToGeneric { // reordering is required; build on top of a simpler ToGeneric ToGeneric va2 = ToGeneric.of(primsAtEnd); this.adapter = va2.adapter; + if (true) throw new UnsupportedOperationException("NYI: primitive parameters must follow references; entryType = "+entryType); this.entryPoint = MethodHandleImpl.convertArguments(Access.TOKEN, va2.entryPoint, primsAtEnd, entryType, primsAtEndOrder); // example: for entryType of (int,Object,Object), the reordered // type is (Object,Object,int) and the order is {1,2,0}, - // and putPAE is (mh,int0,obj1,obj2) => mh.invoke(obj1,obj2,int0) - if (true) throw new UnsupportedOperationException("NYI"); + // and putPAE is (mh,int0,obj1,obj2) => mh.invokeExact(obj1,obj2,int0) return; } @@ -341,7 +341,7 @@ class ToGeneric { @Override public String toString() { - return target.toString(); + return target == null ? "prototype:"+convert : target.toString(); } protected boolean isPrototype() { return target == null; } @@ -371,33 +371,33 @@ class ToGeneric { // { return new ThisType(entryPoint, convert, target); } // Code to run when the arguments (<= 4) have all been boxed. - protected Object target() throws Throwable { return invoker.invoke(target); } - protected Object target(Object a0) throws Throwable { return invoker.invoke(target, a0); } + protected Object target() throws Throwable { return invoker.invokeExact(target); } + protected Object target(Object a0) throws Throwable { return invoker.invokeExact(target, a0); } protected Object target(Object a0, Object a1) - throws Throwable { return invoker.invoke(target, a0, a1); } + throws Throwable { return invoker.invokeExact(target, a0, a1); } protected Object target(Object a0, Object a1, Object a2) - throws Throwable { return invoker.invoke(target, a0, a1, a2); } + throws Throwable { return invoker.invokeExact(target, a0, a1, a2); } protected Object target(Object a0, Object a1, Object a2, Object a3) - throws Throwable { return invoker.invoke(target, a0, a1, a2, a3); } + throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3); } /* - protected Object target_0(Object... av) throws Throwable { return invoker.invoke(target, av); } + protected Object target_0(Object... av) throws Throwable { return invoker.invokeExact(target, av); } protected Object target_1(Object a0, Object... av) - throws Throwable { return invoker.invoke(target, a0, (Object)av); } + throws Throwable { return invoker.invokeExact(target, a0, (Object)av); } protected Object target_2(Object a0, Object a1, Object... av) - throws Throwable { return invoker.invoke(target, a0, a1, (Object)av); } + throws Throwable { return invoker.invokeExact(target, a0, a1, (Object)av); } protected Object target_3(Object a0, Object a1, Object a2, Object... av) - throws Throwable { return invoker.invoke(target, a0, a1, a2, (Object)av); } + throws Throwable { return invoker.invokeExact(target, a0, a1, a2, (Object)av); } protected Object target_4(Object a0, Object a1, Object a2, Object a3, Object... av) - throws Throwable { return invoker.invoke(target, a0, a1, a2, a3, (Object)av); } + throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3, (Object)av); } // */ // (For more than 4 arguments, generate the code in the adapter itself.) // Code to run when the generic target has finished and produced a value. - protected Object return_L(Object res) throws Throwable { return convert.invoke(res); } - protected int return_I(Object res) throws Throwable { return convert.invoke(res); } - protected long return_J(Object res) throws Throwable { return convert.invoke(res); } - protected float return_F(Object res) throws Throwable { return convert.invoke(res); } - protected double return_D(Object res) throws Throwable { return convert.invoke(res); } + protected Object return_L(Object res) throws Throwable { return convert.invokeExact(res); } + protected int return_I(Object res) throws Throwable { return convert.invokeExact(res); } + protected long return_J(Object res) throws Throwable { return convert.invokeExact(res); } + protected float return_F(Object res) throws Throwable { return convert.invokeExact(res); } + protected double return_D(Object res) throws Throwable { return convert.invokeExact(res); } static private final String CLASS_PREFIX; // "sun.dyn.ToGeneric$" static { @@ -424,7 +424,7 @@ class ToGeneric { protected A1(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A1(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A1 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A1(e, i, c, t); } - protected Object target(Object a0) throws Throwable { return invoker.invoke(target, a0); } + protected Object target(Object a0) throws Throwable { return invoker.invokeExact(target, a0); } protected Object targetA1(Object a0) throws Throwable { return target(a0); } protected Object targetA1(int a0) throws Throwable { return target(a0); } protected Object targetA1(long a0) throws Throwable { return target(a0); } @@ -462,7 +462,7 @@ class genclasses { " protected @cat@(MethodHandle entryPoint) { super(entryPoint); } // to build prototype", " protected @cat@(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); }", " protected @cat@ makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new @cat@(e, i, c, t); }", - " protected Object target(@Ovav@) throws Throwable { return invoker.invoke(target, @av@); }", + " protected Object target(@Ovav@) throws Throwable { return invoker.invokeExact(target, @av@); }", " //@each-Tv@", " protected Object target@cat@(@Tvav@) throws Throwable { return target(@av@); }", " //@end-Tv@", @@ -622,7 +622,7 @@ class genclasses { protected A0(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A0(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A0 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A0(e, i, c, t); } - protected Object target() throws Throwable { return invoker.invoke(target); } + protected Object target() throws Throwable { return invoker.invokeExact(target); } protected Object targetA0() throws Throwable { return target(); } protected Object invoke_L() throws Throwable { return return_L(targetA0()); } protected int invoke_I() throws Throwable { return return_I(targetA0()); } @@ -634,7 +634,7 @@ class genclasses { protected A1(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A1(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A1 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A1(e, i, c, t); } - protected Object target(Object a0) throws Throwable { return invoker.invoke(target, a0); } + protected Object target(Object a0) throws Throwable { return invoker.invokeExact(target, a0); } protected Object targetA1(Object a0) throws Throwable { return target(a0); } protected Object targetA1(int a0) throws Throwable { return target(a0); } protected Object targetA1(long a0) throws Throwable { return target(a0); } @@ -658,7 +658,7 @@ class genclasses { protected A2(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A2(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A2 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A2(e, i, c, t); } - protected Object target(Object a0, Object a1) throws Throwable { return invoker.invoke(target, a0, a1); } + protected Object target(Object a0, Object a1) throws Throwable { return invoker.invokeExact(target, a0, a1); } protected Object targetA2(Object a0, Object a1) throws Throwable { return target(a0, a1); } protected Object targetA2(Object a0, int a1) throws Throwable { return target(a0, a1); } protected Object targetA2(int a0, int a1) throws Throwable { return target(a0, a1); } @@ -694,7 +694,7 @@ class genclasses { protected A3(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A3(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A3 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A3(e, i, c, t); } - protected Object target(Object a0, Object a1, Object a2) throws Throwable { return invoker.invoke(target, a0, a1, a2); } + protected Object target(Object a0, Object a1, Object a2) throws Throwable { return invoker.invokeExact(target, a0, a1, a2); } protected Object targetA3(Object a0, Object a1, Object a2) throws Throwable { return target(a0, a1, a2); } protected Object targetA3(Object a0, Object a1, int a2) throws Throwable { return target(a0, a1, a2); } protected Object targetA3(Object a0, int a1, int a2) throws Throwable { return target(a0, a1, a2); } @@ -743,7 +743,7 @@ class genclasses { protected A4(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A4(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A4 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A4(e, i, c, t); } - protected Object target(Object a0, Object a1, Object a2, Object a3) throws Throwable { return invoker.invoke(target, a0, a1, a2, a3); } + protected Object target(Object a0, Object a1, Object a2, Object a3) throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3); } protected Object targetA4(Object a0, Object a1, Object a2, Object a3) throws Throwable { return target(a0, a1, a2, a3); } protected Object targetA4(Object a0, Object a1, Object a2, int a3) throws Throwable { return target(a0, a1, a2, a3); } protected Object targetA4(Object a0, Object a1, int a2, int a3) throws Throwable { return target(a0, a1, a2, a3); } @@ -785,7 +785,7 @@ class genclasses { protected A5(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A5(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A5 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A5(e, i, c, t); } - protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return invoker.invoke(target, a0, a1, a2, a3, a4); } + protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3, a4); } protected Object targetA5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { return target(a0, a1, a2, a3, a4); } protected Object targetA5(Object a0, Object a1, Object a2, Object a3, int a4) throws Throwable { return target(a0, a1, a2, a3, a4); } protected Object targetA5(Object a0, Object a1, Object a2, int a3, int a4) throws Throwable { return target(a0, a1, a2, a3, a4); } @@ -836,7 +836,7 @@ class genclasses { protected A6(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A6(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A6 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A6(e, i, c, t); } - protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return invoker.invoke(target, a0, a1, a2, a3, a4, a5); } + protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3, a4, a5); } protected Object targetA6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { return target(a0, a1, a2, a3, a4, a5); } protected Object targetA6(Object a0, Object a1, Object a2, Object a3, Object a4, long a5) throws Throwable { return target(a0, a1, a2, a3, a4, a5); } protected Object targetA6(Object a0, Object a1, Object a2, Object a3, long a4, long a5) throws Throwable { return target(a0, a1, a2, a3, a4, a5); } @@ -870,7 +870,7 @@ class genclasses { protected A7(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A7(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A7 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A7(e, i, c, t); } - protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6); } + protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6); } protected Object targetA7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6); } protected Object targetA7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, long a6) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6); } protected Object targetA7(Object a0, Object a1, Object a2, Object a3, Object a4, long a5, long a6) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6); } @@ -908,7 +908,7 @@ class genclasses { protected A8(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A8(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A8 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A8(e, i, c, t); } - protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7); } + protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7); } protected Object targetA8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7); } protected Object targetA8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, long a7) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7); } protected Object targetA8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, long a6, long a7) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7); } @@ -950,7 +950,7 @@ class genclasses { protected A9(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A9(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A9 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A9(e, i, c, t); } - protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8); } + protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object targetA9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object targetA9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, long a8) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7, a8); } protected Object targetA9(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, long a7, long a8) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7, a8); } @@ -996,7 +996,7 @@ class genclasses { protected A10(MethodHandle entryPoint) { super(entryPoint); } // to build prototype protected A10(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { super(e, i, c, t); } protected A10 makeInstance(MethodHandle e, MethodHandle i, MethodHandle c, MethodHandle t) { return new A10(e, i, c, t); } - protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return invoker.invoke(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } + protected Object target(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return invoker.invokeExact(target, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object targetA10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object targetA10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, Object a8, long a9) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } protected Object targetA10(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7, long a8, long a9) throws Throwable { return target(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } diff --git a/src/share/classes/sun/dyn/package-info.java b/src/share/classes/sun/dyn/package-info.java index 3e3a544efd48d648fab89291075cd82d5205494f..f7fe3cfa43529073f66f027cf68ae2f8881af9c3 100644 --- a/src/share/classes/sun/dyn/package-info.java +++ b/src/share/classes/sun/dyn/package-info.java @@ -25,10 +25,6 @@ /** * Implementation details for JSR 292 RI, package java.dyn. - * This particular version is specific to Hotspot. - * There is also a backport version of this sub-package which uses reflection, - * and can therefore run (slowly) on older versions of Java. - * Other JVM vendors may create their own versions of this sub-package. * @author jrose */ diff --git a/src/share/classes/sun/dyn/util/ValueConversions.java b/src/share/classes/sun/dyn/util/ValueConversions.java index 2ce43bb4b7d3e00ee3d5ae75d14e127557dd04b6..90180c6e794a90f6d1ef9ca2ca054bbbdfd11577 100644 --- a/src/share/classes/sun/dyn/util/ValueConversions.java +++ b/src/share/classes/sun/dyn/util/ValueConversions.java @@ -655,7 +655,7 @@ public class ValueConversions { if (nargs < ARRAYS.length) return ARRAYS[nargs]; // else need to spin bytecode or do something else fancy - throw new UnsupportedOperationException("NYI"); + throw new UnsupportedOperationException("NYI: cannot form a varargs array of length "+nargs); } private static final List NO_ARGS_LIST = Arrays.asList(NO_ARGS_ARRAY); diff --git a/src/share/classes/sun/dyn/util/VerifyAccess.java b/src/share/classes/sun/dyn/util/VerifyAccess.java index ce05c858f64f65ef0d4fa97b5d64bf5ba54b17f5..13987dad9a998e62f410adf2230ad2d29e9abda2 100644 --- a/src/share/classes/sun/dyn/util/VerifyAccess.java +++ b/src/share/classes/sun/dyn/util/VerifyAccess.java @@ -26,12 +26,12 @@ package sun.dyn.util; import java.dyn.LinkagePermission; -import java.dyn.MethodHandles.Lookup; import java.dyn.NoAccessException; import java.lang.reflect.Modifier; import sun.dyn.MemberName; import sun.dyn.MethodHandleImpl; import sun.dyn.empty.Empty; +import static java.lang.reflect.Modifier.*; /** * This class centralizes information about the JVM's linkage access control. @@ -41,49 +41,105 @@ public class VerifyAccess { private VerifyAccess() { } // cannot instantiate + private static final int PACKAGE_ONLY = 0; + private static final int ALL_ACCESS_MODES = (PUBLIC|PRIVATE|PROTECTED|PACKAGE_ONLY); + /** - * Evaluate the JVM linkage rules for access to the given method on behalf of caller. - * Return non-null if and only if the given accessing class has at least partial - * privileges to invoke the given method. The return value {@code Object.class} - * denotes unlimited privileges. + * Evaluate the JVM linkage rules for access to the given method + * on behalf of a caller class which proposes to perform the access. + * Return true if the caller class has privileges to invoke a method + * or access a field with the given properties. + * This requires an accessibility check of the referencing class, + * plus an accessibility check of the member within the class, + * which depends on the member's modifier flags. *

- * Some circumstances require an additional check on the - * leading parameter (the receiver) of the method, if it is non-static. - * In the case of {@code invokespecial} ({@code isSpecialInvoke} is true), - * the leading parameter must be the accessing class or a subclass. - * In the case of a call to a {@code protected} method outside the same - * package, the same constraint applies. - * @param m the proposed callee - * @param isSpecialInvoke if true, a non-static method m is checked as if for {@code invokespecial} + * The relevant properties include the defining class ({@code defc}) + * of the member, and its modifier flags ({@code mods}). + * Also relevant is the class used to make the initial symbolic reference + * to the member ({@code refc}). If this latter class is not distinguished, + * the defining class should be passed for both arguments ({@code defc == refc}). + *

JVM Specification, 5.4.4 "Access Control"

+ * A field or method R is accessible to a class or interface D if + * and only if any of the following conditions is true:
    + *
  • R is public. + *
  • R is protected and is declared in a class C, and D is either + * a subclass of C or C itself. Furthermore, if R is not + * static, then the symbolic reference to R must contain a + * symbolic reference to a class T, such that T is either a + * subclass of D, a superclass of D or D itself. + *
  • R is either protected or has default access (that is, + * neither public nor protected nor private), and is declared + * by a class in the same runtime package as D. + *
  • R is private and is declared in D. + *
+ * This discussion of access control omits a related restriction + * on the target of a protected field access or method invocation + * (the target must be of class D or a subtype of D). That + * requirement is checked as part of the verification process + * (5.4.1); it is not part of link-time access control. + * @param refc the class used in the symbolic reference to the proposed member + * @param defc the class in which the proposed member is actually defined + * @param mods modifier flags for the proposed member * @param lookupClass the class for which the access check is being made - * @return null if the method is not accessible, else a receiver type constraint, else {@code Object.class} + * @return true iff the the accessing class can access such a member */ - public static Class isAccessible(Class defc, int mods, - Class lookupClass, boolean isSpecialInvoke) { - if (!isAccessible(defc, lookupClass)) - return null; - Class constraint = Object.class; - if (isSpecialInvoke && !Modifier.isStatic(mods)) { - constraint = lookupClass; + public static boolean isMemberAccessible(Class refc, // symbolic ref class + Class defc, // actual def class + int mods, // actual member mods + Class lookupClass) { + // Usually refc and defc are the same, but if they differ, verify them both. + if (refc != defc) { + if (!isClassAccessible(refc, lookupClass)) { + // Note that defc is verified in the switch below. + return false; + } + if ((mods & (ALL_ACCESS_MODES|STATIC)) == (PROTECTED|STATIC)) { + // Apply the special rules for refc here. + if (!isRelatedClass(refc, lookupClass)) + return isSamePackage(defc, lookupClass); + // If refc == defc, the call to isPublicSuperClass will do + // the whole job, since in that case refc (as defc) will be + // a superclass of the lookup class. + } + } + switch (mods & ALL_ACCESS_MODES) { + case PUBLIC: + if (refc != defc) return true; // already checked above + return isClassAccessible(refc, lookupClass); + case PROTECTED: + return isSamePackage(defc, lookupClass) || isPublicSuperClass(defc, lookupClass); + case PACKAGE_ONLY: + return isSamePackage(defc, lookupClass); + case PRIVATE: + // Loosened rules for privates follows access rules for inner classes. + return isSamePackageMember(defc, lookupClass); + default: + throw new IllegalArgumentException("bad modifiers: "+Modifier.toString(mods)); } - if (Modifier.isPublic(mods)) - return constraint; - if (Modifier.isPrivate(mods)) - return isSamePackageMember(defc, lookupClass) ? constraint : null; - if (isSamePackage(defc, lookupClass)) - return constraint; - if (Modifier.isProtected(mods) && defc.isAssignableFrom(lookupClass)) - return constraint; - // else it is private or package scoped, and not close enough - return null; + } + + static boolean isRelatedClass(Class refc, Class lookupClass) { + return (refc == lookupClass || + refc.isAssignableFrom(lookupClass) || + lookupClass.isAssignableFrom(refc)); + } + + static boolean isPublicSuperClass(Class defc, Class lookupClass) { + return isPublic(defc.getModifiers()) && defc.isAssignableFrom(lookupClass); } /** * Evaluate the JVM linkage rules for access to the given class on behalf of caller. + *

JVM Specification, 5.4.4 "Access Control"

+ * A class or interface C is accessible to a class or interface D + * if and only if either of the following conditions are true:
    + *
  • C is public. + *
  • C and D are members of the same runtime package. + *
*/ - public static boolean isAccessible(Class refc, Class lookupClass) { + public static boolean isClassAccessible(Class refc, Class lookupClass) { int mods = refc.getModifiers(); - if (Modifier.isPublic(mods)) + if (isPublic(mods)) return true; if (isSamePackage(lookupClass, refc)) return true; @@ -170,38 +226,4 @@ public class VerifyAccess { if (isSamePackage(requestingClass, subjectClass)) return; security.checkPermission(new LinkagePermission(permissionName, requestingClass)); } - - private static RuntimeException checkNameFailed(MemberName self, Lookup lookup, String comment) { - return new NoAccessException("cannot access from "+lookup+": "+self.toString()+": "+comment); - } - public static void checkName(MemberName self, Lookup lookup) { - Class lc = lookup.lookupClass(); - if (lc == null) return; // lookup is privileged - Class dc = self.getDeclaringClass(); - int samepkg = 0; - // First check the containing class. Must be public or local. - if (!Modifier.isPublic(dc.getModifiers())) { - if (lc != Empty.class) - samepkg = (isSamePackage(dc, lc) ? 1 : -1); - if (samepkg <= 0) - throw checkNameFailed(self, lookup, "class is not public"); - } - // At this point dc is known to be accessible. - if (self.isPublic()) { - return; - } else if (lc == Empty.class) { - throw checkNameFailed(self, lookup, "member is not public"); - } else if (self.isProtected()) { - if (dc.isAssignableFrom(lc)) return; - } else if (self.isPrivate()) { - if (isSamePackageMember(dc, lc)) return; - throw checkNameFailed(self, lookup, "member is private"); - } - // Fall-through handles the package-private and protected cases. - if (samepkg == 0) - samepkg = (isSamePackage(dc, lc) ? 1 : -1); - if (samepkg > 0) return; - throw checkNameFailed(self, lookup, - self.isProtected() ? "member is protected" : "member is private to package"); - } } diff --git a/src/share/classes/sun/io/ByteToCharISO2022.java b/src/share/classes/sun/io/ByteToCharISO2022.java index 4b2e21b56966ab1ef2d32b15d1010ce4fa521ccc..5fef812fd21d884cfe58ee2921d1025ada44203d 100644 --- a/src/share/classes/sun/io/ByteToCharISO2022.java +++ b/src/share/classes/sun/io/ByteToCharISO2022.java @@ -124,15 +124,15 @@ public abstract class ByteToCharISO2022 extends ByteToCharConverter switch(shiftFlag) { case SOFlag: tmpIndex = curSODes; - tmpConverter = (ByteToCharConverter [])SOConverter; + tmpConverter = SOConverter; break; case SS2Flag: tmpIndex = curSS2Des; - tmpConverter = (ByteToCharConverter [])SS2Converter; + tmpConverter = SS2Converter; break; case SS3Flag: tmpIndex = curSS3Des; - tmpConverter = (ByteToCharConverter [])SS3Converter; + tmpConverter = SS3Converter; break; } diff --git a/src/share/classes/sun/io/ByteToCharISO2022JP.java b/src/share/classes/sun/io/ByteToCharISO2022JP.java index 8000870fbba7068d13b8ee0dde4ddd1cbb632857..03027c24732bb80321133256c4969b5bd5514852 100644 --- a/src/share/classes/sun/io/ByteToCharISO2022JP.java +++ b/src/share/classes/sun/io/ByteToCharISO2022JP.java @@ -141,7 +141,7 @@ public class ByteToCharISO2022JP extends ByteToCharJIS0208 { } else { savedSize = 2; savedBytes[0] = (byte)byte1; - savedBytes[1] = (byte)input[readOff + inputSize]; + savedBytes[1] = input[readOff + inputSize]; inputSize++; } break; diff --git a/src/share/classes/sun/io/ByteToCharJISAutoDetect.java b/src/share/classes/sun/io/ByteToCharJISAutoDetect.java index 97a0e88280748ebc8d516ab7909a28651a2a6c31..8f00ef6c233a641d9396c6b39c1eda4bb531fe53 100644 --- a/src/share/classes/sun/io/ByteToCharJISAutoDetect.java +++ b/src/share/classes/sun/io/ByteToCharJISAutoDetect.java @@ -34,14 +34,12 @@ public class ByteToCharJISAutoDetect extends ByteToCharConverter { private final static int SJIS1B_MASK = 0x04; private final static int EUCJP_KANA1_MASK = 0x08; private final static int EUCJP_KANA2_MASK = 0x10; - private static byte[] maskTable1; - private static byte[] maskTable2; + private final static byte[] maskTable1 = JISAutoDetect.getByteMask1(); + private final static byte[] maskTable2 = JISAutoDetect.getByteMask2(); private final static int SS2 = 0x8e; private final static int SS3 = 0x8f; - private final static JISAutoDetect nioCoder = new JISAutoDetect(); - // SJISName is set to either "SJIS" or "MS932" private String SJISName; private String EUCJPName; @@ -57,8 +55,6 @@ public class ByteToCharJISAutoDetect extends ByteToCharConverter { defaultConv = new ByteToCharISO8859_1(); defaultConv.subChars = subChars; defaultConv.subMode = subMode; - maskTable1 = nioCoder.getByteMask1(); - maskTable2 = nioCoder.getByteMask2(); } public int flush(char [] output, int outStart, int outEnd) @@ -133,7 +129,7 @@ public class ByteToCharJISAutoDetect extends ByteToCharConverter { break; } if ((mask == SJIS2B_MASK) || (mask == SJIS1B_MASK) - || (nioCoder.canBeSJIS1B(firstmask) && secondmask == 0)) { + || (JISAutoDetect.canBeSJIS1B(firstmask) && secondmask == 0)) { convName = SJISName; break; } @@ -145,15 +141,15 @@ public class ByteToCharJISAutoDetect extends ByteToCharConverter { // character boundary. If we tried both // possibilities here, it might be able to be // determined correctly. - if ((byte1 == SS3) && nioCoder.canBeEUCJP(secondmask)) { + if ((byte1 == SS3) && JISAutoDetect.canBeEUCJP(secondmask)) { if (cnt+1 < inEnd) { int nextbyte = input[cnt+1] & 0xff; - if (! nioCoder.canBeEUCJP(maskTable2[nextbyte])) + if (! JISAutoDetect.canBeEUCJP(maskTable2[nextbyte])) convName = SJISName; } else convName = SJISName; } - if (nioCoder.canBeEUCKana(firstmask, secondmask)) + if (JISAutoDetect.canBeEUCKana(firstmask, secondmask)) euckana++; } else { if ((firstmask & SJIS1B_MASK) != 0) { diff --git a/src/share/classes/sun/io/CharToBytePCK.java b/src/share/classes/sun/io/CharToBytePCK.java index 0c877df0e575d399c8ac45dcd3dbbf1b16279a80..9a8d1a76cea142d872f746e2bcf3f518a6a41d16 100644 --- a/src/share/classes/sun/io/CharToBytePCK.java +++ b/src/share/classes/sun/io/CharToBytePCK.java @@ -66,7 +66,7 @@ public class CharToBytePCK extends CharToByteSJIS { switch (ch) { case '\u2015': - return (int)0x815C; + return 0x815C; case '\u2014': return 0; default: diff --git a/src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine b/src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine index 66b2ae9c61a1c705d1b24f42bbfe68db1b1234b2..607ff59051afc71eebd7198aec7ecb2813e947ef 100644 --- a/src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine +++ b/src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine @@ -1,5 +1,2 @@ -# Jules Rendering Engine module -sun.java2d.jules.JulesRenderingEngine - # Pisces Rendering Engine module -sun.java2d.pisces.PiscesRenderingEngine \ No newline at end of file +sun.java2d.pisces.PiscesRenderingEngine diff --git a/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java b/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java index da54a3d641afc08c812d1082f1e86d5000c0ac35..a5948881456f419194b13819c7d2e26913623727 100644 --- a/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java +++ b/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java @@ -171,10 +171,9 @@ public class DatagramSocketAdaptor // Must hold dc.blockingLock() // - private void receive(ByteBuffer bb) throws IOException { + private SocketAddress receive(ByteBuffer bb) throws IOException { if (timeout == 0) { - dc.receive(bb); - return; + return dc.receive(bb); } // Implement timeout with a selector @@ -183,8 +182,9 @@ public class DatagramSocketAdaptor dc.configureBlocking(false); try { int n; - if (dc.receive(bb) != null) - return; + SocketAddress sender; + if ((sender = dc.receive(bb)) != null) + return sender; sel = Util.getTemporarySelector(dc); sk = dc.register(sel, SelectionKey.OP_READ); long to = timeout; @@ -194,8 +194,8 @@ public class DatagramSocketAdaptor long st = System.currentTimeMillis(); int ns = sel.select(to); if (ns > 0 && sk.isReadable()) { - if (dc.receive(bb) != null) - return; + if ((sender = dc.receive(bb)) != null) + return sender; } sel.selectedKeys().remove(sk); to -= System.currentTimeMillis() - st; @@ -222,7 +222,8 @@ public class DatagramSocketAdaptor ByteBuffer bb = ByteBuffer.wrap(p.getData(), p.getOffset(), p.getLength()); - receive(bb); + SocketAddress sender = receive(bb); + p.setSocketAddress(sender); p.setLength(bb.position() - p.getOffset()); } } catch (IOException x) { diff --git a/src/share/classes/sun/nio/ch/ServerSocketAdaptor.java b/src/share/classes/sun/nio/ch/ServerSocketAdaptor.java index c1b3f3bf37394a3e42e6bee49efa7d119dc9a5bb..eff83e2bff7c563e1f2d5e28dbbc763f28faa892 100644 --- a/src/share/classes/sun/nio/ch/ServerSocketAdaptor.java +++ b/src/share/classes/sun/nio/ch/ServerSocketAdaptor.java @@ -144,11 +144,7 @@ public class ServerSocketAdaptor // package-private } public void close() throws IOException { - try { - ssc.close(); - } catch (Exception x) { - Net.translateException(x); - } + ssc.close(); } public ServerSocketChannel getChannel() { diff --git a/src/share/classes/sun/nio/ch/SocketAdaptor.java b/src/share/classes/sun/nio/ch/SocketAdaptor.java index 36c8d9f205829a9b77033827a84802b0ef6d0ce8..583835727e8c561b6e054b01f28291e5af16739a 100644 --- a/src/share/classes/sun/nio/ch/SocketAdaptor.java +++ b/src/share/classes/sun/nio/ch/SocketAdaptor.java @@ -404,11 +404,7 @@ public class SocketAdaptor } public void close() throws IOException { - try { - sc.close(); - } catch (Exception x) { - Net.translateToSocketException(x); - } + sc.close(); } public void shutdownInput() throws IOException { diff --git a/src/share/classes/sun/nio/cs/ext/DoubleByte.java b/src/share/classes/sun/nio/cs/ext/DoubleByte.java index f76c9cc7d739d5186a2d49b104212a41dac156ee..265e03c71f4cc75cc834724e88eb2e3ffbbb08a8 100644 --- a/src/share/classes/sun/nio/cs/ext/DoubleByte.java +++ b/src/share/classes/sun/nio/cs/ext/DoubleByte.java @@ -103,7 +103,7 @@ public class DoubleByte { public final static char[] B2C_UNMAPPABLE; static { B2C_UNMAPPABLE = new char[0x100]; - Arrays.fill(B2C_UNMAPPABLE, (char)UNMAPPABLE_DECODING); + Arrays.fill(B2C_UNMAPPABLE, UNMAPPABLE_DECODING); } public static class Decoder extends CharsetDecoder @@ -374,7 +374,7 @@ public class DoubleByte { static final char[] b2cSB; static { b2cSB = new char[0x100]; - Arrays.fill(b2cSB, (char)UNMAPPABLE_DECODING); + Arrays.fill(b2cSB, UNMAPPABLE_DECODING); } Decoder_EBCDIC_DBCSONLY(Charset cs, char[][] b2c, int b2Min, int b2Max) { super(cs, 0.5f, 1.0f, b2c, b2cSB, b2Min, b2Max); diff --git a/src/share/classes/sun/nio/cs/ext/EUC_JP.java b/src/share/classes/sun/nio/cs/ext/EUC_JP.java index 03de2483456108b17e918d018a9ae169cdb2b0f4..6443de39931537a46474e2bd81addc12d242eea3 100644 --- a/src/share/classes/sun/nio/cs/ext/EUC_JP.java +++ b/src/share/classes/sun/nio/cs/ext/EUC_JP.java @@ -79,8 +79,10 @@ public class EUC_JP JIS_X_0201.Decoder decoderJ0201; JIS_X_0212_Decoder decoderJ0212; - short[] j0208Index1; - String[] j0208Index2; + private static final short[] j0208Index1 = + JIS_X_0208_Decoder.getIndex1(); + private static final String[] j0208Index2 = + JIS_X_0208_Decoder.getIndex2(); protected Decoder(Charset cs) { super(cs); @@ -88,8 +90,6 @@ public class EUC_JP decoderJ0212 = new JIS_X_0212_Decoder(cs); start = 0xa1; end = 0xfe; - j0208Index1 = super.getIndex1(); - j0208Index2 = super.getIndex2(); } protected char decode0212(int byte1, int byte2) { return decoderJ0212.decodeDouble(byte1, byte2); @@ -238,8 +238,10 @@ public class EUC_JP JIS_X_0201.Encoder encoderJ0201; JIS_X_0212_Encoder encoderJ0212; - short[] j0208Index1; - String[] j0208Index2; + private static final short[] j0208Index1 = + JIS_X_0208_Encoder.getIndex1(); + private static final String[] j0208Index2 = + JIS_X_0208_Encoder.getIndex2(); private final Surrogate.Parser sgp = new Surrogate.Parser(); @@ -247,8 +249,6 @@ public class EUC_JP super(cs, 3.0f, 3.0f); encoderJ0201 = new JIS_X_0201.Encoder(cs); encoderJ0212 = new JIS_X_0212_Encoder(cs); - j0208Index1 = super.getIndex1(); - j0208Index2 = super.getIndex2(); } public boolean canEncode(char c) { diff --git a/src/share/classes/sun/nio/cs/ext/EUC_JP_LINUX.java b/src/share/classes/sun/nio/cs/ext/EUC_JP_LINUX.java index fbbd30b1324522b68fa286384df00158502d4016..480a4a74067893fcad16793b9722524212249c52 100644 --- a/src/share/classes/sun/nio/cs/ext/EUC_JP_LINUX.java +++ b/src/share/classes/sun/nio/cs/ext/EUC_JP_LINUX.java @@ -65,20 +65,18 @@ public class EUC_JP_LINUX private static class Decoder extends CharsetDecoder { JIS_X_0201.Decoder decoderJ0201; - JIS_X_0208_Decoder decodeMappingJ0208; protected final char REPLACE_CHAR='\uFFFD'; - short[] jis0208Index1; - String[] jis0208Index2; + private static final int start = 0xa1; + private static final int end = 0xfe; + private static final short[] jis0208Index1 = + JIS_X_0208_Decoder.getIndex1(); + private static final String[] jis0208Index2 = + JIS_X_0208_Decoder.getIndex2(); private Decoder(Charset cs) { super(cs, 1.0f, 1.0f); decoderJ0201 = new JIS_X_0201.Decoder(cs); - decodeMappingJ0208 = new JIS_X_0208_Decoder(cs); - decodeMappingJ0208.start = 0xa1; - decodeMappingJ0208.end = 0xfe; - jis0208Index1 = decodeMappingJ0208.getIndex1(); - jis0208Index2 = decodeMappingJ0208.getIndex2(); } protected char convSingleByte(int b) { @@ -93,11 +91,11 @@ public class EUC_JP_LINUX } if (((byte1 < 0) || (byte1 > jis0208Index1.length)) - || ((byte2 < decodeMappingJ0208.start) || (byte2 > decodeMappingJ0208.end))) + || ((byte2 < start) || (byte2 > end))) return REPLACE_CHAR; - int n = (jis0208Index1[byte1 - 0x80] & 0xf) * (decodeMappingJ0208.end - decodeMappingJ0208.start + 1) - + (byte2 - decodeMappingJ0208.start); + int n = (jis0208Index1[byte1 - 0x80] & 0xf) * (end - start + 1) + + (byte2 - start); return jis0208Index2[jis0208Index1[byte1 - 0x80] >> 4].charAt(n); } @@ -213,18 +211,16 @@ public class EUC_JP_LINUX private static class Encoder extends CharsetEncoder { JIS_X_0201.Encoder encoderJ0201; - JIS_X_0208_Encoder encoderJ0208; private final Surrogate.Parser sgp = new Surrogate.Parser(); - short[] jis0208Index1; - String[] jis0208Index2; + private static final short[] jis0208Index1 = + JIS_X_0208_Encoder.getIndex1(); + private static final String[] jis0208Index2 = + JIS_X_0208_Encoder.getIndex2(); private Encoder(Charset cs) { super(cs, 2.0f, 2.0f); encoderJ0201 = new JIS_X_0201.Encoder(cs); - encoderJ0208 = new JIS_X_0208_Encoder(cs); - jis0208Index1 = encoderJ0208.getIndex1(); - jis0208Index2 = encoderJ0208.getIndex2(); } public boolean canEncode(char c) { diff --git a/src/share/classes/sun/nio/cs/ext/EUC_JP_Open.java b/src/share/classes/sun/nio/cs/ext/EUC_JP_Open.java index 4043dc1ad26591ba81ce2a315f69db38b575b090..b36b76d3c75159670bec9df7598a8e8ec1d67fe3 100644 --- a/src/share/classes/sun/nio/cs/ext/EUC_JP_Open.java +++ b/src/share/classes/sun/nio/cs/ext/EUC_JP_Open.java @@ -75,8 +75,12 @@ public class EUC_JP_Open JIS_X_0212_Solaris_Decoder decodeMappingJ0212; JIS_X_0208_Solaris_Decoder decodeMappingJ0208; - short[] j0208Index1; - String[] j0208Index2; + private static final short[] j0208Index1 = + JIS_X_0208_Solaris_Decoder.getIndex1(); + private static final String[] j0208Index2 = + JIS_X_0208_Solaris_Decoder.getIndex2(); + private static final int start = 0xa1; + private static final int end = 0xfe; protected final char REPLACE_CHAR='\uFFFD'; @@ -84,11 +88,6 @@ public class EUC_JP_Open super(cs); decoderJ0201 = new JIS_X_0201.Decoder(cs); decodeMappingJ0212 = new JIS_X_0212_Solaris_Decoder(cs); - decodeMappingJ0208 = new JIS_X_0208_Solaris_Decoder(cs); - decodeMappingJ0208.start = 0xa1; - decodeMappingJ0208.end = 0xfe; - j0208Index1 = decodeMappingJ0208.getIndex1(); - j0208Index2 = decodeMappingJ0208.getIndex2(); } @@ -103,9 +102,9 @@ public class EUC_JP_Open } if (((byte1 < 0) - || (byte1 > decodeMappingJ0208.getIndex1().length)) - || ((byte2 < decodeMappingJ0208.start) - || (byte2 > decodeMappingJ0208.end))) + || (byte1 > j0208Index1.length)) + || ((byte2 < start) + || (byte2 > end))) return REPLACE_CHAR; char result = super.decodeDouble(byte1, byte2); @@ -113,8 +112,8 @@ public class EUC_JP_Open return result; } else { int n = (j0208Index1[byte1 - 0x80] & 0xf) * - (decodeMappingJ0208.end - decodeMappingJ0208.start + 1) - + (byte2 - decodeMappingJ0208.start); + (end - start + 1) + + (byte2 - start); return j0208Index2[j0208Index1[byte1 - 0x80] >> 4].charAt(n); } } @@ -125,10 +124,11 @@ public class EUC_JP_Open JIS_X_0201.Encoder encoderJ0201; JIS_X_0212_Solaris_Encoder encoderJ0212; - JIS_X_0208_Solaris_Encoder encoderJ0208; - short[] j0208Index1; - String[] j0208Index2; + private static final short[] j0208Index1 = + JIS_X_0208_Solaris_Encoder.getIndex1(); + private static final String[] j0208Index2 = + JIS_X_0208_Solaris_Encoder.getIndex2(); private final Surrogate.Parser sgp = new Surrogate.Parser(); @@ -136,9 +136,6 @@ public class EUC_JP_Open super(cs); encoderJ0201 = new JIS_X_0201.Encoder(cs); encoderJ0212 = new JIS_X_0212_Solaris_Encoder(cs); - encoderJ0208 = new JIS_X_0208_Solaris_Encoder(cs); - j0208Index1 = encoderJ0208.getIndex1(); - j0208Index2 = encoderJ0208.getIndex2(); } protected int encodeSingle(char inputChar, byte[] outputByte) { diff --git a/src/share/classes/sun/nio/cs/ext/EUC_TW.java b/src/share/classes/sun/nio/cs/ext/EUC_TW.java index 368b471906b039ef3272ab8a7ae284b8260c6846..a4ae8df6e98de04a71154f409ae257f2c461af55 100644 --- a/src/share/classes/sun/nio/cs/ext/EUC_TW.java +++ b/src/share/classes/sun/nio/cs/ext/EUC_TW.java @@ -423,7 +423,7 @@ public class EUC_TW extends Charset implements HistoricallyNamedCharset if (dst.remaining() < outSize) return CoderResult.OVERFLOW; for (int i = 0; i < outSize; i++) - dst.put((byte)bb[i]); + dst.put(bb[i]); mark += inSize; } return CoderResult.UNDERFLOW; diff --git a/src/share/classes/sun/nio/cs/ext/GB18030.java b/src/share/classes/sun/nio/cs/ext/GB18030.java index 20df56007ef3befcb2638de2f519d0a1b5f07aac..acbe23a36d6c74f5e49c7f08baeb53720adc2dd5 100644 --- a/src/share/classes/sun/nio/cs/ext/GB18030.java +++ b/src/share/classes/sun/nio/cs/ext/GB18030.java @@ -12339,7 +12339,7 @@ public class GB18030 int start = 0x40, end = 0xFE; if (((byte1 < 0) || (byte1 > index1.length)) || ((byte2 < start) || (byte2 > end))) - return (char)'\uFFFD'; + return '\uFFFD'; int n = (index1[byte1] & 0xf) * (end - start + 1) + (byte2 - start); return index2[index1[byte1] >> 4].charAt(n); diff --git a/src/share/classes/sun/nio/cs/ext/HKSCS.java b/src/share/classes/sun/nio/cs/ext/HKSCS.java index d2e118e01e9501c7c2b08ae38d0d5c15e959e860..69002ee2b82d660a5633f899c40085068e9579d0 100644 --- a/src/share/classes/sun/nio/cs/ext/HKSCS.java +++ b/src/share/classes/sun/nio/cs/ext/HKSCS.java @@ -43,7 +43,7 @@ public class HKSCS { private char[][] b2cBmp; private char[][] b2cSupp; - private static DoubleByte.Decoder big5Dec; + private DoubleByte.Decoder big5Dec; protected Decoder(Charset cs, DoubleByte.Decoder big5Dec, @@ -355,7 +355,7 @@ public class HKSCS { c2b[hi] = new char[0x100]; Arrays.fill(c2b[hi], (char)UNMAPPABLE_ENCODING); } - c2b[hi][c & 0xff] = (char)bb; + c2b[hi][c & 0xff] = bb; } c++; } diff --git a/src/share/classes/sun/nio/cs/ext/ISO2022.java b/src/share/classes/sun/nio/cs/ext/ISO2022.java index faf8036990ce864992096d947115402e995e47bb..ad4e5978b12beb30029d727d399842e659ec7d21 100644 --- a/src/share/classes/sun/nio/cs/ext/ISO2022.java +++ b/src/share/classes/sun/nio/cs/ext/ISO2022.java @@ -104,15 +104,15 @@ abstract class ISO2022 switch(shiftFlag) { case SOFlag: tmpIndex = curSODes; - tmpDecoder = (CharsetDecoder [])SODecoder; + tmpDecoder = SODecoder; break; case SS2Flag: tmpIndex = curSS2Des; - tmpDecoder = (CharsetDecoder [])SS2Decoder; + tmpDecoder = SS2Decoder; break; case SS3Flag: tmpIndex = curSS3Des; - tmpDecoder = (CharsetDecoder [])SS3Decoder; + tmpDecoder = SS3Decoder; break; } diff --git a/src/share/classes/sun/nio/cs/ext/JISAutoDetect.java b/src/share/classes/sun/nio/cs/ext/JISAutoDetect.java index 78007a02a089a12a20a4834bfb2e9821861bae56..e190bd587e31e124da33640f87cdca346d2cbe50 100644 --- a/src/share/classes/sun/nio/cs/ext/JISAutoDetect.java +++ b/src/share/classes/sun/nio/cs/ext/JISAutoDetect.java @@ -82,11 +82,11 @@ public class JISAutoDetect * with the sun.io JISAutoDetect implementation */ - public byte[] getByteMask1() { + public static byte[] getByteMask1() { return Decoder.maskTable1; } - public byte[] getByteMask2() { + public static byte[] getByteMask2() { return Decoder.maskTable2; } diff --git a/src/share/classes/sun/nio/cs/ext/PCK.java b/src/share/classes/sun/nio/cs/ext/PCK.java index a11a9dda5c157bc338bf348bff046296663fac5a..2c2387e0001bbf0153abeede7ddaf018097864ed 100644 --- a/src/share/classes/sun/nio/cs/ext/PCK.java +++ b/src/share/classes/sun/nio/cs/ext/PCK.java @@ -101,17 +101,15 @@ public class PCK private static class Encoder extends SJIS.Encoder { private JIS_X_0201.Encoder jis0201; - private JIS_X_0208_Solaris_Encoder jis0208; - short[] j0208Index1; - String[] j0208Index2; + private static final short[] j0208Index1 = + JIS_X_0208_Solaris_Encoder.getIndex1(); + private static final String[] j0208Index2 = + JIS_X_0208_Solaris_Encoder.getIndex2(); private Encoder(Charset cs) { super(cs); jis0201 = new JIS_X_0201.Encoder(cs); - jis0208 = new JIS_X_0208_Solaris_Encoder(cs); - j0208Index1 = jis0208.getIndex1(); - j0208Index2 = jis0208.getIndex2(); } protected int encodeDouble(char ch) { @@ -121,7 +119,7 @@ public class PCK switch (ch) { case '\u2015': - return (int)0x815C; + return 0x815C; case '\u2014': return 0; default: diff --git a/src/share/classes/sun/nio/cs/ext/SJIS.java b/src/share/classes/sun/nio/cs/ext/SJIS.java index 65a03aea1e6366ff330fd06c3085b12b9ed82295..1f8a8ea0ce2cfac3104fd1bcb41ec9ab60c16b6c 100644 --- a/src/share/classes/sun/nio/cs/ext/SJIS.java +++ b/src/share/classes/sun/nio/cs/ext/SJIS.java @@ -114,14 +114,14 @@ public class SJIS private JIS_X_0201.Encoder jis0201; - short[] j0208Index1; - String[] j0208Index2; + private static final short[] j0208Index1 = + JIS_X_0208_Encoder.getIndex1(); + private static final String[] j0208Index2 = + JIS_X_0208_Encoder.getIndex2(); protected Encoder(Charset cs) { super(cs); jis0201 = new JIS_X_0201.Encoder(cs); - j0208Index1 = super.getIndex1(); - j0208Index2 = super.getIndex2(); } protected int encodeSingle(char inputChar) { diff --git a/src/share/classes/sun/security/krb5/EncryptionKey.java b/src/share/classes/sun/security/krb5/EncryptionKey.java index ac54b14d5fafbfac8225723526bfc947f74df918..ff920af8e9927d8012f1d059beb520a0d8f91f97 100644 --- a/src/share/classes/sun/security/krb5/EncryptionKey.java +++ b/src/share/classes/sun/security/krb5/EncryptionKey.java @@ -188,24 +188,13 @@ public class EncryptionKey etypes = EType.getBuiltInDefaults(); } - // set the preferred etype for preauth - if ((pa_exists) && (pa_etype != EncryptedData.ETYPE_NULL)) { - if (DEBUG) { - System.out.println("Pre-Authentication: " + - "Set preferred etype = " + pa_etype); - } - if (EType.isSupported(pa_etype)) { - // reset etypes to preferred value - etypes = new int[1]; - etypes[0] = pa_etype; - } - } - EncryptionKey[] encKeys = new EncryptionKey[etypes.length]; for (int i = 0; i < etypes.length; i++) { if (EType.isSupported(etypes[i])) { + byte[] s2kparams = (pa_exists && etypes[i] == pa_etype) + ? pa_s2kparams : null; encKeys[i] = new EncryptionKey( - stringToKey(password, salt, pa_s2kparams, etypes[i]), + stringToKey(password, salt, s2kparams, etypes[i]), etypes[i], null); } else { if (DEBUG) { diff --git a/src/share/classes/sun/security/krb5/KrbAsReq.java b/src/share/classes/sun/security/krb5/KrbAsReq.java index 4073ddf26385ffce9d99965b69590a327d90ebda..77f3798332fb5312d735ac7f629140466fdffdcd 100644 --- a/src/share/classes/sun/security/krb5/KrbAsReq.java +++ b/src/share/classes/sun/security/krb5/KrbAsReq.java @@ -342,20 +342,20 @@ public class KrbAsReq extends KrbKdcReq { } princName = cname; - - EncryptionKey key = null; - int[] tktETypes = EType.getDefaults("default_tkt_enctypes"); - if (pa_exists && pa_etype != EncryptedData.ETYPE_NULL) { - if (DEBUG) { - System.out.println("Pre-Authenticaton: find key for etype = " + pa_etype); - } - key = EncryptionKey.findKey(pa_etype, keys); - } else { - key = EncryptionKey.findKey(tktETypes[0], keys); - } - + int[] tktETypes = EType.getDefaults("default_tkt_enctypes", keys); PAData[] paData = null; if (PA_ENC_TIMESTAMP_REQUIRED) { + EncryptionKey key = null; + if (pa_etype != EncryptedData.ETYPE_NULL) { + if (DEBUG) { + System.out.println("Pre-Authenticaton: find key for etype = " + pa_etype); + } + key = EncryptionKey.findKey(pa_etype, keys); + } else { + if (tktETypes.length > 0) { + key = EncryptionKey.findKey(tktETypes[0], keys); + } + } if (DEBUG) { System.out.println("AS-REQ: Add PA_ENC_TIMESTAMP now"); } diff --git a/src/share/classes/sun/security/krb5/internal/KRBError.java b/src/share/classes/sun/security/krb5/internal/KRBError.java index dca82a4392ea824272b3a61313760cc3f21a72bb..4bf1de79e94bfac9abbf9df4a0d46314e25345b5 100644 --- a/src/share/classes/sun/security/krb5/internal/KRBError.java +++ b/src/share/classes/sun/security/krb5/internal/KRBError.java @@ -286,6 +286,19 @@ public class KRBError implements java.io.Serializable { salt = info.getSalt(); if (DEBUG) { System.out.println("\t PA-ETYPE-INFO etype = " + etype); + System.out.println("\t PA-ETYPE-INFO salt = " + salt); + } + while (der.data.available() > 0) { + value = der.data.getDerValue(); + info = new ETypeInfo(value); + if (DEBUG) { + etype = info.getEType(); + System.out.println("\t salt for " + etype + + " is " + info.getSalt()); + } + if (salt == null || salt.isEmpty()) { + salt = info.getSalt(); + } } } break; @@ -299,6 +312,19 @@ public class KRBError implements java.io.Serializable { s2kparams = info2.getParams(); if (DEBUG) { System.out.println("\t PA-ETYPE-INFO2 etype = " + etype); + System.out.println("\t PA-ETYPE-INFO salt = " + salt); + } + while (der.data.available() > 0) { + value = der.data.getDerValue(); + info2 = new ETypeInfo2(value); + if (DEBUG) { + etype = info2.getEType(); + System.out.println("\t salt for " + etype + + " is " + info2.getSalt()); + } + if (salt == null || salt.isEmpty()) { + salt = info2.getSalt(); + } } } break; diff --git a/src/share/classes/sun/security/validator/PKIXValidator.java b/src/share/classes/sun/security/validator/PKIXValidator.java index 8068a9db8612610622b695fe1d646ba4f534b669..59daa9eefb89be02ebcd53659fca8f739005b101 100644 --- a/src/share/classes/sun/security/validator/PKIXValidator.java +++ b/src/share/classes/sun/security/validator/PKIXValidator.java @@ -53,7 +53,7 @@ public final class PKIXValidator extends Validator { private int certPathLength = -1; // needed only for the validator - private Map trustedSubjects; + private Map> trustedSubjects; private CertificateFactory factory; private boolean plugin = false; @@ -95,9 +95,17 @@ public final class PKIXValidator extends Validator { if (TRY_VALIDATOR == false) { return; } - trustedSubjects = new HashMap(); + trustedSubjects = new HashMap>(); for (X509Certificate cert : trustedCerts) { - trustedSubjects.put(cert.getSubjectX500Principal(), cert); + X500Principal dn = cert.getSubjectX500Principal(); + List keys; + if (trustedSubjects.containsKey(dn)) { + keys = trustedSubjects.get(dn); + } else { + keys = new ArrayList(); + trustedSubjects.put(dn, keys); + } + keys.add(cert.getPublicKey()); } try { factory = CertificateFactory.getInstance("X.509"); @@ -161,13 +169,21 @@ public final class PKIXValidator extends Validator { // chain is not ordered correctly, call builder instead return doBuild(chain, otherCerts); } - if (trustedSubjects.containsKey(dn) - && trustedSubjects.get(dn).getPublicKey() - .equals(cert.getPublicKey())) { + + // Check if chain[i] is already trusted. It may be inside + // trustedCerts, or has the same dn and public key as a cert + // inside trustedCerts. The latter happens when a CA has + // updated its cert with a stronger signature algorithm in JRE + // but the weak one is still in circulation. + + if (trustedCerts.contains(cert) || // trusted cert + (trustedSubjects.containsKey(dn) && // replacing ... + trustedSubjects.get(dn).contains( // ... weak cert + cert.getPublicKey()))) { if (i == 0) { return new X509Certificate[] {chain[0]}; } - // Remove and call validator + // Remove and call validator on partial chain [0 .. i-1] X509Certificate[] newChain = new X509Certificate[i]; System.arraycopy(chain, 0, newChain, 0, i); return doValidate(newChain); @@ -217,14 +233,17 @@ public final class PKIXValidator extends Validator { return doBuild(chain, otherCerts); } - private boolean isSignatureValid(X509Certificate iss, X509Certificate sub) { + private boolean isSignatureValid(List keys, X509Certificate sub) { if (plugin) { - try { - sub.verify(iss.getPublicKey()); - } catch (Exception ex) { - return false; + for (PublicKey key: keys) { + try { + sub.verify(key); + return true; + } catch (Exception ex) { + continue; + } } - return true; + return false; } return true; // only check if PLUGIN is set } diff --git a/src/share/classes/sun/tools/jstat/Arguments.java b/src/share/classes/sun/tools/jstat/Arguments.java index a6453203a1c785ce1aaec52f67cb9991bdcbe3d1..1519175598819033aaa7590128c19624077c5d48 100644 --- a/src/share/classes/sun/tools/jstat/Arguments.java +++ b/src/share/classes/sun/tools/jstat/Arguments.java @@ -47,6 +47,7 @@ public class Arguments { private static final String JVMSTAT_USERDIR = ".jvmstat"; private static final String OPTIONS_FILENAME = "jstat_options"; + private static final String UNSUPPORTED_OPTIONS_FILENAME = "jstat_unsupported_options"; private static final String ALL_NAMES = "\\w*"; private Comparator comparator; @@ -411,8 +412,8 @@ public class Arguments { return optionFormat; } - public URL[] optionsSources() { - URL[] sources = new URL[2]; + public List optionsSources() { + List sources = new ArrayList(); int i = 0; String filename = OPTIONS_FILENAME; @@ -421,7 +422,7 @@ public class Arguments { String userHome = System.getProperty("user.home"); String userDir = userHome + "/" + JVMSTAT_USERDIR; File home = new File(userDir + "/" + filename); - sources[i++] = home.toURL(); + sources.add(home.toURI().toURL()); } catch (Exception e) { if (debug) { System.err.println(e.getMessage()); @@ -430,8 +431,15 @@ public class Arguments { throw new IllegalArgumentException("Internal Error: Bad URL: " + e.getMessage()); } - sources[i] = this.getClass().getResource("resources/" + filename); - assert sources[i] != null; + URL u = this.getClass().getResource("resources/" + filename); + assert u != null; + sources.add(u); + + if (showUnsupported) { + u = this.getClass().getResource("resources/" + UNSUPPORTED_OPTIONS_FILENAME); + assert u != null; + sources.add(u); + } return sources; } } diff --git a/src/share/classes/sun/tools/jstat/OptionFinder.java b/src/share/classes/sun/tools/jstat/OptionFinder.java index 628bd6c9965ac904b8baba4268bc5c015e535dc2..6efa5737a78616e694d9a9dd700203c189d3e27e 100644 --- a/src/share/classes/sun/tools/jstat/OptionFinder.java +++ b/src/share/classes/sun/tools/jstat/OptionFinder.java @@ -39,9 +39,9 @@ public class OptionFinder { private static final boolean debug = false; - URL[] optionsSources; + List optionsSources; - public OptionFinder(URL[] optionsSources) { + public OptionFinder(List optionsSources) { this.optionsSources = optionsSources; } @@ -59,24 +59,25 @@ public class OptionFinder { return of; } - protected OptionFormat getOptionFormat(String option, URL[] sources) { + protected OptionFormat getOptionFormat(String option, List sources) { OptionFormat of = null; - for (int i = 0; (i < sources.length) && (of == null); i++) { + for (URL u : sources) { try { - URL u = sources[i]; Reader r = new BufferedReader( new InputStreamReader(u.openStream())); of = new Parser(r).parse(option); + if (of != null) + break; } catch (IOException e) { if (debug) { - System.err.println("Error processing " + sources[i] + System.err.println("Error processing " + u + " : " + e.getMessage()); e.printStackTrace(); } } catch (ParserException e) { // Exception in parsing the options file. - System.err.println(sources[i] + ": " + e.getMessage()); - System.err.println("Parsing of " + sources[i] + " aborted"); + System.err.println(u + ": " + e.getMessage()); + System.err.println("Parsing of " + u + " aborted"); } } return of; diff --git a/src/share/classes/sun/tools/jstat/OptionLister.java b/src/share/classes/sun/tools/jstat/OptionLister.java index d274a4082fcb236667014b00c6258fa2915a728d..5ed55647d8d71ea8cd2df7bd932107bb6df81f83 100644 --- a/src/share/classes/sun/tools/jstat/OptionLister.java +++ b/src/share/classes/sun/tools/jstat/OptionLister.java @@ -37,9 +37,9 @@ import java.io.*; */ public class OptionLister { private static final boolean debug = false; - private URL[] sources; + private List sources; - public OptionLister(URL[] sources) { + public OptionLister(List sources) { this.sources = sources; } @@ -54,9 +54,8 @@ public class OptionLister { Set options = new TreeSet(c); - for (int i = 0; i < sources.length; i++) { + for (URL u : sources) { try { - URL u = sources[i]; Reader r = new BufferedReader( new InputStreamReader(u.openStream())); Set s = new Parser(r).parseOptions(); @@ -68,8 +67,8 @@ public class OptionLister { } } catch (ParserException e) { // Exception in parsing the options file. - System.err.println(sources[i] + ": " + e.getMessage()); - System.err.println("Parsing of " + sources[i] + " aborted"); + System.err.println(u + ": " + e.getMessage()); + System.err.println("Parsing of " + u + " aborted"); } } diff --git a/src/share/classes/sun/tools/jstat/resources/jstat_options b/src/share/classes/sun/tools/jstat/resources/jstat_options index a32027d4d058f5d3f265b650996474f1924a0f95..f339965e599776d42cdc872793fcf4dd7c65c05e 100644 --- a/src/share/classes/sun/tools/jstat/resources/jstat_options +++ b/src/share/classes/sun/tools/jstat/resources/jstat_options @@ -37,7 +37,7 @@ option timestamp { option class { column { header "^Loaded^" /* Number of classes loaded */ - data java.cls.loadedClasses + data (java.cls.loadedClasses + java.cls.sharedLoadedClasses) align right scale raw width 5 @@ -45,7 +45,7 @@ option class { } column { header "^Bytes^" /* Accumulated Size of classes loaded */ - data sun.cls.loadedBytes + data (sun.cls.loadedBytes + sun.cls.sharedLoadedBytes) align right scale K width 7 @@ -53,7 +53,7 @@ option class { } column { header "^Unloaded^" /* Number of classes unloaded */ - data java.cls.unloadedClasses + data (java.cls.unloadedClasses + java.cls.sharedUnloadedClasses) align right width 5 scale raw @@ -61,7 +61,7 @@ option class { } column { header "^Bytes^" /* Accumulated size of classes unloaded */ - data sun.cls.unloadedBytes + data (sun.cls.unloadedBytes + sun.cls.sharedUnloadedBytes) align right scale K width 7 diff --git a/src/share/classes/sun/tools/jstat/resources/jstat_unsupported_options b/src/share/classes/sun/tools/jstat/resources/jstat_unsupported_options new file mode 100644 index 0000000000000000000000000000000000000000..37008e332ca020b7a74ab48b1f0ca5ca694cd8fb --- /dev/null +++ b/src/share/classes/sun/tools/jstat/resources/jstat_unsupported_options @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2010, 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. + */ + +option classload { + column { + header "^Loaded^" /* Number of classes loaded */ + data (java.cls.loadedClasses + java.cls.sharedLoadedClasses) + align right + scale raw + width 5 + format "0" + } + column { + header "Time^" /* Accumulated time for class loading */ + data sun.cls.time/sun.os.hrt.frequency + scale sec + align right + width 10 + format "0.000" + } + column { + header "^Inited^" /* Number of initialized classes */ + data sun.cls.initializedClasses + align right + scale raw + width 5 + format "0" + } + column { + header "Time^" /* Accumulated time for class initialization */ + data sun.cls.classInitTime.self/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "Shared^" /* Number of system classes loaded from shared archive */ + data java.cls.sharedLoadedClasses + align right + scale raw + width 5 + format "0" + } + column { + header "Kbytes^" /* Accumulated Size of classes loaded */ + data sun.cls.sharedLoadedBytes + align right + scale K + width 7 + format "0.0" + } + column { + header "LoadTime^" /* Accumulated time for loading classes from shared archive */ + data sun.cls.sharedClassLoadTime/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "^SysClass^" /* Number of system classes loaded */ + data java.cls.loadedClasses + align right + scale raw + width 5 + format "0" + } + column { + header "Kbytes^" /* Bytes read from system class files */ + data sun.cls.sysClassBytes + align right + scale K + width 7 + format "0.0" + } + column { + header "LoadTime^" /* Accumulated time for loading non-shared system classes */ + data sun.cls.sysClassLoadTime/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "Lookup^" /* Time spent in looking up/reading of system classes */ + data sun.cls.lookupSysClassTime/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "Parse^" /* Time spent in parsing system classes */ + data sun.cls.parseClassTime.self/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "^Linked^" /* Number of linked classes */ + data sun.cls.linkedClasses + align right + scale raw + width 5 + format "0" + } + column { + header "Time^" /* Accumulated time for class linking */ + data sun.cls.classInitTime.self/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "^Verified^" /* Number of verified classes */ + data sun.cls.verifiedClasses + align right + scale raw + width 5 + format "0" + } + column { + header "Time^" /* Accumulated time for class verification */ + data sun.cls.classVerifyTime.self/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "AppClass^" /* Number of loaded application classes */ + data sun.cls.appClassLoadCount + align right + scale raw + width 5 + format "0" + } + column { + header "Kbytes^" /* Bytes read from app class files */ + data sun.cls.appClassBytes + align right + scale K + width 7 + format "0.0" + } + column { + header "AppCL^" /* Accumulated time for loading app classes */ + data sun.cls.appClassLoadTime/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "^DefineClass^" /* Number of defineClass calls */ + data sun.cls.defineAppClasses + align right + scale raw + width 5 + format "0" + } + column { + header "Time^" /* Accumulated time for defineClass */ + data sun.cls.defineAppClassTime.self/sun.os.hrt.frequency + scale raw + align right + width 10 + format "0.000" + } + column { + header "^FindClass^" /* Number of findClass calls */ + data sun.classloader.findClasses + align right + scale raw + width 5 + format "0" + } + column { + header "Time^" /* Accumulated time for findClass */ + data sun.classloader.findClassTime/1000000000 + scale raw + align right + width 10 + format "0.000" + } + column { + header "Delegation^" /* Parent class loader delegation time */ + data sun.classloader.parentDelegationTime/1000000000 + scale raw + align right + width 10 + format "0.000" + } + column { + header "URLCL Read^" /* Accumulated time for URLClassLoader reading bytes */ + data sun.urlClassLoader.readClassBytesTime/1000000000 + scale raw + align right + width 10 + format "0.000" + } +} + diff --git a/src/share/demo/jvmti/hprof/sample.makefile.txt b/src/share/demo/jvmti/hprof/sample.makefile.txt index 4b7499e40799a898856d635e863e1ece86a55155..3766a2877831d074ca5ca54f38d763c1bcff5dea 100644 --- a/src/share/demo/jvmti/hprof/sample.makefile.txt +++ b/src/share/demo/jvmti/hprof/sample.makefile.txt @@ -132,7 +132,7 @@ ifeq ($(OSNAME), linux) LIBRARY=lib$(LIBNAME).so LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc -mimpure-text # Libraries we are dependent on - LIBRARIES= -lnsl -ldl -lc + LIBRARIES= -ldl -lc # Building a shared library LINK_SHARED=$(LINK.c) -shared -o $@ endif diff --git a/src/share/javavm/export/classfile_constants.h b/src/share/javavm/export/classfile_constants.h index 86da17ccbd47b9939d65de3eaefa8d382471aac7..9030935c5c6177d80348d6d0e8820465d83587c9 100644 --- a/src/share/javavm/export/classfile_constants.h +++ b/src/share/javavm/export/classfile_constants.h @@ -84,7 +84,22 @@ enum { JVM_CONSTANT_Fieldref = 9, JVM_CONSTANT_Methodref = 10, JVM_CONSTANT_InterfaceMethodref = 11, - JVM_CONSTANT_NameAndType = 12 + JVM_CONSTANT_NameAndType = 12, + JVM_CONSTANT_MethodHandle = 15, // JSR 292 + JVM_CONSTANT_MethodType = 16 // JSR 292 +}; + +/* JVM_CONSTANT_MethodHandle subtypes */ +enum { + JVM_REF_getField = 1, + JVM_REF_getStatic = 2, + JVM_REF_putField = 3, + JVM_REF_putStatic = 4, + JVM_REF_invokeVirtual = 5, + JVM_REF_invokeStatic = 6, + JVM_REF_invokeSpecial = 7, + JVM_REF_newInvokeSpecial = 8, + JVM_REF_invokeInterface = 9 }; /* StackMapTable type item numbers */ diff --git a/src/share/native/common/check_code.c b/src/share/native/common/check_code.c index 6dd422d4e45ba4f0846f61e3710495b23b99151c..337a11f4ca4b0e3d95aa4ade9d94fc6be4ddecc7 100644 --- a/src/share/native/common/check_code.c +++ b/src/share/native/common/check_code.c @@ -204,6 +204,8 @@ enum { #define LDC_CLASS_MAJOR_VERSION 49 +#define LDC_METHOD_HANDLE_MAJOR_VERSION 51 + #define ALLOC_STACK_SIZE 16 /* big enough */ typedef struct alloc_stack_type { @@ -1181,6 +1183,10 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset) if (context->major_version >= LDC_CLASS_MAJOR_VERSION) { types |= 1 << JVM_CONSTANT_Class; } + if (context->major_version >= LDC_METHOD_HANDLE_MAJOR_VERSION) { + types |= (1 << JVM_CONSTANT_MethodHandle) | + (1 << JVM_CONSTANT_MethodType); + } this_idata->operand.i = key; verify_constant_pool_type(context, key, types); break; @@ -1194,6 +1200,10 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset) if (context->major_version >= LDC_CLASS_MAJOR_VERSION) { types |= 1 << JVM_CONSTANT_Class; } + if (context->major_version >= LDC_METHOD_HANDLE_MAJOR_VERSION) { + types |= (1 << JVM_CONSTANT_MethodHandle) | + (1 << JVM_CONSTANT_MethodType); + } this_idata->operand.i = key; verify_constant_pool_type(context, key, types); break; @@ -2667,6 +2677,22 @@ push_stack(context_type *context, unsigned int inumber, stack_info_type *new_sta full_info = make_class_info_from_name(context, "java/lang/Class"); break; + case JVM_CONSTANT_MethodHandle: + case JVM_CONSTANT_MethodType: + if (context->major_version < LDC_METHOD_HANDLE_MAJOR_VERSION) + CCerror(context, "Internal error #3"); + stack_results = "A"; + switch (type_table[operand]) { + case JVM_CONSTANT_MethodType: + full_info = make_class_info_from_name(context, + "java/dyn/MethodType"); + break; + default: //JVM_CONSTANT_MethodHandle + full_info = make_class_info_from_name(context, + "java/dyn/MethodHandle"); + break; + } + break; default: CCerror(context, "Internal error #3"); stack_results = ""; /* Never reached: keep lint happy */ diff --git a/src/share/native/sun/awt/splashscreen/splashscreen_png.c b/src/share/native/sun/awt/splashscreen/splashscreen_png.c index 6c4b3a896a8a8afdb856cc70bfb920d6316843dd..7a814d215f57f89ee115f1e25c754b2556e6e9c9 100644 --- a/src/share/native/sun/awt/splashscreen/splashscreen_png.c +++ b/src/share/native/sun/awt/splashscreen/splashscreen_png.c @@ -182,7 +182,7 @@ SplashDecodePngStream(Splash * splash, SplashStream * stream) int success = 0; stream->read(stream, sig, SIG_BYTES); - if (!png_check_sig(sig, SIG_BYTES)) { + if (png_sig_cmp(sig, 0, SIG_BYTES)) { goto done; } success = SplashDecodePng(splash, my_png_read_stream, stream); diff --git a/src/share/native/sun/font/freetypeScaler.c b/src/share/native/sun/font/freetypeScaler.c index 39768c46738beaf9814d29c4e760cde7e81d1075..c132a4a5a2c96bc26d8d551c5b2b0a6d2972e2ae 100644 --- a/src/share/native/sun/font/freetypeScaler.c +++ b/src/share/native/sun/font/freetypeScaler.c @@ -490,22 +490,23 @@ Java_sun_font_FreetypeFontScaler_getFontMetricsNative( /* ascent */ ax = 0; - ay = -(jfloat) FT26Dot6ToFloat( - scalerInfo->face->size->metrics.ascender + - bmodifier/2); + ay = -(jfloat) FT26Dot6ToFloat(FT_MulFix( + ((jlong) scalerInfo->face->ascender + bmodifier/2), + (jlong) scalerInfo->face->size->metrics.y_scale)); /* descent */ dx = 0; - dy = -(jfloat) FT26Dot6ToFloat( - scalerInfo->face->size->metrics.descender + - bmodifier/2); + dy = -(jfloat) FT26Dot6ToFloat(FT_MulFix( + ((jlong) scalerInfo->face->descender + bmodifier/2), + (jlong) scalerInfo->face->size->metrics.y_scale)); /* baseline */ bx = by = 0; /* leading */ lx = 0; - ly = (jfloat) FT26Dot6ToFloat( - scalerInfo->face->size->metrics.height + - bmodifier) + ay - dy; + ly = (jfloat) FT26Dot6ToFloat(FT_MulFix( + (jlong) scalerInfo->face->height + bmodifier, + (jlong) scalerInfo->face->size->metrics.y_scale)) + + ay - dy; /* max advance */ mx = (jfloat) FT26Dot6ToFloat( scalerInfo->face->size->metrics.max_advance + diff --git a/src/solaris/classes/java/lang/UNIXProcess.java.linux b/src/solaris/classes/java/lang/UNIXProcess.java.linux index 00eef09d43111f1b86efd47cac2de9f9cda84924..af68ce18e6b63b4275f9bdc70b9f644af626765e 100644 --- a/src/solaris/classes/java/lang/UNIXProcess.java.linux +++ b/src/solaris/classes/java/lang/UNIXProcess.java.linux @@ -25,25 +25,42 @@ package java.lang; -import java.io.*; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.concurrent.Executors; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadFactory; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; -/* java.lang.Process subclass in the UNIX environment. +/** + * java.lang.Process subclass in the UNIX environment. * * @author Mario Wolczko and Ross Knippel. * @author Konstantin Kladko (ported to Linux) + * @author Martin Buchholz */ - final class UNIXProcess extends Process { private static final sun.misc.JavaIOFileDescriptorAccess fdAccess = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - private int pid; + private final int pid; private int exitcode; private boolean hasExited; - private OutputStream stdin_stream; - private InputStream stdout_stream; - private InputStream stderr_stream; + private /* final */ OutputStream stdin; + private /* final */ InputStream stdout; + private /* final */ InputStream stderr; /* this is for the reaping thread */ private native int waitForProcessExit(int pid); @@ -51,155 +68,136 @@ final class UNIXProcess extends Process { /** * Create a process using fork(2) and exec(2). * - * @param std_fds array of file descriptors. Indexes 0, 1, and - * 2 correspond to standard input, standard output and - * standard error, respectively. On input, a value of -1 - * means to create a pipe to connect child and parent - * processes. On output, a value which is not -1 is the - * parent pipe fd corresponding to the pipe which has - * been created. An element of this array is -1 on input - * if and only if it is not -1 on output. + * @param fds an array of three file descriptors. + * Indexes 0, 1, and 2 correspond to standard input, + * standard output and standard error, respectively. On + * input, a value of -1 means to create a pipe to connect + * child and parent processes. On output, a value which + * is not -1 is the parent pipe fd corresponding to the + * pipe which has been created. An element of this array + * is -1 on input if and only if it is not -1 on + * output. * @return the pid of the subprocess */ private native int forkAndExec(byte[] prog, byte[] argBlock, int argc, byte[] envBlock, int envc, byte[] dir, - int[] std_fds, + int[] fds, boolean redirectErrorStream) throws IOException; - /* In the process constructor we wait on this gate until the process */ - /* has been created. Then we return from the constructor. */ - /* fork() is called by the same thread which later waits for the process */ - /* to terminate */ - - private static class Gate { - - private boolean exited = false; - private IOException savedException; - - synchronized void exit() { /* Opens the gate */ - exited = true; - this.notify(); - } - - synchronized void waitForExit() { /* wait until the gate is open */ - boolean interrupted = false; - while (!exited) { - try { - this.wait(); - } catch (InterruptedException e) { - interrupted = true; - } - } - if (interrupted) { - Thread.currentThread().interrupt(); - } - } + /** + * The thread factory used to create "process reaper" daemon threads. + */ + private static class ProcessReaperThreadFactory implements ThreadFactory { + private final static ThreadGroup group = getRootThreadGroup(); - void setException (IOException e) { - savedException = e; + private static ThreadGroup getRootThreadGroup() { + return AccessController.doPrivileged + (new PrivilegedAction () { + public ThreadGroup run() { + ThreadGroup root = Thread.currentThread().getThreadGroup(); + while (root.getParent() != null) + root = root.getParent(); + return root; + }}); } - IOException getException() { - return savedException; + public Thread newThread(Runnable grimReaper) { + // Our thread stack requirement is quite modest. + Thread t = new Thread(group, grimReaper, "process reaper", 32768); + t.setDaemon(true); + // A small attempt (probably futile) to avoid priority inversion + t.setPriority(Thread.MAX_PRIORITY); + return t; } } + /** + * The thread pool of "process reaper" daemon threads. + */ + private static final Executor processReaperExecutor + = Executors.newCachedThreadPool(new ProcessReaperThreadFactory()); + UNIXProcess(final byte[] prog, final byte[] argBlock, final int argc, final byte[] envBlock, final int envc, final byte[] dir, - final int[] std_fds, + final int[] fds, final boolean redirectErrorStream) - throws IOException { - - final Gate gate = new Gate(); - /* - * For each subprocess forked a corresponding reaper thread - * is started. That thread is the only thread which waits - * for the subprocess to terminate and it doesn't hold any - * locks while doing so. This design allows waitFor() and - * exitStatus() to be safely executed in parallel (and they - * need no native code). - */ - - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Void run() { - Thread t = new Thread("process reaper") { - public void run() { - try { - pid = forkAndExec(prog, - argBlock, argc, - envBlock, envc, - dir, - std_fds, - redirectErrorStream); - } catch (IOException e) { - gate.setException(e); /*remember to rethrow later*/ - gate.exit(); - return; - } - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Void run() { - if (std_fds[0] == -1) - stdin_stream = new ProcessBuilder.NullOutputStream(); - else { - FileDescriptor stdin_fd = new FileDescriptor(); - fdAccess.set(stdin_fd, std_fds[0]); - stdin_stream = new BufferedOutputStream( - new FileOutputStream(stdin_fd)); - } - - if (std_fds[1] == -1) - stdout_stream = new ProcessBuilder.NullInputStream(); - else { - FileDescriptor stdout_fd = new FileDescriptor(); - fdAccess.set(stdout_fd, std_fds[1]); - stdout_stream = new BufferedInputStream( - new FileInputStream(stdout_fd)); - } - - if (std_fds[2] == -1) - stderr_stream = new ProcessBuilder.NullInputStream(); - else { - FileDescriptor stderr_fd = new FileDescriptor(); - fdAccess.set(stderr_fd, std_fds[2]); - stderr_stream = new FileInputStream(stderr_fd); - } - - return null; }}); - gate.exit(); /* exit from constructor */ - int res = waitForProcessExit(pid); - synchronized (UNIXProcess.this) { - hasExited = true; - exitcode = res; - UNIXProcess.this.notifyAll(); - } - } - }; - t.setDaemon(true); - t.start(); - return null; }}); - gate.waitForExit(); - IOException e = gate.getException(); - if (e != null) - throw new IOException(e.toString()); + throws IOException { + + pid = forkAndExec(prog, + argBlock, argc, + envBlock, envc, + dir, + fds, + redirectErrorStream); + + try { + AccessController.doPrivileged + (new PrivilegedExceptionAction() { + public Void run() throws IOException { + initStreams(fds); + return null; + }}); + } catch (PrivilegedActionException ex) { + throw (IOException) ex.getException(); + } + } + + static FileDescriptor newFileDescriptor(int fd) { + FileDescriptor fileDescriptor = new FileDescriptor(); + fdAccess.set(fileDescriptor, fd); + return fileDescriptor; + } + + void initStreams(int[] fds) throws IOException { + stdin = (fds[0] == -1) ? + ProcessBuilder.NullOutputStream.INSTANCE : + new ProcessPipeOutputStream(fds[0]); + + stdout = (fds[1] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ProcessPipeInputStream(fds[1]); + + stderr = (fds[2] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ProcessPipeInputStream(fds[2]); + + processReaperExecutor.execute(new Runnable() { + public void run() { + int exitcode = waitForProcessExit(pid); + UNIXProcess.this.processExited(exitcode); + }}); + } + + synchronized void processExited(int exitcode) { + if (stdout instanceof ProcessPipeInputStream) + ((ProcessPipeInputStream) stdout).processExited(); + + if (stderr instanceof ProcessPipeInputStream) + ((ProcessPipeInputStream) stderr).processExited(); + + if (stdin instanceof ProcessPipeOutputStream) + ((ProcessPipeOutputStream) stdin).processExited(); + + this.exitcode = exitcode; + hasExited = true; + notifyAll(); } public OutputStream getOutputStream() { - return stdin_stream; + return stdin; } public InputStream getInputStream() { - return stdout_stream; + return stdout; } public InputStream getErrorStream() { - return stderr_stream; + return stderr; } public synchronized int waitFor() throws InterruptedException { @@ -228,13 +226,9 @@ final class UNIXProcess extends Process { if (!hasExited) destroyProcess(pid); } - try { - stdin_stream.close(); - stdout_stream.close(); - stderr_stream.close(); - } catch (IOException e) { - // ignore - } + try { stdin.close(); } catch (IOException ignored) {} + try { stdout.close(); } catch (IOException ignored) {} + try { stderr.close(); } catch (IOException ignored) {} } /* This routine initializes JNI field offsets for the class */ @@ -243,4 +237,77 @@ final class UNIXProcess extends Process { static { initIDs(); } + + /** + * A buffered input stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + * + * This is tricky because we do not want the user-level InputStream to be + * closed until the user invokes close(), and we need to continue to be + * able to read any buffered data lingering in the OS pipe buffer. + */ + static class ProcessPipeInputStream extends BufferedInputStream { + ProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } + + private static byte[] drainInputStream(InputStream in) + throws IOException { + if (in == null) return null; + int n = 0; + int j; + byte[] a = null; + while ((j = in.available()) > 0) { + a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); + n += in.read(a, n, j); + } + return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + // Most BufferedInputStream methods are synchronized, but close() + // is not, and so we have to handle concurrent racing close(). + try { + InputStream in = this.in; + if (in != null) { + byte[] stragglers = drainInputStream(in); + in.close(); + this.in = (stragglers == null) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ByteArrayInputStream(stragglers); + if (buf == null) // asynchronous close()? + this.in = null; + } + } catch (IOException ignored) { + // probably an asynchronous close(). + } + } + } + + /** + * A buffered output stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + */ + static class ProcessPipeOutputStream extends BufferedOutputStream { + ProcessPipeOutputStream(int fd) { + super(new FileOutputStream(newFileDescriptor(fd))); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + OutputStream out = this.out; + if (out != null) { + try { + out.close(); + } catch (IOException ignored) { + // We know of no reason to get an IOException, but if + // we do, there's nothing else to do but carry on. + } + this.out = ProcessBuilder.NullOutputStream.INSTANCE; + } + } + } } diff --git a/src/solaris/classes/java/lang/UNIXProcess.java.solaris b/src/solaris/classes/java/lang/UNIXProcess.java.solaris index 7f87d797aebcbab5ba922c6f68e9ab986b14b30d..8d01b7e726aee0402a57b3b0a17fe6e66a6192de 100644 --- a/src/solaris/classes/java/lang/UNIXProcess.java.solaris +++ b/src/solaris/classes/java/lang/UNIXProcess.java.solaris @@ -86,7 +86,7 @@ final class UNIXProcess extends Process { java.security.AccessController.doPrivileged( new java.security.PrivilegedAction() { public Void run() { if (std_fds[0] == -1) - stdin_stream = new ProcessBuilder.NullOutputStream(); + stdin_stream = ProcessBuilder.NullOutputStream.INSTANCE; else { FileDescriptor stdin_fd = new FileDescriptor(); fdAccess.set(stdin_fd, std_fds[0]); @@ -95,7 +95,7 @@ final class UNIXProcess extends Process { } if (std_fds[1] == -1) - stdout_stream = new ProcessBuilder.NullInputStream(); + stdout_stream = ProcessBuilder.NullInputStream.INSTANCE; else { FileDescriptor stdout_fd = new FileDescriptor(); fdAccess.set(stdout_fd, std_fds[1]); @@ -104,7 +104,7 @@ final class UNIXProcess extends Process { } if (std_fds[2] == -1) - stderr_stream = new ProcessBuilder.NullInputStream(); + stderr_stream = ProcessBuilder.NullInputStream.INSTANCE; else { FileDescriptor stderr_fd = new FileDescriptor(); fdAccess.set(stderr_fd, std_fds[2]); diff --git a/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java b/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java index e16c55675d4879b0cf09a924cafe90f047006b62..5825277207bd677adb50061544c70992b03d7d4e 100644 --- a/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java +++ b/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java @@ -275,7 +275,7 @@ public class XEmbeddedFramePeer extends XFramePeer { Point absoluteLoc = XlibUtil.translateCoordinates(getWindow(), XToolkit.getDefaultRootWindow(), new Point(0, 0)); - return absoluteLoc.x; + return absoluteLoc != null ? absoluteLoc.x : 0; } public int getAbsoluteY() @@ -283,7 +283,7 @@ public class XEmbeddedFramePeer extends XFramePeer { Point absoluteLoc = XlibUtil.translateCoordinates(getWindow(), XToolkit.getDefaultRootWindow(), new Point(0, 0)); - return absoluteLoc.y; + return absoluteLoc != null ? absoluteLoc.y : 0; } public int getWidth() { diff --git a/src/solaris/classes/sun/awt/X11/XToolkit.java b/src/solaris/classes/sun/awt/X11/XToolkit.java index 0be90d02d20bd91c06b92f20392c9fd393d2040c..3b98cb032fbe76030e0a5502a40bb9259dbe6107 100644 --- a/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2010, 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 @@ -849,7 +849,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable { // if _NET_WM_STRUT_PARTIAL is present, we should use its values to detect // if the struts area intersects with screenBounds, however some window // managers don't set this hint correctly, so we just get intersection with windowBounds - if (windowBounds.intersects(screenBounds)) + if (windowBounds != null && windowBounds.intersects(screenBounds)) { insets.left = Math.max((int)Native.getLong(native_ptr, 0), insets.left); insets.right = Math.max((int)Native.getLong(native_ptr, 1), insets.right); @@ -1961,7 +1961,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable { } static long reset_time_utc; - static final long WRAP_TIME_MILLIS = Integer.MAX_VALUE; + static final long WRAP_TIME_MILLIS = 0x00000000FFFFFFFFL; /* * This function converts between the X server time (number of milliseconds diff --git a/src/solaris/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine b/src/solaris/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine new file mode 100644 index 0000000000000000000000000000000000000000..c79fdbde9c8bf8d7d11a4fbc0f0908736eb7cb71 --- /dev/null +++ b/src/solaris/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine @@ -0,0 +1,5 @@ +# Jules Rendering Engine module +sun.java2d.jules.JulesRenderingEngine + +# Pisces Rendering Engine module +sun.java2d.pisces.PiscesRenderingEngine diff --git a/src/solaris/classes/sun/nio/cs/ext/COMPOUND_TEXT_Encoder.java b/src/solaris/classes/sun/nio/cs/ext/COMPOUND_TEXT_Encoder.java index e7cc9c1b112c67c03aa2251b3fb059c135035ac3..d73a21b986420e97e2c339b0e9cc0ca53b0d648e 100644 --- a/src/solaris/classes/sun/nio/cs/ext/COMPOUND_TEXT_Encoder.java +++ b/src/solaris/classes/sun/nio/cs/ext/COMPOUND_TEXT_Encoder.java @@ -43,8 +43,8 @@ public class COMPOUND_TEXT_Encoder extends CharsetEncoder { * cannot be used for actual encoding because they are shared across all * COMPOUND_TEXT encoders and may be stateful. */ - private static final Map encodingToEncoderMap = - Collections.synchronizedMap(new HashMap(21, 1.0f)); + private static final Map encodingToEncoderMap = + Collections.synchronizedMap(new HashMap(21, 1.0f)); private static final CharsetEncoder latin1Encoder; private static final CharsetEncoder defaultEncoder; private static final boolean defaultEncodingSupported; @@ -221,7 +221,7 @@ public class COMPOUND_TEXT_Encoder extends CharsetEncoder { out.put((byte)0x1B); out.put((byte)0x25); out.put((byte)0x2F); - out.put((byte)nonStandardBytes[3]); + out.put(nonStandardBytes[3]); int toWrite = Math.min(numBytes - nonStandardBytesOff, (1 << 14) - 1 - nonStandardEncodingLen); @@ -313,12 +313,9 @@ public class COMPOUND_TEXT_Encoder extends CharsetEncoder { } // 4. Brute force search of all supported encodings. - for (Iterator iter = CompoundTextSupport.getEncodings().iterator(); - iter.hasNext();) + for (String encoding : CompoundTextSupport.getEncodings()) { - String encoding = (String)iter.next(); - CharsetEncoder enc = - (CharsetEncoder)encodingToEncoderMap.get(encoding); + CharsetEncoder enc = encodingToEncoderMap.get(encoding); if (enc == null) { enc = CompoundTextSupport.getEncoder(encoding); if (enc == null) { diff --git a/src/solaris/classes/sun/nio/cs/ext/CompoundTextSupport.java b/src/solaris/classes/sun/nio/cs/ext/CompoundTextSupport.java index 07c87af26aeeffa75f5772a175f51dc0e99e7de7..4f2a047110c7c161fb1dde88de9e430307b76674 100644 --- a/src/solaris/classes/sun/nio/cs/ext/CompoundTextSupport.java +++ b/src/solaris/classes/sun/nio/cs/ext/CompoundTextSupport.java @@ -130,13 +130,13 @@ final class CompoundTextSupport { /** * Maps a GL or GR escape sequence to an encoding. */ - private static final Map sequenceToEncodingMap; + private static final Map sequenceToEncodingMap; /** * Indicates whether a particular encoding wants the high bit turned on * or off. */ - private static final Map highBitsMap; + private static final Map highBitsMap; /** * Maps an encoding to an escape sequence. Rather than manage two @@ -144,18 +144,21 @@ final class CompoundTextSupport { * modify both GL and GR if necessary. This makes the output slightly less * efficient, but our code much simpler. */ - private static final Map encodingToSequenceMap; + private static final Map encodingToSequenceMap; /** * The keys of 'encodingToSequenceMap', sorted in preferential order. */ - private static final List encodings; + private static final List encodings; static { - HashMap tSequenceToEncodingMap = new HashMap(33, 1.0f); - HashMap tHighBitsMap = new HashMap(31, 1.0f); - HashMap tEncodingToSequenceMap = new HashMap(21, 1.0f); - ArrayList tEncodings = new ArrayList(21); + HashMap tSequenceToEncodingMap = + new HashMap<>(33, 1.0f); + HashMap tHighBitsMap = + new HashMap<>(31, 1.0f); + HashMap tEncodingToSequenceMap = + new HashMap<>(21, 1.0f); + ArrayList tEncodings = new ArrayList<>(21); if (!(isEncodingSupported("US-ASCII") && isEncodingSupported("ISO-8859-1"))) @@ -457,13 +460,12 @@ final class CompoundTextSupport { return getNonStandardDecoder(escSequence, null); } static boolean getHighBit(byte[] escSequence) { - Boolean bool = (Boolean)highBitsMap.get - (new ControlSequence(escSequence)); + Boolean bool = highBitsMap.get(new ControlSequence(escSequence)); return (bool == Boolean.TRUE); } static CharsetDecoder getNonStandardDecoder(byte[] escSequence, byte[] encoding) { - return getDecoder((String)sequenceToEncodingMap.get + return getDecoder(sequenceToEncodingMap.get (new ControlSequence(escSequence, encoding))); } static CharsetDecoder getDecoder(String enc) { @@ -474,7 +476,7 @@ final class CompoundTextSupport { try { cs = Charset.forName(enc); } catch (IllegalArgumentException e) { - Class cls; + Class cls; try { cls = Class.forName("sun.awt.motif." + enc); } catch (ClassNotFoundException ee) { @@ -497,22 +499,20 @@ final class CompoundTextSupport { // For Encoder static byte[] getEscapeSequence(String encoding) { - ControlSequence seq = (ControlSequence) - encodingToSequenceMap.get(encoding); + ControlSequence seq = encodingToSequenceMap.get(encoding); if (seq != null) { return seq.escSequence; } return null; } static byte[] getEncoding(String encoding) { - ControlSequence seq = (ControlSequence) - encodingToSequenceMap.get(encoding); + ControlSequence seq = encodingToSequenceMap.get(encoding); if (seq != null) { return seq.encoding; } return null; } - static List getEncodings() { + static List getEncodings() { return encodings; } static CharsetEncoder getEncoder(String enc) { @@ -523,7 +523,7 @@ final class CompoundTextSupport { try { cs = Charset.forName(enc); } catch (IllegalArgumentException e) { - Class cls; + Class cls; try { cls = Class.forName("sun.awt.motif." + enc); } catch (ClassNotFoundException ee) { diff --git a/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java b/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java index cf194a2f1932b26436a1841ba06bd0c39e95bd35..bdec8fc54ed4e02c13f44f299bad0d4770ca2cda 100644 --- a/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java +++ b/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java @@ -37,6 +37,8 @@ import java.util.Properties; * Linux implementation of HotSpotVirtualMachine */ public class LinuxVirtualMachine extends HotSpotVirtualMachine { + // temp directory for socket file + private static final String tmpdir = System.getProperty("java.io.tmpdir"); // Indicates if this machine uses the old LinuxThreads static boolean isLinuxThreads; @@ -260,7 +262,7 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine { // Return the socket file for the given process. // Checks working directory of process for .java_pid. If not - // found it looks in /tmp. + // found it looks in temp directory. private String findSocketFile(int pid) { // First check for a .java_pid file in the working directory // of the target process @@ -268,20 +270,17 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine { String path = "/proc/" + pid + "/cwd/" + fn; File f = new File(path); if (!f.exists()) { - // Not found, so try /tmp - path = "/tmp/" + fn; - f = new File(path); - if (!f.exists()) { - return null; // not found - } + // Not found, so try temp directory + f = new File(tmpdir, fn); + path = f.exists() ? f.getPath() : null; } return path; } // On Solaris/Linux a simple handshake is used to start the attach mechanism // if not already started. The client creates a .attach_pid file in the - // target VM's working directory (or /tmp), and the SIGQUIT handler checks - // for the file. + // target VM's working directory (or temp directory), and the SIGQUIT handler + // checks for the file. private File createAttachFile(int pid) throws IOException { String fn = ".attach_pid" + pid; String path = "/proc/" + pid + "/cwd/" + fn; @@ -289,8 +288,7 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine { try { f.createNewFile(); } catch (IOException x) { - path = "/tmp/" + fn; - f = new File(path); + f = new File(tmpdir, fn); f.createNewFile(); } return f; diff --git a/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java b/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java index ed923639bae64f9f1c5081af620c97a16e8a9f84..0d6b234fa14ced579e3a36437578947d7387e773 100644 --- a/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java +++ b/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java @@ -38,6 +38,11 @@ import java.util.Properties; * Solaris implementation of HotSpotVirtualMachine. */ public class SolarisVirtualMachine extends HotSpotVirtualMachine { + // Use /tmp instead of /var/tmp on Solaris as /tmp is the default used by + // HotSpot when the property is not set on the command line. + private static final String tmpdir1 = System.getProperty("java.io.tmpdir"); + private static final String tmpdir = + (tmpdir1.equals("/var/tmp") || tmpdir1.equals("/var/tmp/")) ? "/tmp" : tmpdir1; // door descriptor; private int fd = -1; @@ -187,7 +192,7 @@ public class SolarisVirtualMachine extends HotSpotVirtualMachine { } // The door is attached to .java_pid in the target VM's working - // directory or /tmp. + // directory or temporary directory. private int openDoor(int pid) throws IOException { // First check for a .java_pid file in the working directory // of the target process @@ -196,7 +201,7 @@ public class SolarisVirtualMachine extends HotSpotVirtualMachine { try { fd = open(path); } catch (FileNotFoundException fnf) { - path = "/tmp/" + fn; + path = tmpdir + "/" + fn; fd = open(path); } @@ -213,8 +218,8 @@ public class SolarisVirtualMachine extends HotSpotVirtualMachine { // On Solaris/Linux a simple handshake is used to start the attach mechanism // if not already started. The client creates a .attach_pid file in the - // target VM's working directory (or /tmp), and the SIGQUIT handler checks - // for the file. + // target VM's working directory (or temporary directory), and the SIGQUIT + // handler checks for the file. private File createAttachFile(int pid) throws IOException { String fn = ".attach_pid" + pid; String path = "/proc/" + pid + "/cwd/" + fn; @@ -222,8 +227,7 @@ public class SolarisVirtualMachine extends HotSpotVirtualMachine { try { f.createNewFile(); } catch (IOException x) { - path = "/tmp/" + fn; - f = new File(path); + f = new File(tmpdir, fn); f.createNewFile(); } return f; diff --git a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c index 717a38382d7939aa79e76fe760b2dc5aa055fb3e..f044364220ca89833eda251c1cd47e0418895142 100644 --- a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c +++ b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c @@ -52,11 +52,15 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_quit { if (dialog != NULL) { + fp_gdk_threads_enter(); + fp_gtk_widget_hide (dialog); fp_gtk_widget_destroy (dialog); fp_gtk_main_quit (); dialog = NULL; + + fp_gdk_threads_leave(); } } @@ -162,7 +166,6 @@ Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer, (*env)->GetJavaVM(env, &jvm); } - fp_gdk_threads_init(); fp_gdk_threads_enter(); const char *title = (*env)->GetStringUTFChars(env, jtitle, 0); diff --git a/src/windows/classes/java/lang/ProcessImpl.java b/src/windows/classes/java/lang/ProcessImpl.java index 19e0b3ee744e46273e4c56c1a5a16217a68ae6cf..c0a0daa09a8428bd9a2086cb0287a6eba454ee3c 100644 --- a/src/windows/classes/java/lang/ProcessImpl.java +++ b/src/windows/classes/java/lang/ProcessImpl.java @@ -159,7 +159,7 @@ final class ProcessImpl extends Process { new java.security.PrivilegedAction() { public Void run() { if (stdHandles[0] == -1L) - stdin_stream = new ProcessBuilder.NullOutputStream(); + stdin_stream = ProcessBuilder.NullOutputStream.INSTANCE; else { FileDescriptor stdin_fd = new FileDescriptor(); fdAccess.setHandle(stdin_fd, stdHandles[0]); @@ -168,7 +168,7 @@ final class ProcessImpl extends Process { } if (stdHandles[1] == -1L) - stdout_stream = new ProcessBuilder.NullInputStream(); + stdout_stream = ProcessBuilder.NullInputStream.INSTANCE; else { FileDescriptor stdout_fd = new FileDescriptor(); fdAccess.setHandle(stdout_fd, stdHandles[1]); @@ -177,7 +177,7 @@ final class ProcessImpl extends Process { } if (stdHandles[2] == -1L) - stderr_stream = new ProcessBuilder.NullInputStream(); + stderr_stream = ProcessBuilder.NullInputStream.INSTANCE; else { FileDescriptor stderr_fd = new FileDescriptor(); fdAccess.setHandle(stderr_fd, stdHandles[2]); diff --git a/src/windows/native/sun/font/fontpath.c b/src/windows/native/sun/font/fontpath.c index 67a5aec775546f82c30616eae8b3ec1dff74e966..9c82f3dceb87583dda952f1252ec65700d12d4cd 100644 --- a/src/windows/native/sun/font/fontpath.c +++ b/src/windows/native/sun/font/fontpath.c @@ -154,7 +154,7 @@ static int CALLBACK EnumFontFacesInFamilyProcA( fullname = JNU_NewStringPlatform(env, lpelfe->elfFullName); fullnameLC = (*env)->CallObjectMethod(env, fullname, fmi->toLowerCaseMID, fmi->locale); - (*env)->CallObjectMethod(env, fmi->list, fmi->addMID, fullname); + (*env)->CallBooleanMethod(env, fmi->list, fmi->addMID, fullname); (*env)->CallObjectMethod(env, fmi->fontToFamilyMap, fmi->putMID, fullnameLC, fmi->family); return 1; @@ -238,7 +238,7 @@ static int CALLBACK EnumFontFacesInFamilyProcW( wcslen((LPWSTR)lpelfe->elfFullName)); fullnameLC = (*env)->CallObjectMethod(env, fullname, fmi->toLowerCaseMID, fmi->locale); - (*env)->CallObjectMethod(env, fmi->list, fmi->addMID, fullname); + (*env)->CallBooleanMethod(env, fmi->list, fmi->addMID, fullname); (*env)->CallObjectMethod(env, fmi->fontToFamilyMap, fmi->putMID, fullnameLC, fmi->family); return 1; diff --git a/src/windows/native/sun/nio/ch/DatagramChannelImpl.c b/src/windows/native/sun/nio/ch/DatagramChannelImpl.c index 3dfa490f5fefa53031f46b7a9d7b406ebe45b07e..64156b8613cf3eb5744f4764c0b63cb029cedc1c 100644 --- a/src/windows/native/sun/nio/ch/DatagramChannelImpl.c +++ b/src/windows/native/sun/nio/ch/DatagramChannelImpl.c @@ -120,6 +120,12 @@ Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this, rv = connect((SOCKET)fd, (struct sockaddr *)&sa, sa_len); if (rv == SOCKET_ERROR) { handleSocketError(env, WSAGetLastError()); + } else { + /* Disable WSAECONNRESET errors as socket is no longer connected */ + BOOL enable = FALSE; + DWORD bytesReturned = 0; + WSAIoctl((SOCKET)fd, SIO_UDP_CONNRESET, &enable, sizeof(enable), + NULL, 0, &bytesReturned, NULL, NULL); } } diff --git a/src/windows/native/sun/nio/ch/Net.c b/src/windows/native/sun/nio/ch/Net.c index da485d8e42caed5813b5de08a7151c104c39ff6a..a145393e015c5251d80a227caee5af4c82f728c8 100644 --- a/src/windows/native/sun/nio/ch/Net.c +++ b/src/windows/native/sun/nio/ch/Net.c @@ -67,6 +67,14 @@ typedef struct my_group_source_req { #define COPY_INET6_ADDRESS(env, source, target) \ (*env)->GetByteArrayRegion(env, source, 0, 16, target) +/** + * Enable or disable receipt of WSAECONNRESET errors. + */ +static void setConnectionReset(SOCKET s, BOOL enable) { + DWORD bytesReturned = 0; + WSAIoctl(s, SIO_UDP_CONNRESET, &enable, sizeof(enable), + NULL, 0, &bytesReturned, NULL, NULL); +} JNIEXPORT void JNICALL @@ -109,6 +117,12 @@ Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6, setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&opt, sizeof(opt)); } + + /* Disable WSAECONNRESET errors for initially unconnected UDP sockets */ + if (!stream) { + setConnectionReset(s, FALSE); + } + } else { NET_ThrowNew(env, WSAGetLastError(), "socket"); } @@ -149,12 +163,13 @@ Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, job SOCKETADDRESS sa; int rv; int sa_len; + SOCKET s = (SOCKET)fdval(env, fdo); if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) { return IOS_THROWN; } - rv = connect(fdval(env, fdo), (struct sockaddr *)&sa, sa_len); + rv = connect(s, (struct sockaddr *)&sa, sa_len); if (rv != 0) { int err = WSAGetLastError(); if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) { @@ -162,6 +177,13 @@ Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, job } NET_ThrowNew(env, err, "connect"); return IOS_THROWN; + } else { + /* Enable WSAECONNRESET errors when a UDP socket is connected */ + int type = 0, optlen = sizeof(type); + rv = getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&type, &optlen); + if (rv == 0 && type == SOCK_DGRAM) { + setConnectionReset(s, TRUE); + } } return 1; } diff --git a/src/windows/native/sun/nio/ch/SocketDispatcher.c b/src/windows/native/sun/nio/ch/SocketDispatcher.c index 78265a069ba821136bc7d25fb421a2783edb0226..0fa7c35a9034ee0e25f1950333784ef7594e365b 100644 --- a/src/windows/native/sun/nio/ch/SocketDispatcher.c +++ b/src/windows/native/sun/nio/ch/SocketDispatcher.c @@ -50,6 +50,10 @@ Java_sun_nio_ch_SocketDispatcher_read0(JNIEnv *env, jclass clazz, jobject fdo, jint fd = fdval(env, fdo); WSABUF buf; + /* limit size */ + if (len > MAX_BUFFER_SIZE) + len = MAX_BUFFER_SIZE; + /* destination buffer and size */ buf.buf = (char *)address; buf.len = (u_long)len; @@ -86,6 +90,7 @@ Java_sun_nio_ch_SocketDispatcher_readv0(JNIEnv *env, jclass clazz, jobject fdo, jint fd = fdval(env, fdo); struct iovec *iovp = (struct iovec *)address; WSABUF *bufs = malloc(len * sizeof(WSABUF)); + jint rem = MAX_BUFFER_SIZE; if (bufs == 0) { JNU_ThrowOutOfMemoryError(env, 0); @@ -98,8 +103,16 @@ Java_sun_nio_ch_SocketDispatcher_readv0(JNIEnv *env, jclass clazz, jobject fdo, /* copy iovec into WSABUF */ for(i=0; i rem) + iov_len = rem; bufs[i].buf = (char *)iovp[i].iov_base; - bufs[i].len = (u_long)iovp[i].iov_len; + bufs[i].len = (u_long)iov_len; + rem -= iov_len; + if (rem == 0) { + len = i+1; + break; + } } /* read into the buffers */ @@ -136,6 +149,10 @@ Java_sun_nio_ch_SocketDispatcher_write0(JNIEnv *env, jclass clazz, jobject fdo, jint fd = fdval(env, fdo); WSABUF buf; + /* limit size */ + if (len > MAX_BUFFER_SIZE) + len = MAX_BUFFER_SIZE; + /* copy iovec into WSABUF */ buf.buf = (char *)address; buf.len = (u_long)len; @@ -171,6 +188,7 @@ Java_sun_nio_ch_SocketDispatcher_writev0(JNIEnv *env, jclass clazz, jint fd = fdval(env, fdo); struct iovec *iovp = (struct iovec *)address; WSABUF *bufs = malloc(len * sizeof(WSABUF)); + jint rem = MAX_BUFFER_SIZE; if (bufs == 0) { JNU_ThrowOutOfMemoryError(env, 0); @@ -183,8 +201,16 @@ Java_sun_nio_ch_SocketDispatcher_writev0(JNIEnv *env, jclass clazz, /* copy iovec into WSABUF */ for(i=0; i rem) + iov_len = rem; bufs[i].buf = (char *)iovp[i].iov_base; - bufs[i].len = (u_long)iovp[i].iov_len; + bufs[i].len = (u_long)iov_len; + rem -= iov_len; + if (rem == 0) { + len = i+1; + break; + } } /* read into the buffers */ diff --git a/src/windows/native/sun/nio/ch/nio_util.h b/src/windows/native/sun/nio/ch/nio_util.h index 9c7a6d958c943b2a4feb0fd3ed90be34362cd238..963e93ef033cda1f618d7eb87f93f3391ca09505 100644 --- a/src/windows/native/sun/nio/ch/nio_util.h +++ b/src/windows/native/sun/nio/ch/nio_util.h @@ -25,6 +25,14 @@ #include "jni.h" +/** + * The maximum buffer size for WSASend/WSARecv. Microsoft recommendation for + * blocking operations is to use buffers no larger than 64k. We need the + * maximum to be less than 128k to support asynchronous close on Windows + * Server 2003 and newer editions of Windows. + */ +#define MAX_BUFFER_SIZE ((128*1024)-1) + jint fdval(JNIEnv *env, jobject fdo); jlong handleval(JNIEnv *env, jobject fdo); jboolean isNT(); diff --git a/test/Makefile b/test/Makefile index 9272bbb4cf4dc8f04efae4dc4541c4f4b7126196..ad4ca160486a784a2931b079783ae225363a7bb7 100644 --- a/test/Makefile +++ b/test/Makefile @@ -307,7 +307,7 @@ BUNDLE_UP_AND_EXIT = \ passc="`$(CAT) $(PASSLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ failc="`$(CAT) $(FAILLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ exclc="`$(CAT) $(EXCLUDELIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ - $(ECHO) "TEST STATS: run=$${runc} pass=$${passc} fail=$${failc} excluded=$${exclc}" \ + $(ECHO) "TEST STATS: name=$(UNIQUE_DIR) run=$${runc} pass=$${passc} fail=$${failc} excluded=$${exclc}" \ >> $(STATS_TXT); \ else \ $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \ @@ -326,7 +326,7 @@ all: jtreg_tests # Prep for output prep: clean @$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR) - @$(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)` + @$(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)` # Cleanup clean: @@ -376,7 +376,7 @@ else $(EXCLUDELIST): $(PROBLEM_LISTS) $(TESTDIRS) @$(RM) $@ $@.temp1 $@.temp2 @(($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-all' ) ;\ - ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-$(OS_ARCH)' ) ;\ + ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(PLATFORM_OS)' ) ;\ ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-$(OS_ARCH2)' ) ;\ ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-$(OS_VERSION)') ;\ ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- 'generic-$(OS_ARCH)' ) ;\ @@ -562,7 +562,7 @@ jdk_tools1: com/sun/jdi JDK_ALL_TARGETS += jdk_tools2 jdk_tools2: com/sun/tools sun/jvmstat sun/tools tools vm com/sun/servicetag com/sun/tracing $(call SharedLibraryPermissions,tools/launcher) - $(call RunOthervmBatch) + $(call RunSamevmBatch) # All tools tests jdk_tools: jdk_tools1 jdk_tools2 diff --git a/test/ProblemList.txt b/test/ProblemList.txt index af232a8a7a5f469725c55f6582abdbc7db7dd06c..ceacf84d411d05d3151c4d815fbff0cf6672e497 100644 --- a/test/ProblemList.txt +++ b/test/ProblemList.txt @@ -174,10 +174,6 @@ java/beans/Statement/Test4653179.java generic-all java/beans/XMLEncoder/Test4625418.java solaris-sparc # Problems with samevm and setting security manager (speculation partially) -java/beans/Beans/Test4080522.java generic-all -java/beans/EventHandler/Test6277246.java generic-all -java/beans/EventHandler/Test6277266.java generic-all -java/beans/Introspector/Test6277246.java generic-all java/beans/Introspector/4168475/Test4168475.java generic-all java/beans/Introspector/4520754/Test4520754.java generic-all java/beans/Introspector/6380849/TestBeanInfo.java generic-all @@ -191,229 +187,14 @@ java/beans/XMLEncoder/6329581/Test6329581.java generic-all ############################################################################ -# jdk_io - -# Many of these tests have a tendency to leave input streams open, which -# will cause following tests to be failures when used in samevm mode. - -# Should be othervm, or corrected for samevm, fails with samevm: -java/io/BufferedReader/BigMark.java generic-all -java/io/BufferedReader/ReadLineSync.java generic-all - -# One of these is leaving "a.ser" file open, windows samevm -java/io/Serializable/duplicateSerialFields/Setup.java generic-all -java/io/Serializable/duplicateSerialFields/Test.java generic-all - -# One of these leaving foo.ser open, windows samevm problem -java/io/Serializable/enum/constantSubclasses/Read.java generic-all -java/io/Serializable/enum/constantSubclasses/Write.java generic-all -java/io/Serializable/enum/missingConstant/Read.java generic-all -java/io/Serializable/enum/missingConstant/Write.java generic-all - -# This is leaving subtest1.tmp open, windows samevm problem -java/io/Serializable/oldTests/AnnotateClass.java generic-all - -# One or more of these leave a piotest* file open, windows samevm -java/io/Serializable/oldTests/ArrayFields.java generic-all -java/io/Serializable/oldTests/ArraysOfArrays.java generic-all -java/io/Serializable/oldTests/BinaryTree.java generic-all -java/io/Serializable/oldTests/CircularList.java generic-all -java/io/Serializable/oldTests/SerializeWithException.java generic-all -java/io/Serializable/oldTests/SimpleArrays.java generic-all -java/io/Serializable/oldTests/WritePrimitive.java generic-all - -# Missing close on file 0.ser, windows samevm -java/io/Serializable/enum/badResolve/Read.java generic-all -java/io/Serializable/enum/badResolve/Write.java generic-all - -# One of these tests is leaving parents.ser open, windows samevm -java/io/Serializable/parents/EvolvedClass.java generic-all -java/io/Serializable/parents/OriginalClass.java generic-all - -# One of these tests is leaving file foo.ser and/or bar.ser open, windows samevm -java/io/Serializable/fieldTypeString/Read.java generic-all -java/io/Serializable/fieldTypeString/Write.java generic-all - -# One of these tests is leaving tmp.ser file open, windows samevm -java/io/Serializable/ClassCastExceptionDetail/Read.java generic-all -java/io/Serializable/ClassCastExceptionDetail/Write.java generic-all -java/io/Serializable/GetField/Read.java generic-all -java/io/Serializable/GetField/Read2.java generic-all -java/io/Serializable/GetField/Write.java generic-all -java/io/Serializable/PutField/Read.java generic-all -java/io/Serializable/PutField/Read2.java generic-all -java/io/Serializable/PutField/Write.java generic-all -java/io/Serializable/PutField/Write2.java generic-all -java/io/Serializable/arraySuidConflict/Read.java generic-all -java/io/Serializable/arraySuidConflict/Write.java generic-all -java/io/Serializable/backRefCNFException/Read.java generic-all -java/io/Serializable/backRefCNFException/Write.java generic-all -java/io/Serializable/class/Test.java generic-all -java/io/Serializable/evolution/AddedExternField/ReadAddedField.java generic-all -java/io/Serializable/evolution/AddedExternField/WriteAddedField.java generic-all -java/io/Serializable/evolution/AddedExternField/run.sh generic-all -java/io/Serializable/evolution/AddedField/ReadAddedField.java generic-all -java/io/Serializable/evolution/AddedField/WriteAddedField.java generic-all -java/io/Serializable/evolution/AddedSuperClass/ReadAddedSuperClass.java generic-all -java/io/Serializable/evolution/AddedSuperClass/ReadAddedSuperClass2.java generic-all -java/io/Serializable/evolution/AddedSuperClass/WriteAddedSuperClass.java generic-all -java/io/Serializable/proxy/skipMissing/Read.java generic-all -java/io/Serializable/proxy/skipMissing/Write.java generic-all -java/io/Serializable/readObjectNoData/Read.java generic-all -java/io/Serializable/readObjectNoData/Write.java generic-all -java/io/Serializable/skipWriteObject/Read.java generic-all -java/io/Serializable/skipWriteObject/Write.java generic-all -java/io/Serializable/skippedObjCNFException/Read.java generic-all -java/io/Serializable/skippedObjCNFException/Write.java generic-all -java/io/Serializable/stopCustomDeserialization/Read.java generic-all -java/io/Serializable/stopCustomDeserialization/Write.java generic-all -java/io/Serializable/unresolvedClassDesc/Read.java generic-all -java/io/Serializable/unresolvedClassDesc/Write.java generic-all -java/io/Serializable/unshared/Read.java generic-all -java/io/Serializable/unshared/Write.java generic-all -java/io/Serializable/wrongReturnTypes/Read.java generic-all -java/io/Serializable/wrongReturnTypes/Write.java generic-all - -# Windows samevm issues? triggers other tests to fail, missing close() on f.txt? -java/io/DataInputStream/OpsAfterClose.java generic-all - -# Windows 32bit samevm failure: RuntimeException: File.getFreeSpace() failed -java/io/File/MaxPathLength.java generic-all - -# Should be othervm, or corrected for samevm, fails with samevm: -java/io/File/DeleteOnExit.java generic-all -java/io/File/DeleteOnExitLong.java generic-all -java/io/File/DeleteOnExitNPE.java generic-all -java/io/File/IsHidden.java generic-all -java/io/FileDescriptor/FileChannelFDTest.java generic-all -java/io/FileDescriptor/Finalize.java generic-all -java/io/FileInputStream/FinalizeShdCallClose.java generic-all - -# Known to cause samevm issues on windows, other tests fail, missing close()? -java/io/FileInputStream/OpsAfterClose.java generic-all - -# Should be othervm, or corrected for samevm, fails with samevm: -java/io/FileOutputStream/FinalizeShdCallClose.java generic-all - -# Known to cause samevm issues on windows, other tests fail, missing close()? -java/io/FileOutputStream/OpsAfterClose.java generic-all - -# Windows samevm issues? triggers other tests to fail, missing close() on f.txt? -java/io/InputStream/OpsAfterClose.java generic-all - -# Missing close() on x.ReadBounds file? Windows samevm issues -java/io/InputStream/ReadParams.java generic-all - -# Known to cause samevm issues on windows, other tests fail, missing close()? -java/io/InputStreamReader/GrowAfterEOF.java generic-all - -# Should be othervm, or corrected for samevm, fails with samevm: -java/io/ObjectInputStream/ResolveProxyClass.java generic-all - -# Not doing a close() on x.ParameterCheck file? windows samevm cascade error -java/io/RandomAccessFile/ParameterCheck.java generic-all - -# Not doing a close on x.ReadLine file? windows cascade samevm problems -java/io/RandomAccessFile/ReadLine.java generic-all - -# Not doing close on file input x.WriteByteChars, windows samevm problems -java/io/RandomAccessFile/WriteBytesChars.java generic-all - -# Not doing close on file input x.WriteUTF, windows samevm problems -java/io/RandomAccessFile/WriteUTF.java generic-all - -# Possibly, not doing a close() on input.txt, windows samevm issues. -java/io/RandomAccessFile/skipBytes/SkipBytes.java generic-all -java/io/readBytes/MemoryLeak.java generic-all -java/io/readBytes/ReadBytesBounds.java generic-all - -# Missing close on fields.ser, windows samevm -java/io/Serializable/checkModifiers/CheckModifiers.java generic-all - -# Should be othervm, or corrected for samevm, fails with samevm: -java/io/Serializable/auditStreamSubclass/AuditStreamSubclass.java generic-all -java/io/Serializable/proxy/Basic.java generic-all - -# Possibly not doing a close() on input.txt, windows samevm issues. -java/io/StreamTokenizer/Comment.java generic-all - -############################################################################ - # jdk_lang -# Some of these tests (like java/lang/management) may just need to be marked -# othervm, but that is partially speculation. - -# Samevm failure on OpenSolaris, security manager? -java/lang/ClassLoader/UninitializedParent.java generic-all - # Times out on solaris 10 sparc java/lang/ClassLoader/Assert.java generic-all -# Fedora 9 X64, RuntimeException: MyThread expected to be blocked on lock, but got null -java/lang/management/ThreadMXBean/ThreadStateTest.java generic-all - -# RuntimeException: Uptime of the JVM is more than 30 minutes (32 minutes). -java/lang/management/RuntimeMXBean/UpTime.java generic-all - # Solaris sparc, samevm, java.lang.Exception: Read from closed pipe hangs java/lang/Runtime/exec/SleepyCat.java generic-all -# Need to be marked othervm, or changed to be samevm safe -java/lang/annotation/ParameterAnnotations.java generic-all - -# Need to be marked othervm, or changed to be samevm safe -java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java generic-all -java/lang/ClassLoader/findSystemClass/Loader.java generic-all - -# Fedora 9 32bit, -client, samevm, Error while cleaning up threads after test -java/lang/management/ThreadMXBean/Locks.java generic-all - -# Need to be marked othervm, or changed to be samevm safe -java/lang/management/ClassLoadingMXBean/LoadCounts.java generic-all -java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java generic-all -java/lang/management/ManagementFactory/MXBeanProxyTest.java generic-all -java/lang/management/ManagementFactory/ThreadMXBeanProxy.java generic-all -java/lang/management/MemoryMXBean/CollectionUsageThreshold.java generic-all -java/lang/management/MemoryMXBean/GetMBeanInfo.java generic-all -java/lang/management/MemoryMXBean/LowMemoryTest.java generic-all -java/lang/management/MemoryMXBean/MemoryManagement.java generic-all -java/lang/management/MemoryMXBean/MemoryTest.java generic-all -java/lang/management/MemoryMXBean/Pending.java generic-all - -# Problematic on all platforms (even as othervm) -java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java generic-all - -# Causes jtreg exit samevm issues due to non-String object in system properties -java/lang/management/RuntimeMXBean/GetSystemProperties.java generic-all - -# Need to be marked othervm, or changed to be samevm safe -java/lang/management/RuntimeMXBean/PropertiesTest.java generic-all -java/lang/management/ThreadMXBean/AllThreadIds.java generic-all -java/lang/management/ThreadMXBean/EnableTest.java generic-all -java/lang/management/ThreadMXBean/FindMonitorDeadlock.java generic-all -java/lang/management/ThreadMXBean/LockingThread.java generic-all -java/lang/management/ThreadMXBean/MonitorDeadlock.java generic-all -java/lang/management/ThreadMXBean/MyOwnSynchronizer.java generic-all -java/lang/management/ThreadMXBean/SharedSynchronizer.java generic-all -java/lang/management/ThreadMXBean/SynchronizerLockingThread.java generic-all -java/lang/management/ThreadMXBean/ThreadCounts.java generic-all - -# Need to be marked othervm, or changed to be samevm safe -java/lang/reflect/Proxy/Boxing.java generic-all -java/lang/reflect/Proxy/ClassRestrictions.java generic-all -java/lang/reflect/Proxy/returnTypes/Test.java generic-all - -# Need to be marked othervm, or changed to be samevm safe -java/lang/Runtime/exec/LotsOfOutput.java generic-all -java/lang/System/ExitFinalizersAndJIT.java generic-all -java/lang/System/finalization/FinThreads.java generic-all -java/lang/System/IgnoreNullSecurityManager.java generic-all -java/lang/Thread/GenerifyStackTraces.java generic-all -java/lang/Thread/StackTraces.java generic-all -java/lang/ThreadGroup/Daemon.java generic-all -java/lang/ThreadGroup/NullThreadName.java generic-all - # Times out on solaris sparc -server java/lang/ThreadLocal/MemoryLeak.java solaris-all @@ -427,18 +208,12 @@ java/lang/ClassLoader/deadlock/TestCrossDelegate.sh generic-all # jdk_management +# Failing, bug was filed: 6959636 +javax/management/loading/LibraryLoader/LibraryLoaderTest.java generic-all + # Access denied messages on windows/mks, filed 6954450 sun/management/jmxremote/bootstrap/RmiSslNoKeyStoreTest.sh windows-all -# Filed 6951284, fails on linux 64bit Fedora 9, peak thread count differences -java/lang/management/ThreadMXBean/ResetPeakThreadCount.java generic-all - -# Started failing on linux and solaris (filed 6950927) -# com.sun.tools.attach.AttachNotSupportedException: -# Unable to open socket file: -# target process not responding or HotSpot VM not loaded -sun/management/jmxremote/bootstrap/JvmstatCountersTest.java generic-all - # Fails on linux: KO: StringMonitor notification missed or not emitted javax/management/monitor/NonComparableAttributeValueTest.java generic-all @@ -734,9 +509,6 @@ sun/net/www/protocol/http/DigestTest.java generic-all # Suspect many of these tests auffer from using fixed ports, no concrete # evidence. -# Failing on Solaris x86 and Linux x86, filed 6934585 -java/nio/channels/AsynchronousSocketChannel/Basic.java generic-all - # Occasionally Failing with java.lang.AssertionError on Windows X64 # at sun.nio.ch.PendingIoCache.clearPendingIoMap(PendingIoCache.java:144) #java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java windows-all @@ -748,26 +520,6 @@ java/nio/channels/Selector/Wakeup.java windows-all com/sun/nio/sctp/SctpChannel/Send.java generic-all com/sun/nio/sctp/SctpChannel/Shutdown.java generic-all -# Fails on Windows 2000, Can't delete test directory .\x.SetLastModified.dir -# at SetLastModified.main(SetLastModified.java:107) -java/io/File/SetLastModified.java generic-all - -# Fails on Solaris 10 x64, address already in use -java/nio/channels/DatagramChannel/SRTest.java generic-all - -# Fails on Solaris 10 x86, times out -java/nio/channels/DatagramChannel/Sender.java generic-all - -# Fails on Fedora 9 x86, address in use -java/nio/channels/Selector/SelectWrite.java generic-all - -# Fails on Fedora 9 32bit times out -java/nio/channels/DatagramChannel/EmptyBuffer.java generic-all - -# Fails on Windows 2000, ExceptionInInitializerError -# in WindowsAsynchronousServerSocketChannelImpl.java:316 -java/nio/channels/AsynchronousChannelGroup/Unbounded.java generic-all - # Fails on Windows 2000, times out java/nio/channels/FileChannel/Transfer.java generic-all @@ -781,9 +533,6 @@ com/sun/nio/sctp/SctpChannel/Receive.java generic-all # Triggers a hotspot crash on Fedora 9 32bit -server and Windows X64 samevm sun/nio/cs/TestUTF8.java generic-all -# Solaris sparc, socket timeout -java/nio/channels/spi/SelectorProvider/inheritedChannel/run_tests.sh generic-all - # Runtime exception on windows X64, samevm mode java/nio/channels/Selector/WakeupNow.java generic-all @@ -806,14 +555,12 @@ com/sun/nio/sctp/SctpMultiChannel/SocketOptionTests.java generic-all # Linux 64bit failures. too many files open java/nio/channels/Selector/HelperSlowToDie.java generic-all -# Timeouts etc. on Window -java/nio/channels/AsyncCloseAndInterrupt.java windows-all - -# Gets java.lang.ExceptionInInitializerError on windows: (Windows 2000 only?) +# Gets java.lang.ExceptionInInitializerError on Windows 2000 (need XP or newer) java/nio/channels/AsynchronousChannelGroup/Basic.java windows-5.0 java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java windows-5.0 java/nio/channels/AsynchronousChannelGroup/Identity.java windows-5.0 java/nio/channels/AsynchronousChannelGroup/Restart.java windows-5.0 +java/nio/channels/AsynchronousChannelGroup/Unbounded.java windows-5.0 java/nio/channels/AsynchronousDatagramChannel/Basic.java windows-5.0 java/nio/channels/AsynchronousFileChannel/Lock.java windows-5.0 java/nio/channels/AsynchronousServerSocketChannel/Basic.java windows-5.0 @@ -824,19 +571,10 @@ java/nio/channels/AsynchronousSocketChannel/Leaky.java windows-5.0 java/nio/channels/AsynchronousSocketChannel/StressLoopback.java windows-5.0 java/nio/channels/Channels/Basic2.java windows-5.0 -# Solaris sparc timeout -java/nio/channels/DatagramChannel/Connect.java generic-all - -# Solaris i586 timeouts -java/nio/channels/DatagramChannel/EmptyBuffer.java solaris-all - # Failed loopback connection? On windows 32bit? # Considered a stress test, can consume all resources. java/nio/channels/Selector/LotsOfChannels.java generic-all -# Solaris sparcv9, just fails with exception -java/nio/channels/Selector/OpRead.java solaris-sparc - # Windows i586 client, crashed hotspot? Unpredictable # Considered a stress test, can consume all resources. java/nio/channels/Selector/RegAfterPreClose.java generic-all @@ -851,18 +589,6 @@ java/nio/channels/ServerSocketChannel/AdaptServerSocket.java windows-all java/nio/channels/SocketChannel/ConnectState.java windows-all java/nio/channels/SocketChannel/FinishConnect.java windows-all -# Need to be marked othervm, or changed to be samevm safe -java/nio/channels/SocketChannel/OpenLeak.java generic-all - -# Gets java.net.BindException alot (static port number?) -java/nio/channels/SocketChannel/VectorIO.java generic-all - -# Solaris i586 java.net.BindExceptions -java/nio/channels/SocketChannel/VectorParams.java solaris-all - -# Linux i586 address already in use, samevm issues -java/nio/channels/SocketChannel/Write.java generic-all - # Fails on all platforms due to overlap of JDK jar file contents: sun/nio/cs/Test4200310.sh generic-all @@ -1136,97 +862,6 @@ java/text/Bidi/Bug6665028.java linux-x64 # jdk_tools -# Filed bug 6951287, failed on Linux 64bit, sometimes? -com/sun/jdi/PopAndInvokeTest.java generic-all - -# Some of the tools tests kind of require "othervm" or if they don't will -# always be firing up another VM anyway due to the nature of tools testing. -# So most if not all tools tests are now being run with "othervm" mode. -# Some of these tools tests have a tendency to use fixed ports, bad idea. - -# Fails with -ea -esa on Solaris, Assertion error (Solaris specific test) -com/sun/tracing/BasicFunctionality.java generic-all - -# Fails on Fedora 9 32bit, jps output differs problem -sun/tools/jstatd/jstatdDefaults.sh generic-all - -# Fails on Linux Fedora 9 32bit, Could not read data for remote JVM 16133 -# jstat output differs from expected output -sun/tools/jstatd/jstatdExternalRegistry.sh generic-all - -# Output of jps differs from expected output. -# Invalid argument count on solaris-sparc and x64 -sun/tools/jstatd/jstatdPort.sh generic-all - -# othervm mode, Could not synchronize with target -sun/tools/jps/jps-l_1.sh generic-all -sun/tools/jps/jps-l_2.sh generic-all -sun/tools/jps/jps-lm.sh generic-all -sun/tools/jps/jps-Vvml_2.sh generic-all -sun/tools/jps/jps-m_2.sh generic-all - -# Fails on Solaris 10 sparcv9, shell exits with 1 -# Turning off use of shared archive because of choice of garbage collector or large pages -# Could not synchronize with target -sun/tools/jps/jps-v_1.sh generic-all - -# Fails on OpenSolaris "Could not synchronize with target" -sun/tools/jps/jps-Defaults.sh generic-all -sun/tools/jps/jps-V_2.sh generic-all -sun/tools/jps/jps-Vm_2.sh generic-all -sun/tools/jps/jps-Vvm.sh generic-all -sun/tools/jps/jps-Vvml.sh generic-all -sun/tools/jps/jps-m.sh generic-all - -# Server name error, port 2098 problem? -sun/tools/jstatd/jstatdServerName.sh generic-all - -# These tests fail on solaris sparc, all the time -com/sun/servicetag/DeleteServiceTag.java generic-all -com/sun/servicetag/DuplicateNotFound.java generic-all -com/sun/servicetag/FindServiceTags.java generic-all -com/sun/servicetag/InstanceUrnCheck.java generic-all -com/sun/servicetag/InvalidRegistrationData.java generic-all -com/sun/servicetag/InvalidServiceTag.java generic-all -com/sun/servicetag/JavaServiceTagTest.java generic-all -com/sun/servicetag/JavaServiceTagTest1.java generic-all -com/sun/servicetag/NewRegistrationData.java generic-all -com/sun/servicetag/SystemRegistryTest.java generic-all -com/sun/servicetag/TestLoadFromXML.java generic-all -com/sun/servicetag/UpdateServiceTagTest.java generic-all -com/sun/servicetag/ValidRegistrationData.java generic-all - -# Problems on windows, jmap.exe hangs? -com/sun/tools/attach/BasicTests.sh windows-all - -# Fails on Solaris 10 sparc, in othervm mode, throws unexpected exception -sun/jvmstat/monitor/MonitoredVm/CR6672135.java generic-all - -# Unexpected Monitor Exception, solaris sparc -client -sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.sh generic-all - -# Problems on windows, jmap.exe hangs? (these run jmap) -sun/tools/jmap/Basic.sh windows-all - -# Invalid argument count on solaris-sparc and x64 -sun/tools/jstatd/jstatdDefaults.sh solaris-all - -# Solaris sparcv9, jps output does not match, x64 different -sun/tools/jstatd/jstatdExternalRegistry.sh solaris-all - -# Solaris 10 sparc 32bit -client, java.lang.AssertionError: Some tests failed -tools/jar/JarEntryTime.java generic-all - -# Times out on sparc? -tools/launcher/VersionCheck.java generic-all - -# These tests fail on solaris sparc, all the time -tools/jar/ChangeDir.java generic-all - -# Cannot write jar -# Also, possible problems on windows, jmap.exe hangs? -tools/jar/index/MetaInf.java windows-all - ############################################################################ # jdk_util @@ -1235,12 +870,6 @@ tools/jar/index/MetaInf.java windows-all # 11 separate stacktraces created... file reuse problem? java/util/zip/ZipFile/ReadLongZipFileName.java generic-all -# Recent failure on all platforms -sun/util/resources/TimeZone/Bug6317929.java generic-all - -# Fails with -ea -esa on all platforms with Assertion error -java/util/ResourceBundle/Test4300693.java generic-all - # Failing on all -client 32bit platforms starting with b77? See 6908348. java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java generic-all @@ -1267,40 +896,8 @@ java/util/EnumSet/EnumSetBash.java solaris-sparc # Failing to close an input stream? "foo", triggers samevm windows failures java/util/Formatter/Constructors.java generic-all -# Need to be marked othervm, or changed to be samevm safe -java/util/Locale/Bug4175998Test.java generic-all -java/util/Locale/Bug4184873Test.java generic-all -java/util/Locale/LocaleTest.java generic-all - -# Need to be marked othervm, or changed to be samevm safe -java/util/logging/GetGlobalTest.java generic-all -java/util/logging/LoggerSubclass.java generic-all -java/util/logging/LoggingDeadlock.java generic-all -java/util/logging/LoggingDeadlock2.java generic-all -java/util/logging/LoggingMXBeanTest.java generic-all -java/util/logging/LoggingMXBeanTest2.java generic-all -java/util/logging/LoggingNIOChange.java generic-all -java/util/logging/ParentLoggersTest.java generic-all - -# Need to be marked othervm, or changed to be samevm safe -java/util/ResourceBundle/Bug4168625Test.java generic-all -java/util/ResourceBundle/Bug6359330.java generic-all -java/util/ResourceBundle/TestBug4179766.java generic-all - # Need to be marked othervm, or changed to be samevm safe java/util/WeakHashMap/GCDuringIteration.java generic-all -# Possible missing input stream close()? Causes samevm issues on windows -java/util/zip/InfoZip.java generic-all - -# Missing a close() on file Test0.zip? windows samevm cascade problem -java/util/zip/ZipFile/Comment.java generic-all - -# Suspect missing close() on bad*.zip files, windows cascade errors with samevm -java/util/zip/ZipFile/CorruptedZipFiles.java generic-all - -# Should be samevm but causes problems with samevm, no details: -java/util/zip/ZipFile/ManyEntries.java generic-all - ############################################################################ diff --git a/test/com/sun/jdi/PopAndInvokeTest.java b/test/com/sun/jdi/PopAndInvokeTest.java index 3cc6381c600ff2bd70aeeb3b1eeec72c41762d12..b601f5e40bdc50b5148a34c726dfa19a18d296dd 100644 --- a/test/com/sun/jdi/PopAndInvokeTest.java +++ b/test/com/sun/jdi/PopAndInvokeTest.java @@ -24,6 +24,7 @@ /** * @test * @bug 6517249 + * @ignore 6951287 * @summary JDWP: Cannot do an invokeMethod after a popFrames operation * * @author jjh diff --git a/test/com/sun/servicetag/FindServiceTags.java b/test/com/sun/servicetag/FindServiceTags.java index 0d731d2a6b963150340dfbe6bee941b15a12da9b..0e8267399478e6d257aebb9ee79ae9f49d2c7763 100644 --- a/test/com/sun/servicetag/FindServiceTags.java +++ b/test/com/sun/servicetag/FindServiceTags.java @@ -56,8 +56,17 @@ public class FindServiceTags { private static int expectedUrnCount = 3; public static void main(String[] argv) throws Exception { - registry = Util.getSvcTagClientRegistry(); + try { + registry = Util.getSvcTagClientRegistry(); + runTest(); + } finally { + // restore empty registry file + Util.emptyRegistryFile(); + } + System.out.println("Test passed."); + } + public static void runTest() throws Exception { for (String filename : files) { File f = new File(servicetagDir, filename); ServiceTag svcTag = Util.newServiceTag(f); @@ -95,7 +104,6 @@ public class FindServiceTags { tags.size()); } - System.out.println("Test passed."); } private static void findServiceTags(String productUrn) throws Exception { diff --git a/test/com/sun/servicetag/JavaServiceTagTest1.java b/test/com/sun/servicetag/JavaServiceTagTest1.java index eb72cc7b8dcdbef98b22a2c4372dd3f53d3d90b1..00713f999debaf0f28dc40d7a9e40d1a7ca572f6 100644 --- a/test/com/sun/servicetag/JavaServiceTagTest1.java +++ b/test/com/sun/servicetag/JavaServiceTagTest1.java @@ -31,7 +31,7 @@ * are both created correctly. * @author Mandy Chung * - * @run build JavaServiceTagTest1 + * @run build JavaServiceTagTest1 SvcTagClient Util * @run main JavaServiceTagTest1 */ @@ -46,6 +46,16 @@ public class JavaServiceTagTest1 { private static File svcTagFile; private static Registry registry; public static void main(String[] argv) throws Exception { + try { + registry = Util.getSvcTagClientRegistry(); + runTest(); + } finally { + // restore empty registry file + Util.emptyRegistryFile(); + } + } + + private static void runTest() throws Exception { // cleanup the registration.xml and servicetag file in the test directory System.setProperty("servicetag.dir.path", registrationDir); regFile = new File(registrationDir, "registration.xml"); @@ -54,8 +64,6 @@ public class JavaServiceTagTest1 { svcTagFile = new File(registrationDir, "servicetag"); svcTagFile.delete(); - registry = Util.getSvcTagClientRegistry(); - // verify that only one service tag is created ServiceTag st1 = testJavaServiceTag("Test1"); diff --git a/test/com/sun/servicetag/SystemRegistryTest.java b/test/com/sun/servicetag/SystemRegistryTest.java index 0e0be1ccb1eef8d1ec68c615108dbfad0ed20337..7e521c1f6808aafbbbc921b03a23893047153b0c 100644 --- a/test/com/sun/servicetag/SystemRegistryTest.java +++ b/test/com/sun/servicetag/SystemRegistryTest.java @@ -50,8 +50,16 @@ public class SystemRegistryTest { private static Registry registry; public static void main(String[] argv) throws Exception { - registry = Util.getSvcTagClientRegistry(); + try { + registry = Util.getSvcTagClientRegistry(); + runTest(); + } finally { + // restore empty registry file + Util.emptyRegistryFile(); + } + } + private static void runTest() throws Exception { for (String filename : files) { File f = new File(servicetagDir, filename); ServiceTag svcTag = Util.newServiceTag(f); diff --git a/test/com/sun/servicetag/Util.java b/test/com/sun/servicetag/Util.java index 8fed8be551096a86ce2d2a5f4c3495521210fe71..77bc7da8355393f92b53321015eaace41b85a305 100644 --- a/test/com/sun/servicetag/Util.java +++ b/test/com/sun/servicetag/Util.java @@ -219,25 +219,25 @@ public class Util { } private static Registry registry = null; + private static File registryFile = null; /** * Returns the Registry processed by SvcTagClient that simulates * stclient. */ static synchronized Registry getSvcTagClientRegistry() throws IOException { + String regDir = System.getProperty("test.classes"); + File f = new File(regDir, "registry.xml"); if (registry != null) { + if (!f.equals(registryFile) && f.length() != 0) { + throw new AssertionError("Has to be empty registry.xml to run in samevm"); + } return registry; } // System.setProperty("servicetag.verbose", "true"); // enable the helper class System.setProperty("servicetag.sthelper.supported", "true"); - - // clean up registry.xml - String regDir = System.getProperty("test.classes"); - File registryFile = new File(regDir, "registry.xml"); - if (registryFile.exists()) { - registryFile.delete(); - } + registryFile = f; String stclientCmd = Util.getSvcClientCommand(registryFile.getCanonicalPath()); System.out.println("stclient cmd: " + stclientCmd); @@ -247,4 +247,17 @@ public class Util { registry = Registry.getSystemRegistry(); return registry; } + + static void emptyRegistryFile() throws IOException { + if (registryFile.exists()) { + BufferedOutputStream out = new BufferedOutputStream( + new FileOutputStream(registryFile)); + try { + RegistrationData data = new RegistrationData(); + data.storeToXML(out); + } finally { + out.close(); + } + } + } } diff --git a/test/com/sun/tools/attach/BasicTests.sh b/test/com/sun/tools/attach/BasicTests.sh index 4c9236cca7fe2061718bf51261d3ee0a39c2b36b..3f8f8571411275a4c944ddf44bd5c651af8872d1 100644 --- a/test/com/sun/tools/attach/BasicTests.sh +++ b/test/com/sun/tools/attach/BasicTests.sh @@ -37,6 +37,21 @@ then exit 1 fi +# Windows 2000 is a problem here, so we skip it, see 6962615 +osrev=`uname -a` +if [ "`echo ${osrev} | grep 'CYGWIN'`" != "" ] ; then + if [ "`echo ${osrev} | grep '5.0'`" != "" ] ; then + echo "Treating as a pass, not testing Windows 2000" + exit 0 + fi +fi +if [ "`echo ${osrev} | grep 'Windows'`" != "" ] ; then + if [ "`echo ${osrev} | grep '5 00'`" != "" ] ; then + echo "Treating as a pass, not testing Windows 2000" + exit 0 + fi +fi + . ${TESTSRC}/CommonSetup.sh . ${TESTSRC}/ApplicationSetup.sh . ${TESTSRC}/AgentSetup.sh diff --git a/test/com/sun/tracing/BasicFunctionality.java b/test/com/sun/tracing/BasicFunctionality.java index 0311fde0282c83e9a38f999c9b541855c11243a1..614e73e2a5a6ceccf7eb939cc909cb1a69e6071c 100644 --- a/test/com/sun/tracing/BasicFunctionality.java +++ b/test/com/sun/tracing/BasicFunctionality.java @@ -24,6 +24,7 @@ /** * @test * @bug 6537506 + * @ignore 6962535 * @summary Basic unit test for tracing framework */ diff --git a/test/java/awt/FileDialog/FilenameFilterTest/FilenameFilterTest.java b/test/java/awt/FileDialog/FilenameFilterTest/FilenameFilterTest.java index 323ede041399f19dbfbc6e1c79dbce08ebc0a86b..f93c2cd746b83700a740c912898b4591c1c2846a 100644 --- a/test/java/awt/FileDialog/FilenameFilterTest/FilenameFilterTest.java +++ b/test/java/awt/FileDialog/FilenameFilterTest/FilenameFilterTest.java @@ -83,6 +83,12 @@ public class FilenameFilterTest extends Applet if (fd == null) { throw new RuntimeException("fd is null (very unexpected thing :("); } + //Wait a little; some native dialog implementations may take a while + //to initialize and call the filter. See 6959787 for an example. + try { + Thread.sleep(5000); + } catch (Exception ex) { + } fd.dispose(); if (!filter_was_called) { throw new RuntimeException("Filter was not called"); diff --git a/test/java/beans/Beans/Test4080522.java b/test/java/beans/Beans/Test4080522.java index a26a2f10eb456258624fab7ba1d6513c1f78c514..c6ee1b89be4b09f0ee4e24c3c202d5d3cd0142fd 100644 --- a/test/java/beans/Beans/Test4080522.java +++ b/test/java/beans/Beans/Test4080522.java @@ -29,6 +29,7 @@ * Beans.setGuiAvailable * Introspector.setBeanInfoSearchPath * PropertyEditorManager.setEditorSearchPath + * @run main/othervm Test4080522 * @author Graham Hamilton */ diff --git a/test/java/beans/EventHandler/Test6277246.java b/test/java/beans/EventHandler/Test6277246.java index e009aad3447c6c8428217901ac6588ac5d91fa23..f0d9aaaa811ca9eb6105e6913ac4414d11a23280 100644 --- a/test/java/beans/EventHandler/Test6277246.java +++ b/test/java/beans/EventHandler/Test6277246.java @@ -25,6 +25,7 @@ * @test * @bug 6277246 * @summary Tests problem with java.beans use of reflection + * @run main/othervm Test6277246 * @author Jeff Nisewanger */ diff --git a/test/java/beans/EventHandler/Test6277266.java b/test/java/beans/EventHandler/Test6277266.java index f64f852fd5bb71b9c3c12835e39d27d3552b8a91..a23a4daeaf924023d31cd4098786bd507b66de18 100644 --- a/test/java/beans/EventHandler/Test6277266.java +++ b/test/java/beans/EventHandler/Test6277266.java @@ -25,6 +25,7 @@ * @test * @bug 6277266 * @summary Tests access control issue in EventHandler + * @run main/othervm Test6277266 * @author Jeff Nisewanger */ diff --git a/test/java/beans/Introspector/Test6277246.java b/test/java/beans/Introspector/Test6277246.java index 826f6e42fc52a639a0c51524132796d9d8504846..40ea01616d86c300dcb3de472a54ace01f0b797a 100644 --- a/test/java/beans/Introspector/Test6277246.java +++ b/test/java/beans/Introspector/Test6277246.java @@ -25,6 +25,7 @@ * @test * @bug 6277246 * @summary Tests problem with java.beans use of reflection + * @run main/othervm Test6277246 * @author Jeff Nisewanger */ diff --git a/test/java/dyn/MethodHandlesTest.java b/test/java/dyn/MethodHandlesTest.java index 200d26044e58c4351028eab95a962abb28e4c1cd..3b33cef0e01cf947abd9d65316c5b37c4027118f 100644 --- a/test/java/dyn/MethodHandlesTest.java +++ b/test/java/dyn/MethodHandlesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2010, 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 @@ -26,19 +26,18 @@ /* @test * @summary unit tests for java.dyn.MethodHandles * @compile -XDinvokedynamic MethodHandlesTest.java - * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableInvokeDynamic jdk.java.dyn.MethodHandlesTest + * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableInvokeDynamic test.java.dyn.MethodHandlesTest */ -package jdk.java.dyn; +package test.java.dyn; import java.dyn.*; import java.dyn.MethodHandles.Lookup; import java.lang.reflect.*; import java.util.*; -import java.util.logging.Level; -import java.util.logging.Logger; import org.junit.*; import static org.junit.Assert.*; +import static org.junit.Assume.*; /** @@ -47,7 +46,11 @@ import static org.junit.Assert.*; */ public class MethodHandlesTest { // How much output? - static int verbosity = 1; + static int verbosity = 0; + static { + String vstr = System.getProperty("test.java.dyn.MethodHandlesTest.verbosity"); + if (vstr != null) verbosity = Integer.parseInt(vstr); + } // Set this true during development if you want to fast-forward to // a particular new, non-working test. Tests which are known to @@ -57,55 +60,82 @@ public class MethodHandlesTest { // Set true to test more calls. If false, some tests are just // lookups, without exercising the actual method handle. - static boolean DO_MORE_CALLS = false; + static boolean DO_MORE_CALLS = true; @Test public void testFirst() throws Throwable { verbosity += 9; try { // left blank for debugging - } finally { verbosity -= 9; } + } finally { printCounts(); verbosity -= 9; } } // current failures @Test @Ignore("failure in call to makeRawRetypeOnly in ToGeneric") public void testFail_1() throws Throwable { + // AMH.: IllegalArgumentException: bad adapter (conversion=0xfffab300): adapter pushes too many parameters testSpreadArguments(int.class, 0, 6); } - @Test @Ignore("failure in JVM when expanding the stack") + @Test @Ignore("failure in JVM when expanding the stack using asm stub for _adapter_spread_args") public void testFail_2() throws Throwable { // if CONV_OP_IMPLEMENTED_MASK includes OP_SPREAD_ARGS, this crashes: testSpreadArguments(Object.class, 0, 2); } @Test @Ignore("IllArgEx failure in call to ToGeneric.make") public void testFail_3() throws Throwable { + // ToGeneric.: UnsupportedOperationException: NYI: primitive parameters must follow references; entryType = (int,java.lang.Object)java.lang.Object testSpreadArguments(int.class, 1, 2); } @Test @Ignore("IllArgEx failure in call to ToGeneric.make") public void testFail_4() throws Throwable { + // ToGeneric.: UnsupportedOperationException: NYI: primitive parameters must follow references; entryType = (int,java.lang.Object)java.lang.Object testCollectArguments(int.class, 1, 2); } @Test @Ignore("cannot collect leading primitive types") public void testFail_5() throws Throwable { + // ToGeneric.: UnsupportedOperationException: NYI: primitive parameters must follow references; entryType = (int,java.lang.Object)java.lang.Object testInvokers(MethodType.genericMethodType(2).changeParameterType(0, int.class)); } @Test @Ignore("should not insert arguments beyond MethodHandlePushLimit") public void testFail_6() throws Throwable { - testInsertArguments(0, 0, MAX_ARG_INCREASE+1); + // ValueConversions.varargsArray: UnsupportedOperationException: NYI: cannot form a varargs array of length 13 + testInsertArguments(0, 0, MAX_ARG_INCREASE+10); } static final int MAX_ARG_INCREASE = 3; public MethodHandlesTest() { } + @Before + public void checkImplementedPlatform() { + boolean platformOK = false; + Properties properties = System.getProperties(); + String vers = properties.getProperty("java.vm.version"); + String name = properties.getProperty("java.vm.name"); + String arch = properties.getProperty("os.arch"); + if ((arch.equals("amd64") || arch.equals("i386") || arch.equals("x86") || + arch.equals("sparc") || arch.equals("sparcv9")) && + (name.contains("Client") || name.contains("Server")) + ) { + platformOK = true; + } else { + System.err.println("Skipping tests for unsupported platform: "+Arrays.asList(vers, name, arch)); + } + assumeTrue(platformOK); + } + String testName; + static int allPosTests, allNegTests; int posTests, negTests; @After public void printCounts() { - if (verbosity >= 1 && (posTests | negTests) != 0) { + if (verbosity >= 2 && (posTests | negTests) != 0) { System.out.println(); if (posTests != 0) System.out.println("=== "+testName+": "+posTests+" positive test cases run"); if (negTests != 0) System.out.println("=== "+testName+": "+negTests+" negative test cases run"); + allPosTests += posTests; + allNegTests += negTests; + posTests = negTests = 0; } } void countTest(boolean positive) { @@ -115,7 +145,7 @@ public class MethodHandlesTest { void countTest() { countTest(true); } void startTest(String name) { if (testName != null) printCounts(); - if (verbosity >= 0) + if (verbosity >= 1) System.out.println(name); posTests = negTests = 0; testName = name; @@ -125,11 +155,17 @@ public class MethodHandlesTest { public static void setUpClass() throws Exception { calledLog.clear(); calledLog.add(null); - nextArg = 1000000; + nextArgVal = INITIAL_ARG_VAL; } @AfterClass public static void tearDownClass() throws Exception { + int posTests = allPosTests, negTests = allNegTests; + if (verbosity >= 2 && (posTests | negTests) != 0) { + System.out.println(); + if (posTests != 0) System.out.println("=== "+posTests+" total positive test cases"); + if (negTests != 0) System.out.println("=== "+negTests+" total negative test cases"); + } } static List calledLog = new ArrayList(); @@ -144,18 +180,17 @@ public class MethodHandlesTest { static void assertCalled(String name, Object... args) { Object expected = logEntry(name, args); Object actual = calledLog.get(calledLog.size() - 1); - if (expected.equals(actual)) return; + if (expected.equals(actual) && verbosity < 9) return; System.out.println("assertCalled "+name+":"); System.out.println("expected: "+expected); System.out.println("actual: "+actual); System.out.println("ex. types: "+getClasses(expected)); System.out.println("act. types: "+getClasses(actual)); - assertEquals("previous method call types", expected, actual); assertEquals("previous method call", expected, actual); } static void printCalled(MethodHandle target, String name, Object... args) { - if (verbosity >= 2) - System.out.println("calling "+logEntry(name, args)+" on "+target); + if (verbosity >= 3) + System.out.println("calling MH="+target+" to "+name+Arrays.toString(args)); } static Object castToWrapper(Object value, Class dst) { @@ -188,11 +223,40 @@ public class MethodHandlesTest { return null; } - static int nextArg; + static final int ONE_MILLION = (1000*1000), // first int value + TEN_BILLION = (10*1000*1000*1000), // scale factor to reach upper 32 bits + INITIAL_ARG_VAL = ONE_MILLION << 1; // <<1 makes space for sign bit; + static long nextArgVal; + static long nextArg(boolean moreBits) { + long val = nextArgVal++; + long sign = -(val & 1); // alternate signs + val >>= 1; + if (moreBits) + // Guarantee some bits in the high word. + // In any case keep the decimal representation simple-looking, + // with lots of zeroes, so as not to make the printed decimal + // strings unnecessarily noisy. + val += (val % ONE_MILLION) * TEN_BILLION; + return val ^ sign; + } + static int nextArg() { + // Produce a 32-bit result something like ONE_MILLION+(smallint). + // Example: 1_000_042. + return (int) nextArg(false); + } + static long nextArg(Class kind) { + if (kind == long.class || kind == Long.class || + kind == double.class || kind == Double.class) + // produce a 64-bit result something like + // ((TEN_BILLION+1) * (ONE_MILLION+(smallint))) + // Example: 10_000_420_001_000_042. + return nextArg(true); + return (long) nextArg(); + } + static Object randomArg(Class param) { - Object wrap = castToWrapperOrNull(nextArg, param); + Object wrap = castToWrapperOrNull(nextArg(param), param); if (wrap != null) { - nextArg++; return wrap; } // import sun.dyn.util.Wrapper; @@ -202,7 +266,7 @@ public class MethodHandlesTest { // if (wrap != Wrapper.OBJECT) // return wrap.wrap(nextArg++); if (param.isInterface() || param.isAssignableFrom(String.class)) - return "#"+(nextArg++); + return "#"+nextArg(); else try { return param.newInstance(); @@ -277,7 +341,7 @@ public class MethodHandlesTest { // Subject methods... static class Example implements IntExample { final String name; - public Example() { name = "Example#"+(nextArg++); } + public Example() { name = "Example#"+nextArg(); } protected Example(String name) { this.name = name; } protected Example(int x) { this(); called("protected ", this, x); } @Override public String toString() { return name; } @@ -301,43 +365,56 @@ public class MethodHandlesTest { public static Object s5(long x, int y) { return called("s5", x, y); } public static Object s6(int x, long y) { return called("s6", x, y); } public static Object s7(float x, double y) { return called("s7", x, y); } + + static final Lookup EXAMPLE = MethodHandles.lookup(); // for testing findSpecial } + static final Lookup EXAMPLE = Example.EXAMPLE; public static class PubExample extends Example { + public PubExample() { super("PubExample#"+nextArg()); } } static class SubExample extends Example { @Override public void v0() { called("Sub/v0", this); } @Override void pkg_v0() { called("Sub/pkg_v0", this); } private SubExample(int x) { called("", this, x); } - public SubExample() { super("SubExample#"+(nextArg++)); } + public SubExample() { super("SubExample#"+nextArg()); } } public static interface IntExample { public void v0(); static class Impl implements IntExample { public void v0() { called("Int/v0", this); } final String name; - public Impl() { name = "Example#"+(nextArg++); } + public Impl() { name = "Impl#"+nextArg(); } + @Override public String toString() { return name; } } } static final Object[][][] ACCESS_CASES = { - { { false, PUBLIC }, { false, PACKAGE }, { false, PRIVATE } }, - { { false, PUBLIC }, { false, PACKAGE }, { true, PRIVATE } }, - { { false, PUBLIC }, { true, PACKAGE }, { true, PRIVATE } }, - { { true, PUBLIC }, { true, PACKAGE }, { true, PRIVATE } }, + { { false, PUBLIC }, { false, PACKAGE }, { false, PRIVATE }, { false, EXAMPLE } }, //[0]: all false + { { false, PUBLIC }, { false, PACKAGE }, { true, PRIVATE }, { true, EXAMPLE } }, //[1]: only PRIVATE + { { false, PUBLIC }, { true, PACKAGE }, { true, PRIVATE }, { true, EXAMPLE } }, //[2]: PUBLIC false + { { true, PUBLIC }, { true, PACKAGE }, { true, PRIVATE }, { true, EXAMPLE } }, //[3]: all true }; - static Object[][] accessCases(Class defc, String name) { - if (name.contains("pri_")) { - return ACCESS_CASES[1]; // PRIVATE only - } else if (name.contains("pkg_")) { - return ACCESS_CASES[2]; // not PUBLIC + static Object[][] accessCases(Class defc, String name, boolean isSpecial) { + Object[][] cases; + if (name.contains("pri_") || isSpecial) { + cases = ACCESS_CASES[1]; // PRIVATE only + } else if (name.contains("pkg_") || !Modifier.isPublic(defc.getModifiers())) { + cases = ACCESS_CASES[2]; // not PUBLIC } else { assertTrue(name.indexOf('_') < 0); boolean pubc = Modifier.isPublic(defc.getModifiers()); if (pubc) - return ACCESS_CASES[3]; // all access levels - return ACCESS_CASES[2]; // PACKAGE but not PUBLIC + cases = ACCESS_CASES[3]; // all access levels + else + cases = ACCESS_CASES[2]; // PACKAGE but not PUBLIC } + if (defc != Example.class && cases[cases.length-1][1] == EXAMPLE) + cases = Arrays.copyOfRange(cases, 0, cases.length-1); + return cases; + } + static Object[][] accessCases(Class defc, String name) { + return accessCases(defc, name, false); } @Test @@ -374,12 +451,13 @@ public class MethodHandlesTest { MethodHandle target = null; RuntimeException noAccess = null; try { + if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); target = lookup.findStatic(defc, name, type); } catch (NoAccessException ex) { noAccess = ex; } - if (verbosity >= 2) - System.out.println("findStatic "+lookup+": "+defc+"."+name+"/"+type+" => "+target + if (verbosity >= 3) + System.out.println("findStatic "+lookup+": "+defc.getName()+"."+name+"/"+type+" => "+target +(noAccess == null ? "" : " !! "+noAccess)); if (positive && noAccess != null) throw noAccess; assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); @@ -391,7 +469,8 @@ public class MethodHandlesTest { printCalled(target, name, args); target.invokeVarargs(args); assertCalled(name, args); - System.out.print(':'); + if (verbosity >= 1) + System.out.print(':'); } @Test @@ -436,21 +515,20 @@ public class MethodHandlesTest { MethodHandle target = null; RuntimeException noAccess = null; try { + if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); target = lookup.findVirtual(defc, methodName, type); } catch (NoAccessException ex) { noAccess = ex; } - if (verbosity >= 2) - System.out.println("findVirtual "+lookup+": "+defc+"."+name+"/"+type+" => "+target + if (verbosity >= 3) + System.out.println("findVirtual "+lookup+": "+defc.getName()+"."+name+"/"+type+" => "+target +(noAccess == null ? "" : " !! "+noAccess)); if (positive && noAccess != null) throw noAccess; assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); if (!positive) return; // negative test failed as expected Class[] paramsWithSelf = cat(array(Class[].class, (Class)defc), params); MethodType typeWithSelf = MethodType.methodType(ret, paramsWithSelf); - MethodType ttype = target.type(); - ttype = ttype.changeParameterType(0, defc); // FIXME: test this - assertEquals(typeWithSelf, ttype); + assertEquals(typeWithSelf, target.type()); assertTrue(target.toString().contains(methodName)); // rough check if (!DO_MORE_CALLS && lookup != PRIVATE) return; Object[] argsWithSelf = randomArgs(paramsWithSelf); @@ -458,52 +536,61 @@ public class MethodHandlesTest { printCalled(target, name, argsWithSelf); target.invokeVarargs(argsWithSelf); assertCalled(name, argsWithSelf); - System.out.print(':'); + if (verbosity >= 1) + System.out.print(':'); } @Test public void testFindSpecial() throws Throwable { if (CAN_SKIP_WORKING) return; startTest("findSpecial"); - testFindSpecial(Example.class, void.class, "v0"); - testFindSpecial(Example.class, void.class, "pkg_v0"); - testFindSpecial(false, PRIVATE, Example.class, void.class, "", int.class); - testFindSpecial(false, PRIVATE, Example.class, void.class, "bogus"); - } - - void testFindSpecial(Class defc, Class ret, String name, Class... params) throws Throwable { - testFindSpecial(true, PRIVATE, defc, ret, name, params); - testFindSpecial(false, PACKAGE, defc, ret, name, params); - testFindSpecial(false, PUBLIC, defc, ret, name, params); - } - void testFindSpecial(boolean positive, Lookup lookup, Class defc, Class ret, String name, Class... params) throws Throwable { + testFindSpecial(SubExample.class, Example.class, void.class, "v0"); + testFindSpecial(SubExample.class, Example.class, void.class, "pkg_v0"); + // Do some negative testing: + for (Lookup lookup : new Lookup[]{ PRIVATE, EXAMPLE, PACKAGE, PUBLIC }) { + testFindSpecial(false, lookup, Object.class, Example.class, void.class, "v0"); + testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "", int.class); + testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "s0"); + testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "bogus"); + } + } + + void testFindSpecial(Class specialCaller, + Class defc, Class ret, String name, Class... params) throws Throwable { + testFindSpecial(true, EXAMPLE, specialCaller, defc, ret, name, params); + testFindSpecial(true, PRIVATE, specialCaller, defc, ret, name, params); + testFindSpecial(false, PACKAGE, specialCaller, defc, ret, name, params); + testFindSpecial(false, PUBLIC, specialCaller, defc, ret, name, params); + } + void testFindSpecial(boolean positive, Lookup lookup, Class specialCaller, + Class defc, Class ret, String name, Class... params) throws Throwable { countTest(positive); MethodType type = MethodType.methodType(ret, params); MethodHandle target = null; RuntimeException noAccess = null; try { - target = lookup.findSpecial(defc, name, type, defc); + if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); + target = lookup.findSpecial(defc, name, type, specialCaller); } catch (NoAccessException ex) { noAccess = ex; } - if (verbosity >= 2) - System.out.println("findSpecial "+defc+"."+name+"/"+type+" => "+target - +(noAccess == null ? "" : " !! "+noAccess)); + if (verbosity >= 3) + System.out.println("findSpecial from "+specialCaller.getName()+" to "+defc.getName()+"."+name+"/"+type+" => "+target + +(target == null ? "" : target.type()) + +(noAccess == null ? "" : " !! "+noAccess)); if (positive && noAccess != null) throw noAccess; assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); if (!positive) return; // negative test failed as expected - Class[] paramsWithSelf = cat(array(Class[].class, (Class)defc), params); + assertEquals(specialCaller, target.type().parameterType(0)); + assertEquals(type, target.type().dropParameterTypes(0,1)); + Class[] paramsWithSelf = cat(array(Class[].class, (Class)specialCaller), params); MethodType typeWithSelf = MethodType.methodType(ret, paramsWithSelf); - MethodType ttype = target.type(); - ttype = ttype.changeParameterType(0, defc); // FIXME: test this - assertEquals(typeWithSelf, ttype); assertTrue(target.toString().contains(name)); // rough check - if (!DO_MORE_CALLS && lookup != PRIVATE) return; + if (!DO_MORE_CALLS && lookup != PRIVATE && lookup != EXAMPLE) return; Object[] args = randomArgs(paramsWithSelf); printCalled(target, name, args); target.invokeVarargs(args); assertCalled(name, args); - System.out.print(':'); } @Test @@ -538,11 +625,12 @@ public class MethodHandlesTest { MethodHandle target = null; RuntimeException noAccess = null; try { + if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); target = lookup.bind(receiver, methodName, type); } catch (NoAccessException ex) { noAccess = ex; } - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("bind "+receiver+"."+name+"/"+type+" => "+target +(noAccess == null ? "" : " !! "+noAccess)); if (positive && noAccess != null) throw noAccess; @@ -554,7 +642,8 @@ public class MethodHandlesTest { target.invokeVarargs(args); Object[] argsWithReceiver = cat(array(Object[].class, receiver), args); assertCalled(name, argsWithReceiver); - System.out.print(':'); + if (verbosity >= 1) + System.out.print(':'); } @Test @@ -567,10 +656,10 @@ public class MethodHandlesTest { testUnreflect(Example.class, true, Object.class, "s1", Object.class); testUnreflect(Example.class, true, Object.class, "s2", int.class); - //testUnreflect(Example.class, true, Object.class, "s3", long.class); - //testUnreflect(Example.class, true, Object.class, "s4", int.class, int.class); - //testUnreflect(Example.class, true, Object.class, "s5", long.class, int.class); - //testUnreflect(Example.class, true, Object.class, "s6", int.class, long.class); + testUnreflect(Example.class, true, Object.class, "s3", long.class); + testUnreflect(Example.class, true, Object.class, "s4", int.class, int.class); + testUnreflect(Example.class, true, Object.class, "s5", long.class, int.class); + testUnreflect(Example.class, true, Object.class, "s6", int.class, long.class); testUnreflect(Example.class, false, void.class, "v0"); testUnreflect(Example.class, false, void.class, "pkg_v0"); @@ -584,10 +673,17 @@ public class MethodHandlesTest { void testUnreflect(Class defc, boolean isStatic, Class ret, String name, Class... params) throws Throwable { for (Object[] ac : accessCases(defc, name)) { - testUnreflect((Boolean)ac[0], (Lookup)ac[1], defc, isStatic, ret, name, params); + testUnreflectMaybeSpecial(null, (Boolean)ac[0], (Lookup)ac[1], defc, (isStatic ? null : defc), ret, name, params); + } + } + void testUnreflect(Class defc, Class rcvc, Class ret, String name, Class... params) throws Throwable { + for (Object[] ac : accessCases(defc, name)) { + testUnreflectMaybeSpecial(null, (Boolean)ac[0], (Lookup)ac[1], defc, rcvc, ret, name, params); } } - void testUnreflect(boolean positive, Lookup lookup, Class defc, boolean isStatic, Class ret, String name, Class... params) throws Throwable { + void testUnreflectMaybeSpecial(Class specialCaller, + boolean positive, Lookup lookup, + Class defc, Class rcvc, Class ret, String name, Class... params) throws Throwable { countTest(positive); MethodType type = MethodType.methodType(ret, params); Method rmethod = null; @@ -598,43 +694,67 @@ public class MethodHandlesTest { } catch (NoSuchMethodException ex) { throw new NoAccessException(ex); } - assertEquals(isStatic, Modifier.isStatic(rmethod.getModifiers())); + boolean isStatic = (rcvc == null); + boolean isSpecial = (specialCaller != null); try { - target = lookup.unreflect(rmethod); + if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); + if (isSpecial) + target = lookup.unreflectSpecial(rmethod, specialCaller); + else + target = lookup.unreflect(rmethod); } catch (NoAccessException ex) { noAccess = ex; } - if (verbosity >= 2) - System.out.println("unreflect "+defc+"."+name+"/"+type+" => "+target - +(noAccess == null ? "" : " !! "+noAccess)); + if (verbosity >= 3) + System.out.println("unreflect"+(isSpecial?"Special":"")+" "+defc.getName()+"."+name+"/"+type + +(!isSpecial ? "" : " specialCaller="+specialCaller) + +( isStatic ? "" : " receiver="+rcvc) + +" => "+target + +(noAccess == null ? "" : " !! "+noAccess)); if (positive && noAccess != null) throw noAccess; assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); if (!positive) return; // negative test failed as expected + assertEquals(isStatic, Modifier.isStatic(rmethod.getModifiers())); Class[] paramsMaybeWithSelf = params; if (!isStatic) { - paramsMaybeWithSelf = cat(array(Class[].class, (Class)defc), params); + paramsMaybeWithSelf = cat(array(Class[].class, (Class)rcvc), params); } MethodType typeMaybeWithSelf = MethodType.methodType(ret, paramsMaybeWithSelf); - MethodType ttype = target.type(); - if (!isStatic) - ttype = ttype.changeParameterType(0, defc); // FIXME: test this - assertEquals(typeMaybeWithSelf, ttype); + if (isStatic) { + assertEquals(typeMaybeWithSelf, target.type()); + } else { + if (isSpecial) + assertEquals(specialCaller, target.type().parameterType(0)); + else + assertEquals(defc, target.type().parameterType(0)); + assertEquals(typeMaybeWithSelf, target.type().changeParameterType(0, rcvc)); + } Object[] argsMaybeWithSelf = randomArgs(paramsMaybeWithSelf); printCalled(target, name, argsMaybeWithSelf); target.invokeVarargs(argsMaybeWithSelf); assertCalled(name, argsMaybeWithSelf); - System.out.print(':'); + if (verbosity >= 1) + System.out.print(':'); + } + + void testUnreflectSpecial(Class defc, Class rcvc, Class ret, String name, Class... params) throws Throwable { + for (Object[] ac : accessCases(defc, name, true)) { + Class specialCaller = rcvc; + testUnreflectMaybeSpecial(specialCaller, (Boolean)ac[0], (Lookup)ac[1], defc, rcvc, ret, name, params); + } } - @Test @Ignore("unimplemented") + @Test public void testUnreflectSpecial() throws Throwable { - Lookup lookup = PRIVATE; // FIXME: test more lookups than this one + if (CAN_SKIP_WORKING) return; startTest("unreflectSpecial"); - Method m = null; - MethodHandle expResult = null; - MethodHandle result = lookup.unreflectSpecial(m, Example.class); - assertEquals(expResult, result); - fail("The test case is a prototype."); + testUnreflectSpecial(Example.class, Example.class, void.class, "v0"); + testUnreflectSpecial(Example.class, SubExample.class, void.class, "v0"); + testUnreflectSpecial(Example.class, Example.class, void.class, "pkg_v0"); + testUnreflectSpecial(Example.class, SubExample.class, void.class, "pkg_v0"); + testUnreflectSpecial(Example.class, Example.class, Object.class, "v2", int.class, int.class); + testUnreflectSpecial(Example.class, SubExample.class, Object.class, "v2", int.class, int.class); + testUnreflectMaybeSpecial(Example.class, false, PRIVATE, Example.class, Example.class, void.class, "s0"); } public static class HasFields { @@ -704,28 +824,52 @@ public class MethodHandlesTest { } } + static final int TEST_UNREFLECT = 1, TEST_FIND_FIELD = 2, TEST_FIND_STATIC_FIELD = 3; + static boolean testModeMatches(int testMode, boolean isStatic) { + switch (testMode) { + case TEST_FIND_STATIC_FIELD: return isStatic; + case TEST_FIND_FIELD: return !isStatic; + default: return true; // unreflect matches both + } + } + @Test public void testUnreflectGetter() throws Throwable { - Lookup lookup = PRIVATE; // FIXME: test more lookups than this one startTest("unreflectGetter"); + testGetter(TEST_UNREFLECT); + } + @Test + public void testFindGetter() throws Throwable { + startTest("findGetter"); + testGetter(TEST_FIND_FIELD); + } + @Test + public void testFindStaticGetter() throws Throwable { + startTest("findStaticGetter"); + testGetter(TEST_FIND_STATIC_FIELD); + } + public void testGetter(int testMode) throws Throwable { + Lookup lookup = PRIVATE; // FIXME: test more lookups than this one for (Object[] c : HasFields.CASES) { Field f = (Field)c[0]; Object value = c[1]; Class type = f.getType(); - if (type.isPrimitive() && type != int.class) - continue; //FIXME - testUnreflectGetter(lookup, f, type, value); + testGetter(lookup, f, type, value, testMode); } } - public void testUnreflectGetter(MethodHandles.Lookup lookup, - Field f, Class type, Object value) throws Throwable { - countTest(true); + public void testGetter(MethodHandles.Lookup lookup, + Field f, Class type, Object value, int testMode) throws Throwable { boolean isStatic = Modifier.isStatic(f.getModifiers()); + Class fclass = f.getDeclaringClass(); + String fname = f.getName(); + Class ftype = f.getType(); + if (!testModeMatches(testMode, isStatic)) return; + countTest(true); MethodType expType = MethodType.methodType(type, HasFields.class); if (isStatic) expType = expType.dropParameterTypes(0, 1); MethodHandle mh = lookup.unreflectGetter(f); assertSame(mh.type(), expType); - assertEquals(mh.toString(), f.getName()); + assertEquals(mh.toString(), fname); HasFields fields = new HasFields(); Object sawValue; Class rtype = type; @@ -735,14 +879,14 @@ public class MethodHandlesTest { for (int i = 0; i <= 1; i++) { if (isStatic) { if (type == int.class) - sawValue = mh.invoke(); // do these exactly + sawValue = mh.invokeExact(); // do these exactly else - sawValue = mh.invoke(); + sawValue = mh.invokeExact(); } else { if (type == int.class) - sawValue = mh.invoke((Object) fields); + sawValue = mh.invokeExact((Object) fields); else - sawValue = mh.invoke((Object) fields); + sawValue = mh.invokeExact((Object) fields); } assertEquals(sawValue, expValue); Object random = randomArg(type); @@ -755,26 +899,49 @@ public class MethodHandlesTest { @Test public void testUnreflectSetter() throws Throwable { + startTest("unreflectSetter"); + testSetter(TEST_UNREFLECT); + } + @Test + public void testFindSetter() throws Throwable { + startTest("findSetter"); + testSetter(TEST_FIND_FIELD); + } + @Test + public void testFindStaticSetter() throws Throwable { + startTest("findStaticSetter"); + testSetter(TEST_FIND_STATIC_FIELD); + } + public void testSetter(int testMode) throws Throwable { Lookup lookup = PRIVATE; // FIXME: test more lookups than this one startTest("unreflectSetter"); for (Object[] c : HasFields.CASES) { Field f = (Field)c[0]; Object value = c[1]; Class type = f.getType(); - if (type.isPrimitive() && type != int.class) - continue; //FIXME - testUnreflectSetter(lookup, f, type, value); + testSetter(lookup, f, type, value, testMode); } } - public void testUnreflectSetter(MethodHandles.Lookup lookup, - Field f, Class type, Object value) throws Throwable { - countTest(true); + public void testSetter(MethodHandles.Lookup lookup, + Field f, Class type, Object value, int testMode) throws Throwable { boolean isStatic = Modifier.isStatic(f.getModifiers()); + Class fclass = f.getDeclaringClass(); + String fname = f.getName(); + Class ftype = f.getType(); + if (!testModeMatches(testMode, isStatic)) return; + countTest(true); MethodType expType = MethodType.methodType(void.class, HasFields.class, type); if (isStatic) expType = expType.dropParameterTypes(0, 1); - MethodHandle mh = lookup.unreflectSetter(f); + MethodHandle mh; + if (testMode == TEST_UNREFLECT) + mh = lookup.unreflectSetter(f); + else if (testMode == TEST_FIND_FIELD) + mh = lookup.findSetter(fclass, fname, ftype); + else if (testMode == TEST_FIND_STATIC_FIELD) + mh = lookup.findStaticSetter(fclass, fname, ftype); + else throw new InternalError(); assertSame(mh.type(), expType); - assertEquals(mh.toString(), f.getName()); + assertEquals(mh.toString(), fname); HasFields fields = new HasFields(); Object sawValue; Class vtype = type; @@ -786,14 +953,14 @@ public class MethodHandlesTest { Object putValue = randomArg(type); if (isStatic) { if (type == int.class) - mh.invoke((int)(Integer)putValue); // do these exactly + mh.invokeExact((int)(Integer)putValue); // do these exactly else - mh.invoke(putValue); + mh.invokeExact(putValue); } else { if (type == int.class) - mh.invoke((Object) fields, (int)(Integer)putValue); + mh.invokeExact((Object) fields, (int)(Integer)putValue); else - mh.invoke((Object) fields, putValue); + mh.invokeExact((Object) fields, putValue); } assertEquals(f.get(fields), putValue); } @@ -803,25 +970,31 @@ public class MethodHandlesTest { @Test public void testArrayElementGetter() throws Throwable { startTest("arrayElementGetter"); - testArrayElementGetterSetter(new Object[10], false); - testArrayElementGetterSetter(new String[10], false); - testArrayElementGetterSetter(new int[10], false); - // FIXME: Do the other primitive types. - //testArrayElementGetterSetter(new float[10], false); + testArrayElementGetterSetter(false); } @Test public void testArrayElementSetter() throws Throwable { startTest("arrayElementSetter"); - testArrayElementGetterSetter(new Object[10], true); - testArrayElementGetterSetter(new String[10], true); - testArrayElementGetterSetter(new int[10], true); - // FIXME: Do the other primitive types. - //testArrayElementGetterSetter(new float[10], true); + testArrayElementGetterSetter(true); + } + + public void testArrayElementGetterSetter(boolean testSetter) throws Throwable { + testArrayElementGetterSetter(new Object[10], testSetter); + testArrayElementGetterSetter(new String[10], testSetter); + testArrayElementGetterSetter(new boolean[10], testSetter); + testArrayElementGetterSetter(new byte[10], testSetter); + testArrayElementGetterSetter(new char[10], testSetter); + testArrayElementGetterSetter(new short[10], testSetter); + testArrayElementGetterSetter(new int[10], testSetter); + testArrayElementGetterSetter(new float[10], testSetter); + testArrayElementGetterSetter(new long[10], testSetter); + testArrayElementGetterSetter(new double[10], testSetter); } public void testArrayElementGetterSetter(Object array, boolean testSetter) throws Throwable { countTest(true); + if (verbosity >= 2) System.out.println("array type = "+array.getClass().getComponentType().getName()+"["+Array.getLength(array)+"]"); Class arrayType = array.getClass(); Class elemType = arrayType.getComponentType(); MethodType expType = !testSetter @@ -831,7 +1004,19 @@ public class MethodHandlesTest { ? MethodHandles.arrayElementGetter(arrayType) : MethodHandles.arrayElementSetter(arrayType); assertSame(mh.type(), expType); - //assertEquals(mh.toString(), f.getName()); + if (elemType != int.class && elemType != boolean.class) { + MethodType gtype; + if (true) { // FIXME: remove this path (and remove below in the mh.invokes) + gtype = mh.type().changeParameterType(0, Object.class); + if (testSetter) + gtype = gtype.changeParameterType(2, Object.class); + else + gtype = gtype.changeReturnType(Object.class); + } else + // FIXME: This simpler path hits a bug in convertArguments => ToGeneric + gtype = mh.type().generic().changeParameterType(1, int.class); + mh = MethodHandles.convertArguments(mh, gtype); + } Object sawValue, expValue; List model = array2list(array); int length = Array.getLength(array); @@ -841,22 +1026,31 @@ public class MethodHandlesTest { model.set(i, random); if (testSetter) { if (elemType == int.class) - mh.invoke((int[]) array, i, (int)(Integer)random); + mh.invokeExact((int[]) array, i, (int)(Integer)random); + else if (elemType == boolean.class) + mh.invokeExact((boolean[]) array, i, (boolean)(Boolean)random); else - mh.invokeGeneric(array, i, random); + mh.invokeExact(array, i, random); assertEquals(model, array2list(array)); } else { Array.set(array, i, random); - + } + if (verbosity >= 5) { + List array2list = array2list(array); + System.out.println("a["+i+"]="+random+" => "+array2list); + if (!array2list.equals(model)) + System.out.println("*** != "+model); } // observe array element sawValue = Array.get(array, i); if (!testSetter) { expValue = sawValue; if (elemType == int.class) - sawValue = mh.invoke((int[]) array, i); + sawValue = mh.invokeExact((int[]) array, i); + else if (elemType == boolean.class) + sawValue = mh.invokeExact((boolean[]) array, i); else - sawValue = mh.invokeGeneric(array, i); + sawValue = mh.invokeExact(array, i); assertEquals(sawValue, expValue); assertEquals(model, array2list(array)); } @@ -906,6 +1100,8 @@ public class MethodHandlesTest { testConvert(Callee.ofType(1), null, "id", String.class); testConvert(Callee.ofType(1), null, "id", Integer.class); testConvert(Callee.ofType(1), null, "id", short.class); + testConvert(Callee.ofType(1), null, "id", char.class); + testConvert(Callee.ofType(1), null, "id", byte.class); } void testConvert(MethodHandle id, Class rtype, String name, Class... params) throws Throwable { @@ -943,7 +1139,7 @@ public class MethodHandlesTest { } catch (RuntimeException ex) { error = ex; } - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("convert "+id+ " to "+newType+" => "+target +(error == null ? "" : " !! "+error)); if (positive && error != null) throw error; @@ -954,7 +1150,8 @@ public class MethodHandlesTest { Object result = target.invokeVarargs(args); assertCalled(name, convArgs); assertEquals(convResult, result); - System.out.print(':'); + if (verbosity >= 1) + System.out.print(':'); } @Test @@ -966,7 +1163,7 @@ public class MethodHandlesTest { //testPermuteArguments(4, Integer.class, 1, int.class, 6); } public void testPermuteArguments(int max, Class type1, int t2c, Class type2, int dilution) throws Throwable { - if (verbosity >= 1) + if (verbosity >= 2) System.out.println("permuteArguments "+max+"*"+type1.getName() +(t2c==0?"":"/"+t2c+"*"+type2.getName()) +(dilution > 0 ? " with dilution "+dilution : "")); @@ -1054,7 +1251,7 @@ public class MethodHandlesTest { } int inargs = args.length, outargs = reorder.length; assert(inargs == types.length); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("permuteArguments "+Arrays.toString(reorder)); Object[] permArgs = new Object[outargs]; Class[] permTypes = new Class[outargs]; @@ -1062,7 +1259,7 @@ public class MethodHandlesTest { permArgs[i] = args[reorder[i]]; permTypes[i] = types[reorder[i]]; } - if (verbosity >= 3) { + if (verbosity >= 4) { System.out.println("in args: "+Arrays.asList(args)); System.out.println("out args: "+Arrays.asList(permArgs)); System.out.println("in types: "+Arrays.asList(types)); @@ -1083,13 +1280,14 @@ public class MethodHandlesTest { if (CAN_SKIP_WORKING) return; startTest("spreadArguments"); for (Class argType : new Class[]{Object.class, Integer.class, int.class}) { - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("spreadArguments "+argType); + // FIXME: enable _adapter_spread_args and fix Fail_2 for (int nargs = 0; nargs < 10; nargs++) { if (argType == int.class && nargs >= 6) continue; // FIXME Fail_1 for (int pos = 0; pos < nargs; pos++) { if (argType == int.class && pos > 0) continue; // FIXME Fail_3 - testSpreadArguments(argType, pos, nargs); + testSpreadArguments(argType, pos, nargs); } } } @@ -1098,7 +1296,7 @@ public class MethodHandlesTest { countTest(); MethodHandle target = ValueConversions.varargsArray(nargs); MethodHandle target2 = changeArgTypes(target, argType); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("spread into "+target2+" ["+pos+".."+nargs+"]"); Object[] args = randomArgs(target2.type().parameterArray()); // make sure the target does what we think it does: @@ -1107,15 +1305,15 @@ public class MethodHandlesTest { assertArrayEquals(args, check); switch (nargs) { case 0: - check = target.invoke(); + check = target.invokeExact(); assertArrayEquals(args, check); break; case 1: - check = target.invoke(args[0]); + check = target.invokeExact(args[0]); assertArrayEquals(args, check); break; case 2: - check = target.invoke(args[0], args[1]); + check = target.invokeExact(args[0], args[1]); assertArrayEquals(args, check); break; } @@ -1129,7 +1327,7 @@ public class MethodHandlesTest { MethodHandle result = MethodHandles.spreadArguments(target2, newType); Object[] returnValue; if (pos == 0) { - returnValue = (Object[]) result.invoke(args); + returnValue = (Object[]) result.invokeExact(args); } else { Object[] args1 = Arrays.copyOfRange(args, 0, pos+1); args1[pos] = Arrays.copyOfRange(args, pos, args.length); @@ -1143,7 +1341,7 @@ public class MethodHandlesTest { if (CAN_SKIP_WORKING) return; startTest("collectArguments"); for (Class argType : new Class[]{Object.class, Integer.class, int.class}) { - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("collectArguments "+argType); for (int nargs = 0; nargs < 10; nargs++) { for (int pos = 0; pos < nargs; pos++) { @@ -1167,7 +1365,7 @@ public class MethodHandlesTest { MethodHandle target = ValueConversions.varargsArray(pos+1); target = changeArgTypes(target, 0, pos, argType); target = changeArgTypes(target, pos, pos+1, Object[].class); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("collect from "+Arrays.asList(args)+" ["+pos+".."+nargs+"]"); MethodHandle result = MethodHandles.collectArguments(target, newType); Object[] returnValue = (Object[]) result.invokeVarargs(args); @@ -1198,14 +1396,14 @@ public class MethodHandlesTest { List resList = Arrays.asList(args); List argsToPass = new ArrayList(resList); List argsToInsert = argsToPass.subList(pos, pos + ins); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("insert: "+argsToInsert+" into "+target); MethodHandle target2 = MethodHandles.insertArguments(target, pos, (Object[]) argsToInsert.toArray()); argsToInsert.clear(); // remove from argsToInsert Object res2 = target2.invokeVarargs(argsToPass); Object res2List = Arrays.asList((Object[])res2); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("result: "+res2List); //if (!resList.equals(res2List)) // System.out.println("*** fail at n/p/i = "+nargs+"/"+pos+"/"+ins+": "+resList+" => "+res2List); @@ -1229,17 +1427,17 @@ public class MethodHandlesTest { MethodHandle filter = ValueConversions.varargsList(1); filter = MethodHandles.convertArguments(filter, filter.type().generic()); Object[] argsToPass = randomArgs(nargs, Object.class); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("filter "+target+" at "+pos+" with "+filter); MethodHandle[] filters = new MethodHandle[pos*2+1]; filters[pos] = filter; MethodHandle target2 = MethodHandles.filterArguments(target, filters); // Simulate expected effect of filter on arglist: Object[] filteredArgs = argsToPass.clone(); - filteredArgs[pos] = filter.invoke(filteredArgs[pos]); + filteredArgs[pos] = filter.invokeExact(filteredArgs[pos]); List expected = Arrays.asList(filteredArgs); Object result = target2.invokeVarargs(argsToPass); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("result: "+result); if (!expected.equals(result)) System.out.println("*** fail at n/p = "+nargs+"/"+pos+": "+argsToPass+" => "+result); @@ -1265,18 +1463,18 @@ public class MethodHandlesTest { MethodHandle target = ValueConversions.varargsList(1 + nargs); MethodHandle combine = ValueConversions.varargsList(fold); List argsToPass = Arrays.asList(randomArgs(nargs, Object.class)); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("fold "+target+" with "+combine); MethodHandle target2 = MethodHandles.foldArguments(target, combine); // Simulate expected effect of combiner on arglist: List expected = new ArrayList(argsToPass); List argsToFold = expected.subList(pos, pos + fold); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("fold: "+argsToFold+" into "+target2); Object foldedArgs = combine.invokeVarargs(argsToFold); argsToFold.add(0, foldedArgs); Object result = target2.invokeVarargs(argsToPass); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("result: "+result); if (!expected.equals(result)) System.out.println("*** fail at n/p/f = "+nargs+"/"+pos+"/"+fold+": "+argsToPass+" => "+result); @@ -1343,7 +1541,7 @@ public class MethodHandlesTest { } public void testInvokers(MethodType type) throws Throwable { - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("test invokers for "+type); int nargs = type.parameterCount(); boolean testRetCode = type.returnType() != void.class; @@ -1373,16 +1571,16 @@ public class MethodHandlesTest { calledLog.clear(); switch (nargs) { case 0: - result = inv.invoke(target); + result = inv.invokeExact(target); break; case 1: - result = inv.invoke(target, args[0]); + result = inv.invokeExact(target, args[0]); break; case 2: - result = inv.invoke(target, args[0], args[1]); + result = inv.invokeExact(target, args[0], args[1]); break; case 3: - result = inv.invoke(target, args[0], args[1], args[2]); + result = inv.invokeExact(target, args[0], args[1], args[2]); break; } if (testRetCode) assertEquals(code, result); @@ -1395,14 +1593,14 @@ public class MethodHandlesTest { // varargs invoker #0 calledLog.clear(); inv = MethodHandles.varargsInvoker(type, 0); - result = inv.invoke(target, args); + result = inv.invokeExact(target, args); if (testRetCode) assertEquals(code, result); assertCalled("invokee", args); if (nargs >= 1) { // varargs invoker #1 calledLog.clear(); inv = MethodHandles.varargsInvoker(type, 1); - result = inv.invoke(target, args[0], Arrays.copyOfRange(args, 1, nargs)); + result = inv.invokeExact(target, args[0], Arrays.copyOfRange(args, 1, nargs)); if (testRetCode) assertEquals(code, result); assertCalled("invokee", args); } @@ -1410,7 +1608,7 @@ public class MethodHandlesTest { // varargs invoker #2 calledLog.clear(); inv = MethodHandles.varargsInvoker(type, 2); - result = inv.invoke(target, args[0], args[1], Arrays.copyOfRange(args, 2, nargs)); + result = inv.invokeExact(target, args[0], args[1], Arrays.copyOfRange(args, 2, nargs)); if (testRetCode) assertEquals(code, result); assertCalled("invokee", args); } @@ -1418,7 +1616,7 @@ public class MethodHandlesTest { // varargs invoker #3 calledLog.clear(); inv = MethodHandles.varargsInvoker(type, 3); - result = inv.invoke(target, args[0], args[1], args[2], Arrays.copyOfRange(args, 3, nargs)); + result = inv.invokeExact(target, args[0], args[1], args[2], Arrays.copyOfRange(args, 3, nargs)); if (testRetCode) assertEquals(code, result); assertCalled("invokee", args); } @@ -1523,7 +1721,7 @@ public class MethodHandlesTest { default: equals = argList[0].equals(argList[1]); break; } String willCall = (equals ? "targetIfEquals" : "fallbackIfNotEquals"); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println(logEntry(willCall, argList)); Object result = mh.invokeVarargs(argList); assertCalled(willCall, argList); @@ -1552,7 +1750,7 @@ public class MethodHandlesTest { void testCatchException(Class returnType, Throwable thrown, boolean throwIt, int nargs) throws Throwable { countTest(); - if (verbosity >= 2) + if (verbosity >= 3) System.out.println("catchException rt="+returnType+" throw="+throwIt+" nargs="+nargs); Class exType = thrown.getClass(); MethodHandle throwOrReturn @@ -1594,9 +1792,10 @@ public class MethodHandlesTest { //System.out.println("throwing with "+target+" : "+thrown); MethodType expectedType = MethodType.methodType(returnType, exType); assertEquals(expectedType, target.type()); + target = MethodHandles.convertArguments(target, target.type().generic()); Throwable caught = null; try { - Object res = target.invokeGeneric(thrown); + Object res = target.invokeExact((Object) thrown); fail("got "+res+" instead of throwing "+thrown); } catch (Throwable ex) { if (ex != thrown) { @@ -1647,7 +1846,7 @@ public class MethodHandlesTest { void testCastFailure(String mode, int okCount) throws Throwable { countTest(false); - if (verbosity > 1) System.out.println("mode="+mode); + if (verbosity > 2) System.out.println("mode="+mode); Surprise boo = new Surprise(); MethodHandle identity = Surprise.REF_IDENTITY, surprise = boo; if (mode.endsWith("/return")) { @@ -1680,22 +1879,22 @@ public class MethodHandlesTest { surprise = MethodHandles.convertArguments(surprise, MethodType.genericMethodType(1)); Object x = 42; for (int i = 0; i < okCount; i++) { - Object y = identity.invoke(x); + Object y = identity.invokeExact(x); assertEquals(x, y); - Object z = surprise.invoke(x); + Object z = surprise.invokeExact(x); assertEquals(x, z); } boo.boo("Boo!"); - Object y = identity.invoke(x); + Object y = identity.invokeExact(x); assertEquals(x, y); try { - Object z = surprise.invoke(x); + Object z = surprise.invokeExact(x); System.out.println("Failed to throw; got z="+z); assertTrue(false); } catch (Exception ex) { - if (verbosity > 1) - System.out.println("caught "+ex); if (verbosity > 2) + System.out.println("caught "+ex); + if (verbosity > 3) ex.printStackTrace(); assertTrue(ex instanceof ClassCastException // FIXME: accept only one of the two for any given unit test @@ -1704,6 +1903,39 @@ public class MethodHandlesTest { } } + static Example userMethod(Object o, String s, int i) { + called("userMethod", o, s, i); + return null; + } + + @Test + public void testUserClassInSignature() throws Throwable { + if (CAN_SKIP_WORKING) return; + startTest("testUserClassInSignature"); + Lookup lookup = MethodHandles.lookup(); + String name; MethodType mt; MethodHandle mh; + Object[] args; + + // Try a static method. + name = "userMethod"; + mt = MethodType.methodType(Example.class, Object.class, String.class, int.class); + mh = lookup.findStatic(lookup.lookupClass(), name, mt); + assertEquals(mt, mh.type()); + assertEquals(Example.class, mh.type().returnType()); + args = randomArgs(mh.type().parameterArray()); + mh.invokeVarargs(args); + assertCalled(name, args); + + // Try a virtual method. + name = "v2"; + mt = MethodType.methodType(Object.class, Object.class, int.class); + mh = lookup.findVirtual(Example.class, name, mt); + assertEquals(mt, mh.type().dropParameterTypes(0,1)); + assertTrue(mh.type().parameterList().contains(Example.class)); + args = randomArgs(mh.type().parameterArray()); + mh.invokeVarargs(args); + assertCalled(name, args); + } } // Local abbreviated copy of sun.dyn.util.ValueConversions class ValueConversions { @@ -1766,7 +1998,7 @@ class ValueConversions { if (nargs < ARRAYS.length) return ARRAYS[nargs]; // else need to spin bytecode or do something else fancy - throw new UnsupportedOperationException("NYI"); + throw new UnsupportedOperationException("NYI: cannot form a varargs array of length "+nargs); } private static final List NO_ARGS_LIST = Arrays.asList(NO_ARGS_ARRAY); diff --git a/test/java/io/BufferedReader/BigMark.java b/test/java/io/BufferedReader/BigMark.java index 67b5dd3e09ef943d8ce5ae866cdd3b482b273896..fe336a41a9a75ba26b0ed9d4546e70304cdbd1be 100644 --- a/test/java/io/BufferedReader/BigMark.java +++ b/test/java/io/BufferedReader/BigMark.java @@ -25,6 +25,8 @@ @summary BufferedReader should throw an OutOfMemoryError when the read-ahead limit is very large @bug 6350733 + @build BigMark + @run main/othervm BigMark */ import java.io.*; diff --git a/test/java/io/BufferedReader/ReadLineSync.java b/test/java/io/BufferedReader/ReadLineSync.java index 1b2dd495bade4b9963d62a9195ebd8bddfbf1aba..2af83e47d6fec7e062dd3b12d608bc11f7f18cd0 100644 --- a/test/java/io/BufferedReader/ReadLineSync.java +++ b/test/java/io/BufferedReader/ReadLineSync.java @@ -46,16 +46,20 @@ public class ReadLineSync { BufferedReader reader = new BufferedReader( new FileReader(f)); - int threadCount = 2; + try { + int threadCount = 2; - ExecutorService es = Executors.newFixedThreadPool(threadCount); + ExecutorService es = Executors.newFixedThreadPool(threadCount); - for (int i=0; i < threadCount; i++) - es.execute(new BufferedReaderConsumer(reader)); + for (int i=0; i < threadCount; i++) + es.execute(new BufferedReaderConsumer(reader)); - // Wait for the tasks to complete - es.shutdown(); - while (!es.awaitTermination(60, TimeUnit.SECONDS)); + // Wait for the tasks to complete + es.shutdown(); + while (!es.awaitTermination(60, TimeUnit.SECONDS)); + } finally { + reader.close(); + } } static class BufferedReaderConsumer extends Thread { diff --git a/test/java/io/DataInputStream/OpsAfterClose.java b/test/java/io/DataInputStream/OpsAfterClose.java index a0f0fdfc349e2f1057d91241fd349ebe6487d762..a54926b2ed17eb0548f1e4f181267a6b094b5b01 100644 --- a/test/java/io/DataInputStream/OpsAfterClose.java +++ b/test/java/io/DataInputStream/OpsAfterClose.java @@ -244,13 +244,19 @@ public enum OpsAfterClose { f.deleteOnExit(); FileInputStream fis = new FileInputStream(f); - - DataInputStream dis = new DataInputStream( - new FileInputStream(f)); - if (testDataInputStream(dis)) { - failed = true; + try { + DataInputStream dis = new DataInputStream( + new FileInputStream(f)); + try { + if (testDataInputStream(dis)) { + failed = true; + } + } finally { + dis.close(); + } + } finally { + fis.close(); } - } private static boolean testDataInputStream(DataInputStream is) diff --git a/test/java/io/DataInputStream/ReadFully.java b/test/java/io/DataInputStream/ReadFully.java index ad9428016e6b1ea020d15edf8aa8ef059af785dc..53c0ee5c41fa10ef72f3a8341939bb8a60e59280 100644 --- a/test/java/io/DataInputStream/ReadFully.java +++ b/test/java/io/DataInputStream/ReadFully.java @@ -43,6 +43,7 @@ public class ReadFully { } catch (IndexOutOfBoundsException ie) { caughtException = true; } finally { + dis.close(); if (!caughtException) throw new RuntimeException("Test failed"); } diff --git a/test/java/io/File/DeleteOnExit.java b/test/java/io/File/DeleteOnExit.java index 74100ee52e5d25cbc16b1063241e83abe38a4731..b332bf9c88b91fe491c590538b608e22e8b2385a 100644 --- a/test/java/io/File/DeleteOnExit.java +++ b/test/java/io/File/DeleteOnExit.java @@ -48,7 +48,9 @@ public class DeleteOnExit { public static void main (String args[]) throws Exception{ if (args.length == 0) { - Runtime.getRuntime().exec(java + " DeleteOnExit -test").waitFor(); + String cmd = java + " -classpath " + System.getProperty("test.classes") + + " DeleteOnExit -test"; + Runtime.getRuntime().exec(cmd).waitFor(); if (file1.exists() || file2.exists() || file3.exists() || dir.exists() || file4.exists() || file5.exists() || file6.exists() || file7.exists()) { diff --git a/test/java/io/File/DeleteOnExitNPE.java b/test/java/io/File/DeleteOnExitNPE.java index dff7915d01c7be2626b142479be7d5b7600d0344..50a29c3c8823b94ee12d18bdae62e69217dff225 100644 --- a/test/java/io/File/DeleteOnExitNPE.java +++ b/test/java/io/File/DeleteOnExitNPE.java @@ -45,7 +45,8 @@ public class DeleteOnExitNPE implements Runnable public static void runTest() throws Exception { String cmd = System.getProperty("java.home") + File.separator + - "bin" + File.separator + "java"; + "bin" + File.separator + "java" + + " -classpath " + System.getProperty("test.classes"); Process process = Runtime.getRuntime().exec(cmd + " DeleteOnExitNPE -test"); BufferedReader isReader = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader esReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); diff --git a/test/java/io/File/IsHidden.java b/test/java/io/File/IsHidden.java index a0198d1efdf559b9d2a5e8c464786399e3dbb204..e34fcc39910ac1915e7586752cc3aa486c0e10d7 100644 --- a/test/java/io/File/IsHidden.java +++ b/test/java/io/File/IsHidden.java @@ -27,7 +27,7 @@ */ import java.io.*; - +import java.nio.file.attribute.DosFileAttributeView; public class IsHidden { @@ -41,15 +41,20 @@ public class IsHidden { System.err.println(path + " ==> " + x); } + private static void setHidden(File f, boolean value) throws IOException { + f.toPath().getFileAttributeView(DosFileAttributeView.class).setHidden(value); + } + private static void testWin32() throws Exception { File f = new File(dir, "test"); f.deleteOnExit(); f.createNewFile(); - String name = f.getCanonicalPath(); - Process p = Runtime.getRuntime().exec("cmd.exe /c attrib +H " + name); - p.waitFor(); - ck(name, true); - + setHidden(f, true); + try { + ck(f.getPath(), true); + } finally { + setHidden(f, false); + } ck(".foo", false); ck("foo", false); } diff --git a/test/java/io/FileInputStream/LeadingSlash.java b/test/java/io/FileInputStream/LeadingSlash.java index 7b72be99cfddd68c0009efa7469f64099b5c45ac..3b57243025820201ec369e1e6379f4970feb9a26 100644 --- a/test/java/io/FileInputStream/LeadingSlash.java +++ b/test/java/io/FileInputStream/LeadingSlash.java @@ -36,8 +36,8 @@ public class LeadingSlash { File file = null; try { file = File.createTempFile("bug", "4487368"); - new FileInputStream("\\" + file.getPath()); - new FileOutputStream("\\" + file.getPath()); + new FileInputStream("\\" + file.getPath()).close(); + new FileOutputStream("\\" + file.getPath()).close(); } finally { if (file != null) file.delete(); diff --git a/test/java/io/InputStream/OpsAfterClose.java b/test/java/io/InputStream/OpsAfterClose.java index 7c64c985996125a3d7416427c9e55498e2ea6dbb..9685782ff00cd40de60fc6d4701db56a2be23aa6 100644 --- a/test/java/io/InputStream/OpsAfterClose.java +++ b/test/java/io/InputStream/OpsAfterClose.java @@ -125,23 +125,35 @@ public enum OpsAfterClose { f.deleteOnExit(); FileInputStream fis = new FileInputStream(f); - if (testInputStream(fis)) { - failed = true; - } - if (testFileInputStream(fis)) { - failed = true; + try { + if (testInputStream(fis)) { + failed = true; + } + if (testFileInputStream(fis)) { + failed = true; + } + } finally { + fis.close(); } BufferedInputStream bs = new BufferedInputStream( new FileInputStream(f)); - if (testInputStream(bs)) { - failed = true; + try { + if (testInputStream(bs)) { + failed = true; + } + } finally { + bs.close(); } DataInputStream dis = new DataInputStream( new FileInputStream(f)); - if (testInputStream(dis)) { - failed = true; + try { + if (testInputStream(dis)) { + failed = true; + } + } finally { + dis.close(); } PushbackInputStream pbis = new PushbackInputStream( diff --git a/test/java/io/InputStream/ReadParams.java b/test/java/io/InputStream/ReadParams.java index 36713aa8eee9aebbd39bd7355bfc99152471bf7b..602445cd0a2d2415707697876ff61023e2d19f22 100644 --- a/test/java/io/InputStream/ReadParams.java +++ b/test/java/io/InputStream/ReadParams.java @@ -137,6 +137,7 @@ public class ReadParams { oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Integer(32)); + oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fn)); doTest(ois); doTest1(ois); diff --git a/test/java/io/InputStreamReader/GrowAfterEOF.java b/test/java/io/InputStreamReader/GrowAfterEOF.java index 7434401b4147deda1962cc49026e7b3c6a446dba..96bb2a971a4c8da8497c1bae3ec6a227cf3740cb 100644 --- a/test/java/io/InputStreamReader/GrowAfterEOF.java +++ b/test/java/io/InputStreamReader/GrowAfterEOF.java @@ -33,29 +33,36 @@ public class GrowAfterEOF { public static void main(String[] args) throws Exception { File input = new File(".", "TestEOFInput.txt"); RandomAccessFile rf = new RandomAccessFile(input, "rw"); - BufferedReader r = new BufferedReader - (new InputStreamReader(new FileInputStream(input))); + try { + BufferedReader r = new BufferedReader + (new InputStreamReader(new FileInputStream(input))); + try { + // write something + rf.writeBytes("a line"); - // write something - rf.writeBytes("a line"); + // read till the end of file + while (r.readLine() != null); - // read till the end of file - while (r.readLine() != null); + // append to the end of the file + rf.seek(rf.length()); + rf.writeBytes("new line"); - // append to the end of the file - rf.seek(rf.length()); - rf.writeBytes("new line"); - - // now try to read again - boolean readMore = false; - while (r.readLine() != null) { - readMore = true; - } - if (!readMore) { - input.delete(); - throw new Exception("Failed test: unable to read!"); - } else { - input.delete(); + // now try to read again + boolean readMore = false; + while (r.readLine() != null) { + readMore = true; + } + if (!readMore) { + input.delete(); + throw new Exception("Failed test: unable to read!"); + } else { + input.delete(); + } + } finally { + r.close(); + } + } finally { + rf.close(); } } } diff --git a/test/java/io/ObjectInputStream/ResolveProxyClass.java b/test/java/io/ObjectInputStream/ResolveProxyClass.java index 59cd3d349c27f9418016114debdc0bddd4f126a3..eaea1c32ca1b5525b85b79745836d6689054980b 100644 --- a/test/java/io/ObjectInputStream/ResolveProxyClass.java +++ b/test/java/io/ObjectInputStream/ResolveProxyClass.java @@ -79,7 +79,7 @@ public class ResolveProxyClass { * code, and it should be the first loader on the stack when * ObjectInputStream.resolveProxyClass gets executed. */ - ClassLoader expectedLoader = ClassLoader.getSystemClassLoader(); + ClassLoader expectedLoader = ResolveProxyClass.class.getClassLoader(); TestObjectInputStream in = new TestObjectInputStream(); Class proxyClass = in.resolveProxyClass( diff --git a/test/java/io/RandomAccessFile/EOF.java b/test/java/io/RandomAccessFile/EOF.java index aa65fd361c42fa98cd6d1263894542daf07a72b4..50b48de77a7f6dc76f15f9215fdd234d5071e10e 100644 --- a/test/java/io/RandomAccessFile/EOF.java +++ b/test/java/io/RandomAccessFile/EOF.java @@ -35,12 +35,16 @@ public class EOF { int n; String dir = System.getProperty("test.src", "."); RandomAccessFile raf = new RandomAccessFile(new File(dir, "EOF.java"), "r"); - for (;;) { - n = raf.read(buf, 0, buf.length); - if (n <= 0) break; + try { + for (;;) { + n = raf.read(buf, 0, buf.length); + if (n <= 0) break; + } + if (n != -1) + throw new RuntimeException("Expected -1 for EOF, got " + n); + } finally { + raf.close(); } - if (n != -1) - throw new RuntimeException("Expected -1 for EOF, got " + n); } } diff --git a/test/java/io/RandomAccessFile/ParameterCheck.java b/test/java/io/RandomAccessFile/ParameterCheck.java index 97319fcffc6c3b2063c78ffa1b18eb15bd0a408e..e483929cdf0a3ae185cfe738975bd8e303a43d3e 100644 --- a/test/java/io/RandomAccessFile/ParameterCheck.java +++ b/test/java/io/RandomAccessFile/ParameterCheck.java @@ -44,6 +44,7 @@ public class ParameterCheck { private static void doTest(String method) throws Exception { File fn = new File("x.ParameterCheck"); + RandomAccessFile raf = null; try { byte b[] = new byte[32]; @@ -55,7 +56,7 @@ public class ParameterCheck { fout.write(i); } fout.close(); - RandomAccessFile raf = new RandomAccessFile(fn , "rw"); + raf = new RandomAccessFile(fn , "rw"); System.err.println("-----------------------------" + "-----------------------------"); @@ -125,6 +126,8 @@ public class ParameterCheck { System.err.println("-----------------------------" + "-----------------------------"); } finally { + if (raf != null) + raf.close(); fn.delete(); } diff --git a/test/java/io/RandomAccessFile/ReadLine.java b/test/java/io/RandomAccessFile/ReadLine.java index 879926f89ffca986cda16fc1057fde28dab5fe8e..1d63ce08aebb257cbe22a162e9bf49ca4e94f6e4 100644 --- a/test/java/io/RandomAccessFile/ReadLine.java +++ b/test/java/io/RandomAccessFile/ReadLine.java @@ -33,26 +33,30 @@ public class ReadLine { public static void main(String args[]) throws Exception { File fn = new File("x.ReadLine"); RandomAccessFile raf = new RandomAccessFile(fn,"rw"); - String line; - int ctr = 1; - String expected; + try { + String line; + int ctr = 1; + String expected; - raf.writeBytes - ("ln1\rln2\r\nln3\nln4\rln5\r\nln6\n\rln8\r\rln10\n\nln12\r\r\nln14"); - raf.seek(0); + raf.writeBytes + ("ln1\rln2\r\nln3\nln4\rln5\r\nln6\n\rln8\r\rln10\n\nln12\r\r\nln14"); + raf.seek(0); - while ((line=raf.readLine()) != null) { - if ((ctr == 7) || (ctr == 9) || - (ctr == 11) || (ctr == 13)) { - expected = ""; - } else { - expected = "ln" + ctr; + while ((line=raf.readLine()) != null) { + if ((ctr == 7) || (ctr == 9) || + (ctr == 11) || (ctr == 13)) { + expected = ""; + } else { + expected = "ln" + ctr; + } + if (!line.equals(expected)) { + throw new Exception("Expected \"" + expected + "\"" + + ", read \"" + line + "\""); + } + ctr++; } - if (!line.equals(expected)) { - throw new Exception("Expected \"" + expected + "\"" + - ", read \"" + line + "\""); - } - ctr++; + } finally { + raf.close(); } System.err.println("Successfully completed test!"); } diff --git a/test/java/io/RandomAccessFile/Seek.java b/test/java/io/RandomAccessFile/Seek.java index a3f15cde10cfba3b2e0c90c41c2815dd6866b511..2a505e58fdcea0c3cd26fa22b4499e52c3e3cc75 100644 --- a/test/java/io/RandomAccessFile/Seek.java +++ b/test/java/io/RandomAccessFile/Seek.java @@ -44,6 +44,8 @@ public class Seek throw new Exception ("Should have thrown an IOException when seek offset is < 0"); } catch (IOException e) { + } finally { + raf.close(); } } } diff --git a/test/java/io/RandomAccessFile/WriteBytesChars.java b/test/java/io/RandomAccessFile/WriteBytesChars.java index 6803f2b2d82e1841425ec70381eb163d1d43a9e5..bbb94943b749cfd92cc05a13b0ade6b65b36e07c 100644 --- a/test/java/io/RandomAccessFile/WriteBytesChars.java +++ b/test/java/io/RandomAccessFile/WriteBytesChars.java @@ -37,8 +37,8 @@ public class WriteBytesChars { byte[] b = new byte[80]; File fn = new File("x.WriteBytesChars"); - try{ - RandomAccessFile raf = new RandomAccessFile(fn , "rw");; + RandomAccessFile raf = new RandomAccessFile(fn , "rw");; + try { for (int i = 0; i < 80; i++) { buf[i] = 'a'; } @@ -71,6 +71,7 @@ public class WriteBytesChars { RuntimeException("RandomAccessFile.writeChars, wrong result"); } } finally { + raf.close(); fn.delete(); } } diff --git a/test/java/io/RandomAccessFile/WriteUTF.java b/test/java/io/RandomAccessFile/WriteUTF.java index ed831273adf3e94521dbe6418f2765e790b46c9b..c3d13e0493a0823716d45a1ed1c71d98d6a69b8f 100644 --- a/test/java/io/RandomAccessFile/WriteUTF.java +++ b/test/java/io/RandomAccessFile/WriteUTF.java @@ -42,8 +42,8 @@ public class WriteUTF { s += s; System.err.println("String length " + s.length()); + f = new RandomAccessFile(fn, "rw"); try { - f = new RandomAccessFile(fn, "rw"); try { f.writeUTF(s); } @@ -53,6 +53,7 @@ public class WriteUTF { throw new RuntimeException("UTFDataFormatException not thrown"); } finally { + f.close(); fn.delete(); } diff --git a/test/java/io/RandomAccessFile/skipBytes/SkipBytes.java b/test/java/io/RandomAccessFile/skipBytes/SkipBytes.java index 9c4cf04390a2f77fbde31ba0f9f22c1869bef147..0e8723ebe0283408aa5551c278e740b20ba60a50 100644 --- a/test/java/io/RandomAccessFile/skipBytes/SkipBytes.java +++ b/test/java/io/RandomAccessFile/skipBytes/SkipBytes.java @@ -96,14 +96,18 @@ public class SkipBytes{ public static void main(String[] args) throws Exception { RandomAccessFile raf = new RandomAccessFile("input.txt" , "rw"); - int length = (int)raf.length(); - - doTest(raf , 0 , 2*length); - doTest(raf , 0 , length); - doTest(raf , 0 , length/2); - doTest(raf , length/2 , -2); - doTest(raf , length , 0); - doTest(raf , 0 , -1); + try { + int length = (int)raf.length(); + + doTest(raf , 0 , 2*length); + doTest(raf , 0 , length); + doTest(raf , 0 , length/2); + doTest(raf , length/2 , -2); + doTest(raf , length , 0); + doTest(raf , 0 , -1); + } finally{ + raf.close(); + } } diff --git a/test/java/io/Reader/Skip.java b/test/java/io/Reader/Skip.java index cc4255bc35f825733e81b61db1cc5c8dd10f7fb2..08f627f7a3a0f98af016ca8d4f77676041338e0e 100644 --- a/test/java/io/Reader/Skip.java +++ b/test/java/io/Reader/Skip.java @@ -35,12 +35,16 @@ public class Skip { File f = new File(System.getProperty("test.src", "."), "SkipInput.txt"); FileReader fr = new FileReader(f); - long nchars = 8200; - long actual = fr.skip(nchars); + try { + long nchars = 8200; + long actual = fr.skip(nchars); - if (actual > nchars) { - throw new Exception - ("Should skip " + nchars + ", but skipped " +actual+" chars"); + if (actual > nchars) { + throw new Exception + ("Should skip " + nchars + ", but skipped " +actual+" chars"); + } + } finally { + fr.close(); } } } diff --git a/test/java/io/Reader/SkipNegative.java b/test/java/io/Reader/SkipNegative.java index 17ec0c050389ea15edf62321c6823f06529c713d..e1aec0ca5959d88f13853b06c54c8b798a2a1f90 100644 --- a/test/java/io/Reader/SkipNegative.java +++ b/test/java/io/Reader/SkipNegative.java @@ -41,6 +41,8 @@ public class SkipNegative { } catch(IllegalArgumentException e){ // Negative argument caught return; + } finally { + fr.close(); } throw new Exception("Skip should not accept negative values"); } diff --git a/test/java/io/Serializable/ClassCastExceptionDetail/Read.java b/test/java/io/Serializable/ClassCastExceptionDetail/Read.java index a6063106be9f0397ee8d30cb3f4f801dd196636a..52373c50043193b17d0710ef1d68a85ec62e6afa 100644 --- a/test/java/io/Serializable/ClassCastExceptionDetail/Read.java +++ b/test/java/io/Serializable/ClassCastExceptionDetail/Read.java @@ -40,9 +40,9 @@ class Gub extends Foo {} public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("tmp.ser")); + FileInputStream in = new FileInputStream("tmp.ser"); try { + ObjectInputStream oin = new ObjectInputStream(in); oin.readObject(); throw new Error("readObject should not succeed"); } catch (ClassCastException e) { @@ -57,6 +57,8 @@ public class Read { { throw new Error("ClassNotFoundException message incomplete"); } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/auditStreamSubclass/AuditStreamSubclass.java b/test/java/io/Serializable/auditStreamSubclass/AuditStreamSubclass.java index c5b5bdd24a041442012d39bfcebb19287fc73fd1..e27eaf4e97b0af701ee66f11d8444a982254e3b1 100644 --- a/test/java/io/Serializable/auditStreamSubclass/AuditStreamSubclass.java +++ b/test/java/io/Serializable/auditStreamSubclass/AuditStreamSubclass.java @@ -26,6 +26,8 @@ * @summary Verify that unauthorized ObjectOutputStream and ObjectInputStream * cannot be constructed if they override security-sensitive non-final * methods. + * @build AuditStreamSubclass + * @run main/othervm AuditStreamSubclass */ import java.io.*; diff --git a/test/java/io/Serializable/backRefCNFException/Read.java b/test/java/io/Serializable/backRefCNFException/Read.java index e40689987d253f2f917311df54588b7f96a1c95b..9bc69ada6f9f7daa2e1587e5c4815cfaea822e82 100644 --- a/test/java/io/Serializable/backRefCNFException/Read.java +++ b/test/java/io/Serializable/backRefCNFException/Read.java @@ -38,13 +38,17 @@ class A implements Serializable { public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("tmp.ser")); - oin.readObject(); + FileInputStream in = new FileInputStream("tmp.ser"); try { + ObjectInputStream oin = new ObjectInputStream(in); oin.readObject(); - throw new Error("back reference read succeeded"); - } catch (ClassNotFoundException ex) { + try { + oin.readObject(); + throw new Error("back reference read succeeded"); + } catch (ClassNotFoundException ex) { + } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/checkModifiers/CheckModifiers.java b/test/java/io/Serializable/checkModifiers/CheckModifiers.java index 6519af87b37bcd49c388a83cb166a6f2c280d338..d984ad5430779fa18610e27d46141ca596156b05 100644 --- a/test/java/io/Serializable/checkModifiers/CheckModifiers.java +++ b/test/java/io/Serializable/checkModifiers/CheckModifiers.java @@ -213,33 +213,39 @@ public class CheckModifiers { FileOutputStream fos = new FileOutputStream("fields.ser"); - ObjectOutputStream oos = new ObjectOutputStream(fos); - - System.out.println("Writing obj 1"); - oos.writeObject(tc1); - System.out.println("Writing obj 2"); - oos.writeObject(tc2); - System.out.println("Writing obj 3"); - oos.writeObject(tc3); - System.out.println("Writing obj 4"); - oos.writeObject(tc4); + try { + ObjectOutputStream oos = new ObjectOutputStream(fos); + System.out.println("Writing obj 1"); + oos.writeObject(tc1); + System.out.println("Writing obj 2"); + oos.writeObject(tc2); + System.out.println("Writing obj 3"); + oos.writeObject(tc3); + System.out.println("Writing obj 4"); + oos.writeObject(tc4); + oos.flush(); + } finally { + fos.close(); + } FileInputStream fis = new FileInputStream("fields.ser"); - ObjectInputStream ois = new ObjectInputStream(fis); - - - System.out.println("Test modifiers for serialPeristentFields "); - System.out.println("---------------------------------------- "); - System.out.println("Declaration missing final modifier"); - ois.readObject(); - System.out.println(); - System.out.println("Declaration with public instead of private access"); - ois.readObject(); - System.out.println(); - System.out.println("Declaration with different type"); - ois.readObject(); - System.out.println(); - System.out.println("Declaration as in specification"); - ois.readObject(); + try { + ObjectInputStream ois = new ObjectInputStream(fis); + System.out.println("Test modifiers for serialPeristentFields "); + System.out.println("---------------------------------------- "); + System.out.println("Declaration missing final modifier"); + ois.readObject(); + System.out.println(); + System.out.println("Declaration with public instead of private access"); + ois.readObject(); + System.out.println(); + System.out.println("Declaration with different type"); + ois.readObject(); + System.out.println(); + System.out.println("Declaration as in specification"); + ois.readObject(); + } finally { + fis.close(); + } } }; diff --git a/test/java/io/Serializable/classDescFlagConflict/Read.java b/test/java/io/Serializable/classDescFlagConflict/Read.java index c484379de388d35452f4f0a5130b33c36d4c4d6d..f7eb5e512503c43390ad18e0682bf66a2df01cf3 100644 --- a/test/java/io/Serializable/classDescFlagConflict/Read.java +++ b/test/java/io/Serializable/classDescFlagConflict/Read.java @@ -42,10 +42,15 @@ public class Read { * descriptor. */ File f = new File(System.getProperty("test.src", "."), "Foo.ser"); - new ObjectInputStream(new FileInputStream(f)).readObject(); - throw new Error( - "read succeeded for object whose class descriptor has " + - "both SC_SERIALIZABLE and SC_EXTERNALIZABLE flags set"); + FileInputStream in = new FileInputStream(f); + try { + new ObjectInputStream(in).readObject(); + throw new Error( + "read succeeded for object whose class descriptor has " + + "both SC_SERIALIZABLE and SC_EXTERNALIZABLE flags set"); + } finally { + in.close(); + } } catch (InvalidClassException e) { } } diff --git a/test/java/io/Serializable/classDescHooks/ClassDescHooks.java b/test/java/io/Serializable/classDescHooks/ClassDescHooks.java index c71cf338aa004087c89f34e14f791fa257ecab51..9e382fe70a0d8c81631b267a49884aac0adc43e0 100644 --- a/test/java/io/Serializable/classDescHooks/ClassDescHooks.java +++ b/test/java/io/Serializable/classDescHooks/ClassDescHooks.java @@ -93,8 +93,12 @@ public class ClassDescHooks implements ObjectStreamConstants { bout = new ByteArrayOutputStream(); foof = new File(System.getProperty("test.src", "."), "Foo.ser"); fin = new FileInputStream(foof); - while (fin.available() > 0) - bout.write(fin.read()); + try { + while (fin.available() > 0) + bout.write(fin.read()); + } finally { + fin.close(); + } byte[] buf1 = bout.toByteArray(); bout = new ByteArrayOutputStream(); @@ -107,11 +111,16 @@ public class ClassDescHooks implements ObjectStreamConstants { if (! Arrays.equals(buf1, buf2)) throw new Error("Incompatible stream format (write)"); + Foo foocopy; fin = new FileInputStream(foof); - oin = new ObjectInputStream(fin); - Foo foocopy = (Foo) oin.readObject(); - if (! foo.equals(foocopy)) - throw new Error("Incompatible stream format (read)"); + try { + oin = new ObjectInputStream(fin); + foocopy = (Foo) oin.readObject(); + if (! foo.equals(foocopy)) + throw new Error("Incompatible stream format (read)"); + } finally { + fin.close(); + } // make sure write hook not called when old protocol in use bout = new ByteArrayOutputStream(); diff --git a/test/java/io/Serializable/duplicateSerialFields/Test.java b/test/java/io/Serializable/duplicateSerialFields/Test.java index a9f21b6463dcf36ff49f00bcc9e08fd574e80eed..020912f21dfc33bdfedebd8a1cecdac18af9af85 100644 --- a/test/java/io/Serializable/duplicateSerialFields/Test.java +++ b/test/java/io/Serializable/duplicateSerialFields/Test.java @@ -82,18 +82,26 @@ public class Test { } catch (InvalidClassException e) { } + FileInputStream in = new FileInputStream("a.ser"); try { - new ObjectInputStream(new FileInputStream("a.ser")).readObject(); + ObjectInputStream oin = new ObjectInputStream(in); + oin.readObject(); throw new Error( "read of A should fail with InvalidClassException"); } catch (InvalidClassException e) { + } finally { + in.close(); } + in = new FileInputStream("b.ser"); try { - new ObjectInputStream(new FileInputStream("b.ser")).readObject(); + ObjectInputStream oin = new ObjectInputStream(in); + oin.readObject(); throw new Error( "read of B should fail with InvalidClassException"); } catch (InvalidClassException e) { + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/enum/badResolve/Read.java b/test/java/io/Serializable/enum/badResolve/Read.java index fb80678536a9a168e64014d95864400f473ca269..c2b4a5c1d309a0f3daf6e0cc723874443d86d041 100644 --- a/test/java/io/Serializable/enum/badResolve/Read.java +++ b/test/java/io/Serializable/enum/badResolve/Read.java @@ -44,13 +44,15 @@ public class Read { } static void read(String filename) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream(filename)); + FileInputStream in = new FileInputStream(filename); try { + ObjectInputStream oin = new ObjectInputStream(in); Object obj = oin.readObject(); throw new Error("read of " + obj + " should not have succeeded"); } catch (InvalidClassException e) { System.out.println("caught expected exception " + e); + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/enum/constantSubclasses/Read.java b/test/java/io/Serializable/enum/constantSubclasses/Read.java index e9f47fdac85dc17dd28a44295ae33ff070651e38..d1145768bb5777a725d7870f7cb06ef5f0bab663 100644 --- a/test/java/io/Serializable/enum/constantSubclasses/Read.java +++ b/test/java/io/Serializable/enum/constantSubclasses/Read.java @@ -38,13 +38,17 @@ enum Foo { public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("foo.ser")); - for (Foo f : Foo.values()) { - Object obj = oin.readObject(); - if (obj != f) { - throw new Error("expected " + f + ", got " + obj); + FileInputStream in = new FileInputStream("foo.ser"); + try { + ObjectInputStream oin = new ObjectInputStream(in); + for (Foo f : Foo.values()) { + Object obj = oin.readObject(); + if (obj != f) { + throw new Error("expected " + f + ", got " + obj); + } } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/enum/missingConstant/Read.java b/test/java/io/Serializable/enum/missingConstant/Read.java index c4965b8bfc15ff057310ea81295f11f8bd24c76e..4bd6075adf25778f27e8853ab6193eb171f09165 100644 --- a/test/java/io/Serializable/enum/missingConstant/Read.java +++ b/test/java/io/Serializable/enum/missingConstant/Read.java @@ -33,19 +33,23 @@ enum Foo { foo, bar } public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("foo.ser")); - for (Foo f : Foo.values()) { - Object obj = oin.readObject(); - if (obj != f) { - throw new Error("expected " + f + ", got " + obj); - } - } + FileInputStream in = new FileInputStream("foo.ser"); try { - Object obj = oin.readObject(); - throw new Error("read of " + obj + " should not succeed"); - } catch (InvalidObjectException e) { - System.out.println("caught expected exception: " + e); + ObjectInputStream oin = new ObjectInputStream(in); + for (Foo f : Foo.values()) { + Object obj = oin.readObject(); + if (obj != f) { + throw new Error("expected " + f + ", got " + obj); + } + } + try { + Object obj = oin.readObject(); + throw new Error("read of " + obj + " should not succeed"); + } catch (InvalidObjectException e) { + System.out.println("caught expected exception: " + e); + } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/fieldTypeString/Read.java b/test/java/io/Serializable/fieldTypeString/Read.java index 3056ca31d8bc0e707f48e31ad6061d915f3cef9e..b8b7dd68bef7f149f8d3dc3c3ec09ebb457dc1c3 100644 --- a/test/java/io/Serializable/fieldTypeString/Read.java +++ b/test/java/io/Serializable/fieldTypeString/Read.java @@ -44,23 +44,30 @@ class Bar implements Serializable { public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("foo.ser")); - Foo foo = (Foo) oin.readObject(); - if (! foo.obj.equals("foo")) { - throw new Error(); - } + FileInputStream in = new FileInputStream("foo.ser"); try { - oin.readObject(); - throw new Error(); - } catch (ClassCastException ex) { + ObjectInputStream oin = new ObjectInputStream(in); + Foo foo = (Foo) oin.readObject(); + if (! foo.obj.equals("foo")) { + throw new Error(); + } + try { + oin.readObject(); + throw new Error(); + } catch (ClassCastException ex) { + } + } finally { + in.close(); } - oin = new ObjectInputStream(new FileInputStream("bar.ser")); + in = new FileInputStream("bar.ser"); try { + ObjectInputStream oin = new ObjectInputStream(in); oin.readObject(); throw new Error(); } catch (InvalidClassException ex) { + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/illegalHandle/Test.java b/test/java/io/Serializable/illegalHandle/Test.java index af2d52663ff74d70a589f0ddf976f5a0205248b2..74c7ad96c20c2ea6f43245e7b5e881a121bf7079 100644 --- a/test/java/io/Serializable/illegalHandle/Test.java +++ b/test/java/io/Serializable/illegalHandle/Test.java @@ -38,21 +38,31 @@ public class Test { * serialized String object followed by an illegal handle */ File f = new File(base, "negativeHandle.ser"); - ObjectInputStream oin = new ObjectInputStream(new FileInputStream(f)); - oin.readObject(); + FileInputStream in = new FileInputStream(f); try { + ObjectInputStream oin = new ObjectInputStream(in); oin.readObject(); - throw new Error("negative handle read should not succeed"); - } catch (StreamCorruptedException ex) { + try { + oin.readObject(); + throw new Error("negative handle read should not succeed"); + } catch (StreamCorruptedException ex) { + } + } finally { + in.close(); } f = new File(base, "tooHighHandle.ser"); - oin = new ObjectInputStream(new FileInputStream(f)); - oin.readObject(); + in = new FileInputStream(f); try { + ObjectInputStream oin = new ObjectInputStream(in); oin.readObject(); - throw new Error("too-high handle read should not succeed"); - } catch (StreamCorruptedException ex) { + try { + oin.readObject(); + throw new Error("too-high handle read should not succeed"); + } catch (StreamCorruptedException ex) { + } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/longString/LongString.java b/test/java/io/Serializable/longString/LongString.java index bbb6701009a97981a85d3e393e135a4d1a624153..7d342b1b9f007506ea057bd8d251156781574365 100644 --- a/test/java/io/Serializable/longString/LongString.java +++ b/test/java/io/Serializable/longString/LongString.java @@ -68,17 +68,25 @@ public class LongString { mesgf = new File(System.getProperty("test.src", "."), "mesg.ser"); fin = new FileInputStream(mesgf); bout = new ByteArrayOutputStream(); - while (fin.available() > 0) - bout.write(fin.read()); + try { + while (fin.available() > 0) + bout.write(fin.read()); + } finally { + fin.close(); + } byte[] buf2 = bout.toByteArray(); if (! Arrays.equals(buf1, buf2)) throw new Error("incompatible string format (write)"); fin = new FileInputStream(mesgf); - oin = new ObjectInputStream(fin); - String mesgcopy = (String) oin.readObject(); - if (! mesg.equals(mesgcopy)) - throw new Error("incompatible string format (read)"); + try { + oin = new ObjectInputStream(fin); + String mesgcopy = (String) oin.readObject(); + if (! mesg.equals(mesgcopy)) + throw new Error("incompatible string format (read)"); + } finally { + fin.close(); + } } } diff --git a/test/java/io/Serializable/oldTests/AnnotateClass.java b/test/java/io/Serializable/oldTests/AnnotateClass.java index 4680b4c45c18278e93935f9dace11e991daf2491..17f3ab1180ec99c1cb34b0429236fe2553f7a7f8 100644 --- a/test/java/io/Serializable/oldTests/AnnotateClass.java +++ b/test/java/io/Serializable/oldTests/AnnotateClass.java @@ -37,36 +37,43 @@ public class AnnotateClass { "methods \n"); try { FileOutputStream ostream = new FileOutputStream("subtest1.tmp"); - TestOutputStream p = new TestOutputStream(ostream); - - p.writeObject(System.out); - p.writeObject(System.err); - p.writeObject(new PrintStream(ostream)); - p.flush(); - ostream.close(); + try { + TestOutputStream p = new TestOutputStream(ostream); + p.writeObject(System.out); + p.writeObject(System.err); + p.writeObject(new PrintStream(ostream)); + p.flush(); + } finally { + ostream.close(); + } FileInputStream istream = new FileInputStream("subtest1.tmp"); - TestInputStream q = new TestInputStream(istream); - - PrintStream out = (PrintStream)q.readObject(); - PrintStream err = (PrintStream)q.readObject(); - Object other = q.readObject(); - if (out != System.out) { - System.err.println( - "\nTEST FAILED: System.out not read correctly"); - throw new Error(); - } - if (err != System.err) { - System.err.println( - "\nTEST FAILED: System.err not read correctly"); - throw new Error(); - } - if (other != null) { - System.err.println( - "\nTEST FAILED: Non-system PrintStream should have " + - "been written/read as null"); - throw new Error(); + try { + TestInputStream q = new TestInputStream(istream); + + PrintStream out = (PrintStream)q.readObject(); + PrintStream err = (PrintStream)q.readObject(); + Object other = q.readObject(); + if (out != System.out) { + System.err.println( + "\nTEST FAILED: System.out not read correctly"); + throw new Error(); + } + if (err != System.err) { + System.err.println( + "\nTEST FAILED: System.err not read correctly"); + throw new Error(); + } + if (other != null) { + System.err.println( + "\nTEST FAILED: Non-system PrintStream should have " + + "been written/read as null"); + throw new Error(); + } + } finally { + istream.close(); } + System.err.println("\nTEST PASSED"); } catch (Exception e) { System.err.print("TEST FAILED: "); diff --git a/test/java/io/Serializable/oldTests/ArrayFields.java b/test/java/io/Serializable/oldTests/ArrayFields.java index 743268f8aaa96752812f89030f521aaf9f8f2f25..6833a039a815818cf35ffa1242cf018681e6d446 100644 --- a/test/java/io/Serializable/oldTests/ArrayFields.java +++ b/test/java/io/Serializable/oldTests/ArrayFields.java @@ -35,20 +35,22 @@ import java.io.*; public class ArrayFields { - public static void main (String argv[]) { + public static void main (String argv[]) throws IOException { System.err.println("\nRegression test for testing of " + "serialization/deserialization of objects with " + "fields of array type\n"); + FileOutputStream ostream = null; + FileInputStream istream = null; try { - FileOutputStream ostream = new FileOutputStream("piotest4.tmp"); + ostream = new FileOutputStream("piotest4.tmp"); ObjectOutputStream p = new ObjectOutputStream(ostream); ArrayTest array = new ArrayTest(); p.writeObject(array); p.flush(); - FileInputStream istream = new FileInputStream("piotest4.tmp"); + istream = new FileInputStream("piotest4.tmp"); ObjectInputStream q = new ObjectInputStream(istream); Object obj = null; @@ -73,6 +75,9 @@ public class ArrayFields { System.err.print("TEST FAILED: "); e.printStackTrace(); throw new Error(); + } finally { + if (istream != null) istream.close(); + if (ostream != null) ostream.close(); } } } diff --git a/test/java/io/Serializable/oldTests/ArraysOfArrays.java b/test/java/io/Serializable/oldTests/ArraysOfArrays.java index 9349669365d2213dcc56f2b4ca8264b48e50abd4..ba5fc0dec1936181b720c1baf592af5ec742f315 100644 --- a/test/java/io/Serializable/oldTests/ArraysOfArrays.java +++ b/test/java/io/Serializable/oldTests/ArraysOfArrays.java @@ -31,14 +31,15 @@ import java.io.*; public class ArraysOfArrays { - public static void main (String argv[]) { + public static void main (String argv[]) throws IOException { System.err.println("\nRegression test for testing of " + "serialization/deserialization of objects as " + "arrays of arrays \n"); FileInputStream istream = null; + FileOutputStream ostream = null; try { - FileOutputStream ostream = new FileOutputStream("piotest5.tmp"); + ostream = new FileOutputStream("piotest5.tmp"); ObjectOutputStream p = new ObjectOutputStream(ostream); byte b[][] = {{ 0, 1}, {2,3}}; @@ -207,6 +208,9 @@ public class ArraysOfArrays { throw new Error(); } throw new Error(); + } finally { + if (istream != null) istream.close(); + if (ostream != null) ostream.close(); } } } diff --git a/test/java/io/Serializable/oldTests/BinaryTree.java b/test/java/io/Serializable/oldTests/BinaryTree.java index 81e8e1d786ab03c3384fae1f60b80124d1663c61..b4d824fdff7c94e78b3374ef38e9f3a4be71a1ae 100644 --- a/test/java/io/Serializable/oldTests/BinaryTree.java +++ b/test/java/io/Serializable/oldTests/BinaryTree.java @@ -37,28 +37,34 @@ public class BinaryTree { "with BinaryTree types \n"); try { - FileOutputStream ostream = new FileOutputStream("piotest3.tmp"); - ObjectOutputStream p = new ObjectOutputStream(ostream); - BinaryTreeTest base = new BinaryTreeTest(2); - p.writeObject(null); - p.writeObject(base); - p.flush(); - ostream.close(); + FileOutputStream ostream = new FileOutputStream("piotest3.tmp"); + try { + ObjectOutputStream p = new ObjectOutputStream(ostream); + p.writeObject(null); + p.writeObject(base); + p.flush(); + } finally { + ostream.close(); + } FileInputStream istream = new FileInputStream("piotest3.tmp"); - ObjectInputStream q = new ObjectInputStream(istream); - - Object n = q.readObject(); - if (n != null) { - System.err.println("\nnull read as " + n); - } - BinaryTreeTest nbase = (BinaryTreeTest)q.readObject(); - if (!base.equals(nbase)) { - System.err.println("\nTEST FAILED: BinaryTree read " + - "incorrectly."); - throw new Error(); + try { + ObjectInputStream q = new ObjectInputStream(istream); + Object n = q.readObject(); + if (n != null) { + System.err.println("\nnull read as " + n); + } + BinaryTreeTest nbase = (BinaryTreeTest)q.readObject(); + if (!base.equals(nbase)) { + System.err.println("\nTEST FAILED: BinaryTree read " + + "incorrectly."); + throw new Error(); + } + } finally { + istream.close(); } + System.err.println("\nTEST PASSED"); } catch (Exception e) { System.err.print("TEST FAILED: "); diff --git a/test/java/io/Serializable/oldTests/CircularList.java b/test/java/io/Serializable/oldTests/CircularList.java index 1a9723aaebee23a86af71f917f6953fd0480caed..bd5814e08911f993e352df849909a4c4a9a729ea 100644 --- a/test/java/io/Serializable/oldTests/CircularList.java +++ b/test/java/io/Serializable/oldTests/CircularList.java @@ -31,20 +31,22 @@ import java.io.*; public class CircularList { - public static void main (String argv[]) { + public static void main (String argv[]) throws IOException { System.err.println("\nRegression test for testing of " + "serialization/deserialization of " + "objects with CirculalListType types \n"); + FileInputStream istream = null; + FileOutputStream ostream = null; try { - FileOutputStream ostream = new FileOutputStream("piotest7.tmp"); + ostream = new FileOutputStream("piotest7.tmp"); ObjectOutputStream p = new ObjectOutputStream(ostream); CircularListTest.setup(); p.writeObject(CircularListTest.list); p.flush(); - FileInputStream istream = new FileInputStream("piotest7.tmp"); + istream = new FileInputStream("piotest7.tmp"); ObjectInputStream q = new ObjectInputStream(istream); CircularListTest cv = (CircularListTest)q.readObject(); @@ -58,6 +60,9 @@ public class CircularList { System.err.print("TEST FAILED: "); e.printStackTrace(); throw new Error(); + } finally { + if (istream != null) istream.close(); + if (ostream != null) ostream.close(); } } } diff --git a/test/java/io/Serializable/oldTests/SimpleArrays.java b/test/java/io/Serializable/oldTests/SimpleArrays.java index c35b9b0682f688b68ca23924babe66f7dbe31fac..bbf4c8556de723dee053f5f13bcc7e14e3e000fa 100644 --- a/test/java/io/Serializable/oldTests/SimpleArrays.java +++ b/test/java/io/Serializable/oldTests/SimpleArrays.java @@ -35,13 +35,14 @@ import java.io.*; public class SimpleArrays { - public static void main (String argv[]) { + public static void main (String argv[]) throws IOException { System.err.println("\nRegression test for testing of " + "serialization/deserialization of objects with Arrays types\n"); FileInputStream istream = null; + FileOutputStream ostream = null; try { - FileOutputStream ostream = new FileOutputStream("piotest2.tmp"); + ostream = new FileOutputStream("piotest2.tmp"); ObjectOutputStream p = new ObjectOutputStream(ostream); byte b[] = { 0, 1}; @@ -177,6 +178,9 @@ public class SimpleArrays { throw new Error(); } throw new Error(); + } finally { + if (istream != null) istream.close(); + if (ostream != null) ostream.close(); } } } diff --git a/test/java/io/Serializable/oldTests/WritePrimitive.java b/test/java/io/Serializable/oldTests/WritePrimitive.java index d955045a799053a75945c5e236cebecea949482b..3976cd4164bac5de4b0e50d164479b884dc00d47 100644 --- a/test/java/io/Serializable/oldTests/WritePrimitive.java +++ b/test/java/io/Serializable/oldTests/WritePrimitive.java @@ -34,11 +34,12 @@ import java.io.*; public class WritePrimitive { - public static void main (String argv[]) { + public static void main (String argv[]) throws IOException { System.err.println("\nRegression test for testing of " + "serialization/deserialization of primitives \n"); FileInputStream istream = null; + FileOutputStream ostream = null; try { int i = 123456; byte b = 12; @@ -51,7 +52,7 @@ public class WritePrimitive { String string = "The String"; PrimitivesTest prim = new PrimitivesTest(); - FileOutputStream ostream = new FileOutputStream("piotest1.tmp"); + ostream = new FileOutputStream("piotest1.tmp"); ObjectOutputStream p = new ObjectOutputStream(ostream); p.writeInt(i); @@ -154,6 +155,9 @@ public class WritePrimitive { throw new Error(); } throw new Error(); + } finally { + if (istream != null) istream.close(); + if (ostream != null) ostream.close(); } } } diff --git a/test/java/io/Serializable/packageAccess/Test.java b/test/java/io/Serializable/packageAccess/Test.java index 18046118001f427d7ac1a0e91eb512860bbf9f3d..15d2e4ce0e0cf205b516c7ea140f837e07fb1267 100644 --- a/test/java/io/Serializable/packageAccess/Test.java +++ b/test/java/io/Serializable/packageAccess/Test.java @@ -38,7 +38,8 @@ public class Test { public static void main(String[] args) throws Exception { ClassLoader ldr = - new URLClassLoader(new URL[]{ new URL("file:foo.jar") }); + new URLClassLoader(new URL[]{ new URL("file:foo.jar") }, + Test.class.getClassLoader()); bcl = Class.forName("B", true, ldr); dcl = Class.forName("D", true, ldr); diff --git a/test/java/io/Serializable/parents/EvolvedClass.java b/test/java/io/Serializable/parents/EvolvedClass.java index db8b11d1c7443434c705a96e4e8756f3d06a9524..edb8dee810658403d032671c8bb20cc70fc06462 100644 --- a/test/java/io/Serializable/parents/EvolvedClass.java +++ b/test/java/io/Serializable/parents/EvolvedClass.java @@ -34,8 +34,12 @@ public class EvolvedClass { // Deserialize in to new class object FileInputStream fi = new FileInputStream("parents.ser"); - ObjectInputStream si = new ObjectInputStream(fi); - cnew = (ASubClass) si.readObject(); + try { + ObjectInputStream si = new ObjectInputStream(fi); + cnew = (ASubClass) si.readObject(); + } finally { + fi.close(); + } System.out.println("Printing the deserialized class: "); System.out.println(); diff --git a/test/java/io/Serializable/parents/OriginalClass.java b/test/java/io/Serializable/parents/OriginalClass.java index c83b76e22d67e258696feed3ee96ad24ec9ac7ef..2f21c494db5e246da99979070202d12a4b7cac21 100644 --- a/test/java/io/Serializable/parents/OriginalClass.java +++ b/test/java/io/Serializable/parents/OriginalClass.java @@ -43,9 +43,13 @@ public class OriginalClass { // Serialize the subclass FileOutputStream fo = new FileOutputStream("parents.ser"); - ObjectOutputStream so = new ObjectOutputStream(fo); - so.writeObject(corg); - so.flush(); + try { + ObjectOutputStream so = new ObjectOutputStream(fo); + so.writeObject(corg); + so.flush(); + } finally { + fo.close(); + } System.out.println("Printing the serialized class: "); System.out.println(); diff --git a/test/java/io/Serializable/proxy/Basic.java b/test/java/io/Serializable/proxy/Basic.java index a9152fd78bdfbcaf9b749eb75306b38178ce8b75..92c989b2be7b2e9098a6c08a35ecc3bd075b4c1d 100644 --- a/test/java/io/Serializable/proxy/Basic.java +++ b/test/java/io/Serializable/proxy/Basic.java @@ -81,7 +81,7 @@ class ProxyBlindInputStream extends ObjectInputStream { public class Basic { public static void main(String[] args) throws Exception { - ClassLoader loader = ClassLoader.getSystemClassLoader(); + ClassLoader loader = Basic.class.getClassLoader(); Class[] interfaces = new Class[] { Foo.class, Bar.class }; Random rand = new Random(); int foo = rand.nextInt(); diff --git a/test/java/io/Serializable/proxy/skipMissing/Read.java b/test/java/io/Serializable/proxy/skipMissing/Read.java index 2a7ede9cf2063e841ad3dc81a613d59f63121d68..511bb42d71504c042f8eaf7591976fd5a152afb9 100644 --- a/test/java/io/Serializable/proxy/skipMissing/Read.java +++ b/test/java/io/Serializable/proxy/skipMissing/Read.java @@ -49,20 +49,24 @@ class B implements Serializable { public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = new ObjectInputStream( - new FileInputStream("tmp.ser")); - A a = (A) oin.readObject(); - if (! (a.a.equals("a") && a.z.equals("z"))) { - throw new Error("A fields corrupted"); - } - B b = (B) oin.readObject(); - if (! b.s.equals("s")) { - throw new Error("B fields corrupted"); - } + FileInputStream in = new FileInputStream("tmp.ser"); try { - oin.readObject(); - throw new Error("proxy read should not succeed"); - } catch (ClassNotFoundException ex) { + ObjectInputStream oin = new ObjectInputStream(in); + A a = (A) oin.readObject(); + if (! (a.a.equals("a") && a.z.equals("z"))) { + throw new Error("A fields corrupted"); + } + B b = (B) oin.readObject(); + if (! b.s.equals("s")) { + throw new Error("B fields corrupted"); + } + try { + oin.readObject(); + throw new Error("proxy read should not succeed"); + } catch (ClassNotFoundException ex) { + } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/proxy/skipMissing/Write.java b/test/java/io/Serializable/proxy/skipMissing/Write.java index df1d5ca3a0ff2df7873f32c5d0a0fa859f9ac4f4..c4b06f2be9d4117e8cbaa8e59a727cece49a929d 100644 --- a/test/java/io/Serializable/proxy/skipMissing/Write.java +++ b/test/java/io/Serializable/proxy/skipMissing/Write.java @@ -64,7 +64,7 @@ class B implements Serializable { public class Write { public static void main(String[] args) throws Exception { Object proxy = Proxy.newProxyInstance( - ClassLoader.getSystemClassLoader(), + Write.class.getClassLoader(), new Class[] { I.class }, new Handler()); ObjectOutputStream oout = new ObjectOutputStream( new FileOutputStream("tmp.ser")); diff --git a/test/java/io/Serializable/readObjectNoData/Read.java b/test/java/io/Serializable/readObjectNoData/Read.java index ccd485f1b188ea52ce55dd43806efd6aa429515b..e786c6cc47a43141c07dc4badfd8238ff8aa45f0 100644 --- a/test/java/io/Serializable/readObjectNoData/Read.java +++ b/test/java/io/Serializable/readObjectNoData/Read.java @@ -95,14 +95,18 @@ class F extends E { public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("tmp.ser")); - F f = (F) oin.readObject(); - if (f.aCalled || f.bCalled || f.dCalled || f.eCalled) { - throw new Error("readObjectNoData invoked erroneously"); - } - if (! f.cCalled) { - throw new Error("readObjectNoData not invoked"); + FileInputStream in = new FileInputStream("tmp.ser"); + try { + ObjectInputStream oin = new ObjectInputStream(in); + F f = (F) oin.readObject(); + if (f.aCalled || f.bCalled || f.dCalled || f.eCalled) { + throw new Error("readObjectNoData invoked erroneously"); + } + if (! f.cCalled) { + throw new Error("readObjectNoData not invoked"); + } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/skipWriteObject/Read.java b/test/java/io/Serializable/skipWriteObject/Read.java index d8873eb409d95948be98e141609d5dd105ac1432..e1fcfe79f0c7363ce68f405f8f2cc9703dbe2722 100644 --- a/test/java/io/Serializable/skipWriteObject/Read.java +++ b/test/java/io/Serializable/skipWriteObject/Read.java @@ -38,9 +38,13 @@ public class Read { public static void main(String[] args) throws Exception { ObjectInputStream oin = new ObjectInputStream(new FileInputStream("tmp.ser")); - Object[] array = (Object[]) oin.readObject(); - if (! (array[0].equals("before") && array[2].equals("after"))) { - throw new Error(); + try { + Object[] array = (Object[]) oin.readObject(); + if (! (array[0].equals("before") && array[2].equals("after"))) { + throw new Error(); + } + } finally { + oin.close(); } } } diff --git a/test/java/io/Serializable/skippedObjCNFException/Read.java b/test/java/io/Serializable/skippedObjCNFException/Read.java index 9effc242688d731627b02dd21331fe7f8644d009..b50265099b59b76ef8fed2f0bb0ff12144fe14de 100644 --- a/test/java/io/Serializable/skippedObjCNFException/Read.java +++ b/test/java/io/Serializable/skippedObjCNFException/Read.java @@ -44,8 +44,12 @@ class B implements Serializable { public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("tmp.ser")); - oin.readObject(); + FileInputStream in = new FileInputStream("tmp.ser"); + try { + ObjectInputStream oin = new ObjectInputStream(in); + oin.readObject(); + } finally { + in.close(); + } } } diff --git a/test/java/io/Serializable/stopCustomDeserialization/Read.java b/test/java/io/Serializable/stopCustomDeserialization/Read.java index c77a0cba2486ece100bfad914893c7061cc51501..156fa50b8c8e5be46879ed2699356f8d75ae36dd 100644 --- a/test/java/io/Serializable/stopCustomDeserialization/Read.java +++ b/test/java/io/Serializable/stopCustomDeserialization/Read.java @@ -53,16 +53,20 @@ class C extends B { public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("tmp.ser")); + FileInputStream in = new FileInputStream("tmp.ser"); try { - oin.readObject(); - throw new Error("readObject should not succeed"); - } catch (ClassNotFoundException e) { - // expected - } - if (!oin.readObject().equals("after")) { - throw new Error("subsequent object corrupted"); + ObjectInputStream oin = new ObjectInputStream(in); + try { + oin.readObject(); + throw new Error("readObject should not succeed"); + } catch (ClassNotFoundException e) { + // expected + } + if (!oin.readObject().equals("after")) { + throw new Error("subsequent object corrupted"); + } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/unresolvedClassDesc/Read.java b/test/java/io/Serializable/unresolvedClassDesc/Read.java index 78a35453fa01100c9ac3c698aa4ea15d7a99b5ca..c3fc28bde810bb21fcee5d81eea6a76d5ff2a58f 100644 --- a/test/java/io/Serializable/unresolvedClassDesc/Read.java +++ b/test/java/io/Serializable/unresolvedClassDesc/Read.java @@ -32,19 +32,23 @@ import java.io.*; public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("tmp.ser")); - oin.readObject(); - oin.readObject(); + FileInputStream in = new FileInputStream("tmp.ser"); try { + ObjectInputStream oin = new ObjectInputStream(in); oin.readObject(); - throw new Error("read of Foo instance succeeded"); - } catch (ClassNotFoundException ex) { - } - try { oin.readObject(); - throw new Error("indirect read of Foo instance succeeded"); - } catch (ClassNotFoundException ex) { + try { + oin.readObject(); + throw new Error("read of Foo instance succeeded"); + } catch (ClassNotFoundException ex) { + } + try { + oin.readObject(); + throw new Error("indirect read of Foo instance succeeded"); + } catch (ClassNotFoundException ex) { + } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/unshared/Read.java b/test/java/io/Serializable/unshared/Read.java index c92d07ebf539be3a7ced64a538c0bbcdaf03cd29..7d7c9d49ba6de6a5d039800941299c12d535d5f4 100644 --- a/test/java/io/Serializable/unshared/Read.java +++ b/test/java/io/Serializable/unshared/Read.java @@ -80,20 +80,30 @@ public class Read { } // read in objects written by Write.main() - oin = new ObjectInputStream(new FileInputStream("tmp.ser")); - oin.readObject(); + FileInputStream in = new FileInputStream("tmp.ser"); try { + oin = new ObjectInputStream(in); oin.readObject(); - throw new Error(); - } catch (ObjectStreamException ex) { + try { + oin.readObject(); + throw new Error(); + } catch (ObjectStreamException ex) { + } + } finally { + in.close(); } - oin = new ObjectInputStream(new FileInputStream("tmp.ser")); - oin.readObject(); + in = new FileInputStream("tmp.ser"); try { - oin.readUnshared(); - throw new Error(); - } catch (ObjectStreamException ex) { + oin = new ObjectInputStream(in); + oin.readObject(); + try { + oin.readUnshared(); + throw new Error(); + } catch (ObjectStreamException ex) { + } + } finally { + in.close(); } } } diff --git a/test/java/io/Serializable/wrongReturnTypes/Read.java b/test/java/io/Serializable/wrongReturnTypes/Read.java index b5ef5e0862eb88e576fd178f28ee3c5ddc600d75..a41599f1ea7132d2dacec30eb4135c4573c7d6f5 100644 --- a/test/java/io/Serializable/wrongReturnTypes/Read.java +++ b/test/java/io/Serializable/wrongReturnTypes/Read.java @@ -62,15 +62,19 @@ class B extends A { public class Read { public static void main(String[] args) throws Exception { - ObjectInputStream oin = - new ObjectInputStream(new FileInputStream("tmp.ser")); - B b = (B) oin.readObject(); - if (A.readObjectNoDataCalled) { - throw new Error("readObjectNoData with wrong return type called"); - } else if (B.readObjectCalled) { - throw new Error("readObject with wrong return type called"); - } else if (B.readResolveCalled) { - throw new Error("readResolve with wrong return type called"); + FileInputStream in = new FileInputStream("tmp.ser"); + try { + ObjectInputStream oin = new ObjectInputStream(in); + B b = (B) oin.readObject(); + if (A.readObjectNoDataCalled) { + throw new Error("readObjectNoData with wrong return type called"); + } else if (B.readObjectCalled) { + throw new Error("readObject with wrong return type called"); + } else if (B.readResolveCalled) { + throw new Error("readResolve with wrong return type called"); + } + } finally { + in.close(); } } } diff --git a/test/java/io/StreamTokenizer/Comment.java b/test/java/io/StreamTokenizer/Comment.java index 056362629c71a29cc4104b1cee81c598dde95ad6..f1192fe62053d033f1a2dad31f5e279d69f0b8aa 100644 --- a/test/java/io/StreamTokenizer/Comment.java +++ b/test/java/io/StreamTokenizer/Comment.java @@ -41,40 +41,45 @@ public class Comment { int slashStarComment = 4; for (int i = 0; i < 8 ; i++) { - StreamTokenizer st = new StreamTokenizer(new FileReader(f)); + FileReader reader = new FileReader(f); + try { + StreamTokenizer st = new StreamTokenizer(reader); - /* decide the state of this run */ - boolean slashCommentFlag = ((i & slashIsCommentStart) != 0); - boolean slashSlashCommentFlag = ((i & slashSlashComment) != 0); - boolean slashStarCommentFlag = ((i & slashStarComment) != 0); + /* decide the state of this run */ + boolean slashCommentFlag = ((i & slashIsCommentStart) != 0); + boolean slashSlashCommentFlag = ((i & slashSlashComment) != 0); + boolean slashStarCommentFlag = ((i & slashStarComment) != 0); - /* set the initial state of the tokenizer */ - if (!slashCommentFlag) { - st.ordinaryChar('/'); - } - st.slashSlashComments(slashSlashCommentFlag); - st.slashStarComments(slashStarCommentFlag); + /* set the initial state of the tokenizer */ + if (!slashCommentFlag) { + st.ordinaryChar('/'); + } + st.slashSlashComments(slashSlashCommentFlag); + st.slashStarComments(slashStarCommentFlag); - /* now go throgh the input file */ - while(st.nextToken() != StreamTokenizer.TT_EOF) - { - String token = st.sval; - if (token == null) { - continue; - } else { - if ((token.compareTo("Error1") == 0) && slashStarCommentFlag) { - throw new Exception("Failed to pass one line C comments!"); - } - if ((token.compareTo("Error2") == 0) && slashStarCommentFlag) { - throw new Exception("Failed to pass multi line C comments!"); - } - if ((token.compareTo("Error3") == 0) && slashSlashCommentFlag) { - throw new Exception("Failed to pass C++ comments!"); - } - if ((token.compareTo("Error4") == 0) && slashCommentFlag) { - throw new Exception("Failed to pass / comments!"); + /* now go throgh the input file */ + while(st.nextToken() != StreamTokenizer.TT_EOF) + { + String token = st.sval; + if (token == null) { + continue; + } else { + if ((token.compareTo("Error1") == 0) && slashStarCommentFlag) { + throw new Exception("Failed to pass one line C comments!"); + } + if ((token.compareTo("Error2") == 0) && slashStarCommentFlag) { + throw new Exception("Failed to pass multi line C comments!"); + } + if ((token.compareTo("Error3") == 0) && slashSlashCommentFlag) { + throw new Exception("Failed to pass C++ comments!"); + } + if ((token.compareTo("Error4") == 0) && slashCommentFlag) { + throw new Exception("Failed to pass / comments!"); + } } } + } finally { + reader.close(); } } } diff --git a/test/java/io/readBytes/ReadBytesBounds.java b/test/java/io/readBytes/ReadBytesBounds.java index 4f69e68ba36a6c28831038cb702cc89a5b863658..eef870b7408c3a0734743375978f1fcfa0080b45 100644 --- a/test/java/io/readBytes/ReadBytesBounds.java +++ b/test/java/io/readBytes/ReadBytesBounds.java @@ -57,24 +57,28 @@ public class ReadBytesBounds { } public static void main(String argv[]) throws Throwable { - byte b[] = new byte[32]; - testRead(-1, -1, false); - testRead(-1, 0, false); - testRead( 0, -1, false); - testRead( 0, 33, false); - testRead(33, 0, false); - testRead(33, 4, false); - testRead( 0, 32, true); - testRead(32, 0, true); - testRead(32, 4, false); - testRead( 4, 16, true); - testRead( 1, 31, true); - testRead( 0, 0, true); - testRead(31, Integer.MAX_VALUE, false); - testRead( 0, Integer.MAX_VALUE, false); - testRead(-1, Integer.MAX_VALUE, false); - testRead(-4, Integer.MIN_VALUE, false); - testRead( 0, Integer.MIN_VALUE, false); + try { + testRead(-1, -1, false); + testRead(-1, 0, false); + testRead( 0, -1, false); + testRead( 0, 33, false); + testRead(33, 0, false); + testRead(33, 4, false); + testRead( 0, 32, true); + testRead(32, 0, true); + testRead(32, 4, false); + testRead( 4, 16, true); + testRead( 1, 31, true); + testRead( 0, 0, true); + testRead(31, Integer.MAX_VALUE, false); + testRead( 0, Integer.MAX_VALUE, false); + testRead(-1, Integer.MAX_VALUE, false); + testRead(-4, Integer.MIN_VALUE, false); + testRead( 0, Integer.MIN_VALUE, false); + } finally { + fis.close(); + raf.close(); + } } static void testRead(int off, int len, boolean expected) throws Throwable { diff --git a/test/java/lang/ClassLoader/UninitializedParent.java b/test/java/lang/ClassLoader/UninitializedParent.java index 9b751f664f684a19da2779da921c4d3f2dedb796..9d4459d01a81313cd3f2d2cc7d07ffcade0b3440 100644 --- a/test/java/lang/ClassLoader/UninitializedParent.java +++ b/test/java/lang/ClassLoader/UninitializedParent.java @@ -26,6 +26,7 @@ * @bug 6636650 * @summary Uninitialized class loaders should not be a parent of other * class loaders. + * @run main/othervm UninitializedParent */ diff --git a/test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java b/test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java index 0d4bf80e493d0bae3434a96ab7162339dbb3a3b7..e1f79f737de7d582fd350e9a092cc961ecb5c1d9 100644 --- a/test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java +++ b/test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java @@ -38,14 +38,17 @@ import java.io.*; public class DefineClassByteBuffer { static void test(ClassLoader cl) throws Exception { - Class c = Class.forName("TestClass", true, cl); + Class c = Class.forName("TestClass", true, cl); if (!"TestClass".equals(c.getName())) { throw new RuntimeException("Got wrong class: " + c); } + if (c.getClassLoader() != cl) { + throw new RuntimeException("TestClass defined by wrong classloader: " + c.getClassLoader()); + } } public static void main(String arg[]) throws Exception { - ClassLoader[] cls = new ClassLoader[DummyClassLoader.MAX_TYPE]; + DummyClassLoader[] cls = new DummyClassLoader[DummyClassLoader.MAX_TYPE]; for (int i = 0; i < cls.length; i++) { cls[i] = new DummyClassLoader(i); } @@ -53,7 +56,7 @@ public class DefineClassByteBuffer { /* Create several instances of the class using different classloaders, which are using different types of ByteBuffer. */ for (int i = 0; i < cls.length; i++) { - test(cls[i]); + test(cls[i]); } } @@ -100,12 +103,13 @@ public class DefineClassByteBuffer { buffers. */ buffers[MAPPED_BUFFER] = readClassFile(CLASS_NAME + ".class"); byte[] array = new byte[buffers[MAPPED_BUFFER].limit()]; + buffers[MAPPED_BUFFER].get(array).flip(); buffers[DIRECT_BUFFER] = ByteBuffer.allocateDirect(array.length); - buffers[DIRECT_BUFFER].put(array); + buffers[DIRECT_BUFFER].put(array).flip(); buffers[ARRAY_BUFFER] = ByteBuffer.allocate(array.length); - buffers[ARRAY_BUFFER].put(array); + buffers[ARRAY_BUFFER].put(array).flip(); buffers[WRAPPED_BUFFER] = ByteBuffer.wrap(array); @@ -118,9 +122,30 @@ public class DefineClassByteBuffer { buffers[DUP_DIRECT_BUFFER] = buffers[DIRECT_BUFFER].duplicate(); } - public Class findClass(String name) { - return defineClass(name, buffers[loaderType], null); - } + protected Class loadClass(String name, boolean resolve) + throws ClassNotFoundException + { + Class c; + if (!"TestClass".equals(name)) { + c = super.loadClass(name, resolve); + } else { + // should not delegate to the system class loader + c = findClass(name); + if (resolve) { + resolveClass(c); + } + } + return c; + } + + protected Class findClass(String name) + throws ClassNotFoundException + { + if (!"TestClass".equals(name)) { + throw new ClassNotFoundException("Unexpected class: " + name); + } + return defineClass(name, buffers[loaderType], null); + } } /* DummyClassLoader */ } /* DefineClassByteBuffer */ diff --git a/test/java/lang/ClassLoader/findSystemClass/Loader.java b/test/java/lang/ClassLoader/findSystemClass/Loader.java index 34061485b302d9650630f7c0254ff790513daa64..60f1b79721807c917e83201becd02ff58a0e3a5d 100644 --- a/test/java/lang/ClassLoader/findSystemClass/Loader.java +++ b/test/java/lang/ClassLoader/findSystemClass/Loader.java @@ -21,10 +21,16 @@ * questions. */ +/* + * This test runs in othervm mode as it tests ClassLoader.findSystemClass + * and getSystemResource methods. + */ + /* @test @bug 4147599 4478150 @summary In 1.2beta4-I ClassLoader loaded classes can not link against application classes. + @run main/othervm Loader */ /* diff --git a/test/java/lang/ProcessBuilder/Basic.java b/test/java/lang/ProcessBuilder/Basic.java index e14f665a62a370845bff4858f77d159f0ae6727b..f4e3c26d9ee718b235382805c4982a4b72d659f5 100644 --- a/test/java/lang/ProcessBuilder/Basic.java +++ b/test/java/lang/ProcessBuilder/Basic.java @@ -37,6 +37,7 @@ import static java.lang.ProcessBuilder.Redirect.*; import java.io.*; import java.util.*; +import java.util.concurrent.CountDownLatch; import java.security.*; import java.util.regex.Pattern; import static java.lang.System.getenv; @@ -252,9 +253,9 @@ public class Basic { return sb.toString(); } - static void print4095(OutputStream s) throws Throwable { + static void print4095(OutputStream s, byte b) throws Throwable { byte[] bytes = new byte[4095]; - Arrays.fill(bytes, (byte) '!'); + Arrays.fill(bytes, b); s.write(bytes); // Might hang! } @@ -273,7 +274,9 @@ public class Basic { public static class JavaChild { public static void main(String args[]) throws Throwable { String action = args[0]; - if (action.equals("testIO")) { + if (action.equals("sleep")) { + Thread.sleep(10 * 60 * 1000L); + } else if (action.equals("testIO")) { String expected = "standard input"; char[] buf = new char[expected.length()+1]; int n = new InputStreamReader(System.in).read(buf,0,buf.length); @@ -315,7 +318,8 @@ public class Basic { printUTF8(new File(System.getProperty("user.dir")) .getCanonicalPath()); } else if (action.equals("print4095")) { - print4095(System.out); + print4095(System.out, (byte) '!'); + print4095(System.err, (byte) 'E'); System.exit(5); } else if (action.equals("OutErr")) { // You might think the system streams would be @@ -1717,16 +1721,107 @@ public class Basic { } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- - // This would deadlock, if not for the fact that + // Attempt to write 4095 bytes to the pipe buffer without a + // reader to drain it would deadlock, if not for the fact that // interprocess pipe buffers are at least 4096 bytes. + // + // Also, check that available reports all the bytes expected + // in the pipe buffer, and that I/O operations do the expected + // things. //---------------------------------------------------------------- try { List childArgs = new ArrayList(javaChildArgs); childArgs.add("print4095"); - Process p = new ProcessBuilder(childArgs).start(); - print4095(p.getOutputStream()); // Might hang! - p.waitFor(); // Might hang! + final int SIZE = 4095; + final Process p = new ProcessBuilder(childArgs).start(); + print4095(p.getOutputStream(), (byte) '!'); // Might hang! + p.waitFor(); // Might hang! + equal(SIZE, p.getInputStream().available()); + equal(SIZE, p.getErrorStream().available()); + THROWS(IOException.class, + new Fun(){void f() throws IOException { + p.getOutputStream().write((byte) '!'); + p.getOutputStream().flush(); + }}); + + final byte[] bytes = new byte[SIZE + 1]; + equal(SIZE, p.getInputStream().read(bytes)); + for (int i = 0; i < SIZE; i++) + equal((byte) '!', bytes[i]); + equal((byte) 0, bytes[SIZE]); + + equal(SIZE, p.getErrorStream().read(bytes)); + for (int i = 0; i < SIZE; i++) + equal((byte) 'E', bytes[i]); + equal((byte) 0, bytes[SIZE]); + + equal(0, p.getInputStream().available()); + equal(0, p.getErrorStream().available()); + equal(-1, p.getErrorStream().read()); + equal(-1, p.getInputStream().read()); + equal(p.exitValue(), 5); + + p.getInputStream().close(); + p.getErrorStream().close(); + p.getOutputStream().close(); + + InputStream[] streams = { p.getInputStream(), p.getErrorStream() }; + for (final InputStream in : streams) { + Fun[] ops = { + new Fun(){void f() throws IOException { + in.read(); }}, + new Fun(){void f() throws IOException { + in.read(bytes); }}, + new Fun(){void f() throws IOException { + in.available(); }} + }; + for (Fun op : ops) { + try { + op.f(); + fail(); + } catch (IOException expected) { + check(expected.getMessage() + .matches("[Ss]tream [Cc]losed")); + } + } + } + } catch (Throwable t) { unexpected(t); } + + //---------------------------------------------------------------- + // Check that reads which are pending when Process.destroy is + // called, get EOF, not IOException("Stream closed"). + //---------------------------------------------------------------- + try { + final int cases = 4; + for (int i = 0; i < cases; i++) { + final int action = i; + List childArgs = new ArrayList(javaChildArgs); + childArgs.add("sleep"); + final byte[] bytes = new byte[10]; + final Process p = new ProcessBuilder(childArgs).start(); + final CountDownLatch latch = new CountDownLatch(1); + final Thread thread = new Thread() { + public void run() { + try { + latch.countDown(); + int r; + switch (action) { + case 0: r = p.getInputStream().read(); break; + case 1: r = p.getErrorStream().read(); break; + case 2: r = p.getInputStream().read(bytes); break; + case 3: r = p.getErrorStream().read(bytes); break; + default: throw new Error(); + } + equal(-1, r); + } catch (Throwable t) { unexpected(t); }}}; + + thread.start(); + latch.await(); + Thread.sleep(10); + p.destroy(); + thread.join(); + } } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- @@ -1741,7 +1836,6 @@ public class Basic { } catch (IOException e) { new File("./emptyCommand").delete(); String m = e.getMessage(); - //e.printStackTrace(); if (EnglishUnix.is() && ! matches(m, "Permission denied")) unexpected(e); diff --git a/test/java/lang/System/ExitFinalizersAndJIT.java b/test/java/lang/System/ExitFinalizersAndJIT.java index bc98b12b205d0ac03d4ed8497fe23ef6806339c3..4fe5078e599388d2cdc35210216529325f107633 100644 --- a/test/java/lang/System/ExitFinalizersAndJIT.java +++ b/test/java/lang/System/ExitFinalizersAndJIT.java @@ -26,6 +26,7 @@ @summary runFinalizersOnExit(true) causes JIT to be unloaded and crashes the VM. Interim fix for 1.2 beta4 -- don't unload native libraries loaded by system classes. + @run main/othervm ExitFinalizersAndJIT */ public class ExitFinalizersAndJIT { diff --git a/test/java/lang/System/IgnoreNullSecurityManager.java b/test/java/lang/System/IgnoreNullSecurityManager.java index 555238a27897404d632acb6b77349901d46779de..03a2c0cc3e9eb5f5beaf71ac6a3137fee06563dd 100644 --- a/test/java/lang/System/IgnoreNullSecurityManager.java +++ b/test/java/lang/System/IgnoreNullSecurityManager.java @@ -26,6 +26,7 @@ * @bug 4213876 * @summary Make sure "null" security manager is ignored, as specified in the * javadocs + * @run main/othervm IgnoreNullSecurityManager */ public class IgnoreNullSecurityManager { diff --git a/test/java/lang/Thread/GenerifyStackTraces.java b/test/java/lang/Thread/GenerifyStackTraces.java index 41672654629920445d9f1c45c65ea4cad734e62c..98de45073375f471fe6625b343db22b2dc62034c 100644 --- a/test/java/lang/Thread/GenerifyStackTraces.java +++ b/test/java/lang/Thread/GenerifyStackTraces.java @@ -155,7 +155,7 @@ public class GenerifyStackTraces { printStack(t, stack); } int frame = stack.length - 1; - for (int i = 0; i < depth; i++) { + for (int i = 0; i < depth && frame >= 0; i++) { if (! stack[frame].getMethodName().equals(methodNames[i])) { throw new RuntimeException("Expected " + methodNames[i] + " in frame " + frame + " but got " + diff --git a/test/java/lang/Thread/StackTraces.java b/test/java/lang/Thread/StackTraces.java index b5f3d0547b6b4317f2642b45c0f3648c3183a809..141c81a4ae2c1ad8126a013d57d47783cafdf854 100644 --- a/test/java/lang/Thread/StackTraces.java +++ b/test/java/lang/Thread/StackTraces.java @@ -159,7 +159,7 @@ public class StackTraces { printStack(t, stack); } int frame = stack.length - 1; - for (int i = 0; i < depth; i++) { + for (int i = 0; i < depth && frame >= 0; i++) { if (! stack[frame].getMethodName().equals(methodNames[i])) { throw new RuntimeException("Expected " + methodNames[i] + " in frame " + frame + " but got " + diff --git a/test/java/lang/annotation/ParameterAnnotations.java b/test/java/lang/annotation/ParameterAnnotations.java index ec36608e685b399cfec44a31502a3d646d592fa4..7c98241f3d9aecda1d39ae93af9e5389783ad0cc 100644 --- a/test/java/lang/annotation/ParameterAnnotations.java +++ b/test/java/lang/annotation/ParameterAnnotations.java @@ -27,6 +27,7 @@ * @summary Check properties of Annotations returned from * getParameterAnnotations, including freedom from security * exceptions. + * @run main/othervm ParameterAnnotations * @author Martin Buchholz */ diff --git a/test/java/lang/management/ClassLoadingMXBean/LoadCounts.java b/test/java/lang/management/ClassLoadingMXBean/LoadCounts.java index 2eac7634744906ffd80c34c177c31f0460a9e42b..d2daf80b47e62a3905d971f37ff8e614145ca2ca 100644 --- a/test/java/lang/management/ClassLoadingMXBean/LoadCounts.java +++ b/test/java/lang/management/ClassLoadingMXBean/LoadCounts.java @@ -118,9 +118,21 @@ class Chain { } class Slave {} -class LeftHand extends ClassLoader {} -class RightHand extends ClassLoader {} +class LeftHand extends ClassLoader { + public LeftHand() { + super(LeftHand.class.getClassLoader()); + } +} +class RightHand extends ClassLoader { + public RightHand() { + super(RightHand.class.getClassLoader()); + } +} class Body {} -class LoaderForTwoInstances extends ClassLoader {} +class LoaderForTwoInstances extends ClassLoader { + public LoaderForTwoInstances() { + super(LoaderForTwoInstances.class.getClassLoader()); + } +} class TheSameClass {} diff --git a/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java b/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java index efcd0e9354278e3344c44cd6310dfb5a2c9b97f1..545d7248d80014d9172957b4e2f613fda13b5472 100644 --- a/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java +++ b/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java @@ -25,6 +25,7 @@ * @test * @bug 5024531 * @summary Basic Test for ManagementFactory.newPlatformMXBean(). + * @run main/othervm MXBeanProxyTest * @author Mandy Chung */ import javax.management.*; diff --git a/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java b/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java index f81f40b40e1abd62a1333c3558b0bfcb645270cf..b7a04e0307dcd9d6a287067ed973731fd0ce2928 100644 --- a/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java +++ b/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java @@ -41,9 +41,9 @@ import javax.management.openmbean.CompositeData; public class CollectionUsageThreshold { private static MemoryMXBean mm = ManagementFactory.getMemoryMXBean(); - private static List pools = ManagementFactory.getMemoryPoolMXBeans(); - private static List managers = ManagementFactory.getMemoryManagerMXBeans(); - private static Map result = new HashMap(); + private static List pools = ManagementFactory.getMemoryPoolMXBeans(); + private static List managers = ManagementFactory.getMemoryManagerMXBeans(); + private static Map result = new HashMap<>(); private static boolean trace = false; private static boolean testFailed = false; private static final int EXPECTED_NUM_POOLS = 2; @@ -119,8 +119,7 @@ public class CollectionUsageThreshold { } // Find the Old generation which supports low memory detection - for (ListIterator iter = pools.listIterator(); iter.hasNext(); ) { - MemoryPoolMXBean p = (MemoryPoolMXBean) iter.next(); + for (MemoryPoolMXBean p : pools) { MemoryUsage u = p.getUsage(); if (p.isUsageThresholdSupported() && p.isCollectionUsageThresholdSupported()) { PoolRecord pr = new PoolRecord(p); @@ -134,25 +133,30 @@ public class CollectionUsageThreshold { throw new RuntimeException("Unexpected number of selected pools"); } - checker = new Checker("Checker thread"); - checker.setDaemon(true); - checker.start(); + try { + checker = new Checker("Checker thread"); + checker.setDaemon(true); + checker.start(); - for (Iterator iter = result.values().iterator(); iter.hasNext();) { - PoolRecord pr = (PoolRecord) iter.next(); - pr.getPool().setCollectionUsageThreshold(THRESHOLD); - System.out.println("Collection usage threshold of " + - pr.getPool().getName() + " set to " + THRESHOLD); - } + for (PoolRecord pr : result.values()) { + pr.getPool().setCollectionUsageThreshold(THRESHOLD); + System.out.println("Collection usage threshold of " + + pr.getPool().getName() + " set to " + THRESHOLD); + } - SensorListener listener = new SensorListener(); - NotificationEmitter emitter = (NotificationEmitter) mm; - emitter.addNotificationListener(listener, null, null); + SensorListener listener = new SensorListener(); + NotificationEmitter emitter = (NotificationEmitter) mm; + emitter.addNotificationListener(listener, null, null); - mm.setVerbose(true); - for (int i = 0; i < NUM_GCS; i++) { - invokeGC(); - checker.waitForCheckResult(); + for (int i = 0; i < NUM_GCS; i++) { + invokeGC(); + checker.waitForCheckResult(); + } + } finally { + // restore the default + for (PoolRecord pr : result.values()) { + pr.getPool().setCollectionUsageThreshold(0); + } } if (testFailed) @@ -168,8 +172,7 @@ public class CollectionUsageThreshold { mm.gc(); if (trace) { - for (Iterator iter = result.values().iterator(); iter.hasNext();) { - PoolRecord pr = (PoolRecord) iter.next(); + for (PoolRecord pr : result.values()) { System.out.println("Usage after GC for: " + pr.getPool().getName()); MemoryUtil.printMemoryUsage(pr.getPool().getUsage()); } @@ -200,8 +203,7 @@ public class CollectionUsageThreshold { } } private void checkResult() { - for (Iterator iter = result.values().iterator(); iter.hasNext();) { - PoolRecord pr = (PoolRecord) iter.next(); + for (PoolRecord pr : result.values()) { if (pr.getListenerInvokedCount() != numGCs) { throw new RuntimeException("Listeners invoked count = " + pr.getListenerInvokedCount() + " expected to be " + diff --git a/test/java/lang/management/MemoryMXBean/LowMemoryTest.java b/test/java/lang/management/MemoryMXBean/LowMemoryTest.java index f029ca23f40cde809c94ef9959957aba45eb9ee1..00d8b4d75069c0f0a50000d0df9d0f20892fdec9 100644 --- a/test/java/lang/management/MemoryMXBean/LowMemoryTest.java +++ b/test/java/lang/management/MemoryMXBean/LowMemoryTest.java @@ -31,7 +31,7 @@ * @author Mandy Chung * * @build LowMemoryTest MemoryUtil - * @run main/timeout=600 LowMemoryTest + * @run main/othervm/timeout=600 LowMemoryTest */ import java.lang.management.*; diff --git a/test/java/lang/management/MemoryMXBean/MemoryManagement.java b/test/java/lang/management/MemoryMXBean/MemoryManagement.java index 9edabf10aae0b85875a976b2b5b3e015734d78c7..f6b3b163811fce795d37c78e2aacbd37724a1d63 100644 --- a/test/java/lang/management/MemoryMXBean/MemoryManagement.java +++ b/test/java/lang/management/MemoryMXBean/MemoryManagement.java @@ -31,7 +31,7 @@ * @author Mandy Chung * * @build MemoryManagement MemoryUtil - * @run main/timeout=600 MemoryManagement + * @run main/othervm/timeout=600 MemoryManagement */ import java.lang.management.*; diff --git a/test/java/lang/management/MemoryMXBean/Pending.java b/test/java/lang/management/MemoryMXBean/Pending.java index 91c71c19fa900c50bcff5404a87b5eb48f6f6f18..62df8fef7ce21ce8838630e06c4bcc5684313626 100644 --- a/test/java/lang/management/MemoryMXBean/Pending.java +++ b/test/java/lang/management/MemoryMXBean/Pending.java @@ -62,9 +62,21 @@ public class Pending { trace = true; } - // Turn on verbose:gc to track GC - mbean.setVerbose(true); + try { + if (trace) { + // Turn on verbose:gc to track GC + mbean.setVerbose(true); + } + test(); + } finally { + if (trace) { + mbean.setVerbose(false); + } + } + System.out.println("Test passed."); + } + private static void test() throws Exception { // Clean the memory and remove all objects that are pending // finalization System.gc(); @@ -130,7 +142,6 @@ public class Pending { + " end = " + snapshot); } - System.out.println("Test passed."); } private static void checkFinalizerCount(int expectedTotal, int curFinalized) diff --git a/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java b/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java index b72d6c97c1a7c73fe24d8b9efbcba62630c7faea..da37945bd1623c1e0fd0d8ef28d9c3271b0138e7 100644 --- a/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java +++ b/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java @@ -28,7 +28,7 @@ * @author Mandy Chung * * @build ResetPeakMemoryUsage MemoryUtil - * @run main ResetPeakMemoryUsage + * @run main/othervm ResetPeakMemoryUsage */ import java.lang.management.*; diff --git a/test/java/lang/management/MemoryPoolMXBean/ThresholdTest.java b/test/java/lang/management/MemoryPoolMXBean/ThresholdTest.java index f34e8d00e50514f75c3251ea24f7cba9a087a715..622fc68a64027b282317b41a68479292a7d181ff 100644 --- a/test/java/lang/management/MemoryPoolMXBean/ThresholdTest.java +++ b/test/java/lang/management/MemoryPoolMXBean/ThresholdTest.java @@ -37,11 +37,23 @@ import java.util.*; public class ThresholdTest { public static void main(String args[]) throws Exception { List pools = ManagementFactory.getMemoryPoolMXBeans(); - for (MemoryPoolMXBean p : pools) { - // verify if isUsageThresholdExceeded() returns correct value - checkUsageThreshold(p); - // verify if isCollectionUsageThresholdExceeded() returns correct value - checkCollectionUsageThreshold(p); + try { + for (MemoryPoolMXBean p : pools) { + // verify if isUsageThresholdExceeded() returns correct value + checkUsageThreshold(p); + // verify if isCollectionUsageThresholdExceeded() returns correct value + checkCollectionUsageThreshold(p); + } + } finally { + // restore the default + for (MemoryPoolMXBean p : pools) { + if (p.isUsageThresholdSupported()) { + p.setUsageThreshold(0); + } + if (p.isCollectionUsageThresholdSupported()) { + p.setCollectionUsageThreshold(0); + } + } } System.out.println("Test passed."); diff --git a/test/java/lang/management/RuntimeMXBean/UpTime.java b/test/java/lang/management/RuntimeMXBean/UpTime.java index fc368f6838bfc12af978c5abfcc83c8dc22cca17..4dca590f71a7636bddd82041fd4f86d543347a9e 100644 --- a/test/java/lang/management/RuntimeMXBean/UpTime.java +++ b/test/java/lang/management/RuntimeMXBean/UpTime.java @@ -37,13 +37,18 @@ public class UpTime { = ManagementFactory.getRuntimeMXBean(); public static void main(String argv[]) throws Exception { + long jvmStartTime = metrics.getStartTime(); long systemStartOuter = System.currentTimeMillis(); long metricsStart = metrics.getUptime(); long systemStartInner = System.currentTimeMillis(); + // This JVM might have been running for some time if this test runs + // in samevm mode. The sanity check should apply to the test uptime. + long testUptime = metricsStart - (systemStartOuter - jvmStartTime); + // If uptime is more than 30 minutes then it looks like a bug in // the method - if (metricsStart > TIMEOUT * 60 * 1000) + if (testUptime > TIMEOUT * 60 * 1000) throw new RuntimeException("Uptime of the JVM is more than 30 " + "minutes (" + (metricsStart / 60 / 1000) diff --git a/test/java/lang/management/ThreadMXBean/AllThreadIds.java b/test/java/lang/management/ThreadMXBean/AllThreadIds.java index 59df52b8ba9e8f597eafbc99a40c1649abbb00c4..fa6ec61c812d678f3b10ff4939a804583b4a3440 100644 --- a/test/java/lang/management/ThreadMXBean/AllThreadIds.java +++ b/test/java/lang/management/ThreadMXBean/AllThreadIds.java @@ -28,7 +28,7 @@ * @author Alexei Guibadoulline and Mandy Chung * * @run build Barrier - * @run main AllThreadIds + * @run main/othervm AllThreadIds */ import java.lang.management.*; @@ -70,6 +70,12 @@ public class AllThreadIds { } } + private static void fail(String msg) { + trace = true; + printThreadList(); + throw new RuntimeException(msg); + } + private static void checkThreadCount(int numNewThreads, int numTerminatedThreads) throws Exception { @@ -82,27 +88,27 @@ public class AllThreadIds { if ((curLiveThreadCount - prevLiveThreadCount) != (numNewThreads - numTerminatedThreads)) { - throw new RuntimeException("Unexpected number of live threads: " + - " Prev Total = " + prevTotalThreadCount + - " Current Total = " + curTotalThreadCount + + fail("Unexpected number of live threads: " + + " Prev live = " + prevLiveThreadCount + + " Current live = " + curLiveThreadCount + " Threads added = " + numNewThreads + " Threads terminated = " + numTerminatedThreads); } if (curPeakThreadCount - prevPeakThreadCount != numNewThreads) { - throw new RuntimeException("Unexpected number of peak threads: " + - " Prev Total = " + prevTotalThreadCount + - " Current Total = " + curTotalThreadCount + + fail("Unexpected number of peak threads: " + + " Prev peak = " + prevPeakThreadCount + + " Current peak = " + curPeakThreadCount + " Threads added = " + numNewThreads); } if (curTotalThreadCount - prevTotalThreadCount != numNewThreads) { - throw new RuntimeException("Unexpected number of total threads: " + + fail("Unexpected number of total threads: " + " Prev Total = " + prevTotalThreadCount + " Current Total = " + curTotalThreadCount + " Threads added = " + numNewThreads); } long[] list = mbean.getAllThreadIds(); if (list.length != curLiveThreadCount) { - throw new RuntimeException("Array length returned by " + + fail("Array length returned by " + "getAllThreadIds() = " + list.length + " not matched count = " + curLiveThreadCount); } diff --git a/test/java/lang/management/ThreadMXBean/DisableTest.java b/test/java/lang/management/ThreadMXBean/DisableTest.java index eb2776096a92dd4d6d6dfe3ffa8148fc0839ad7e..f5b763a5bb1bf63b3fe5d534e39c5218a8ed11aa 100644 --- a/test/java/lang/management/ThreadMXBean/DisableTest.java +++ b/test/java/lang/management/ThreadMXBean/DisableTest.java @@ -36,8 +36,18 @@ public class DisableTest { private static ThreadMXBean tm = ManagementFactory.getThreadMXBean(); public static void main(String args[]) throws Exception { - testThreadContentionMonitoring(); - testThreadCpuMonitoring(); + try { + testThreadContentionMonitoring(); + testThreadCpuMonitoring(); + } finally { + // restore the default + if (tm.isThreadContentionMonitoringSupported()) { + tm.setThreadContentionMonitoringEnabled(false); + } + if (tm.isThreadCpuTimeSupported()) { + tm.setThreadCpuTimeEnabled(false); + } + } System.out.println("Test passed."); } diff --git a/test/java/lang/management/ThreadMXBean/EnableTest.java b/test/java/lang/management/ThreadMXBean/EnableTest.java index 57085b57c7d2868dd6a0c10a8489dc4a0ec1d367..a3530e44a03bed0caebbde3406d353ebbfe89a17 100644 --- a/test/java/lang/management/ThreadMXBean/EnableTest.java +++ b/test/java/lang/management/ThreadMXBean/EnableTest.java @@ -119,8 +119,19 @@ public class EnableTest { } public static void main(String args[]) throws Exception { - testThreadContentionMonitoring(); - testThreadCpuTime(); + try { + testThreadContentionMonitoring(); + testThreadCpuTime(); + } finally { + // restore the default + if (tm.isThreadContentionMonitoringSupported()) { + tm.setThreadContentionMonitoringEnabled(false); + } + if (tm.isThreadCpuTimeSupported()) { + tm.setThreadCpuTimeEnabled(false); + } + } + System.out.println("Test passed."); } diff --git a/test/java/lang/management/ThreadMXBean/FindDeadlocks.java b/test/java/lang/management/ThreadMXBean/FindDeadlocks.java index 99c9edfe7f8af0d67b062adfc58ae47fa4ab7747..b913147f92f2af6449eb38512db542d45cfaea4b 100644 --- a/test/java/lang/management/ThreadMXBean/FindDeadlocks.java +++ b/test/java/lang/management/ThreadMXBean/FindDeadlocks.java @@ -33,7 +33,7 @@ * @build MonitorDeadlock * @build SynchronizerDeadlock * @build ThreadDump - * @run main FindDeadlocks + * @run main/othervm FindDeadlocks */ import java.lang.management.*; diff --git a/test/java/lang/management/ThreadMXBean/FindMonitorDeadlock.java b/test/java/lang/management/ThreadMXBean/FindMonitorDeadlock.java index 06c55c43cbcdb355b73bcb8ce6f81c7937295573..7381bc002ed2548bff5e6bfad511e6243563f690 100644 --- a/test/java/lang/management/ThreadMXBean/FindMonitorDeadlock.java +++ b/test/java/lang/management/ThreadMXBean/FindMonitorDeadlock.java @@ -30,7 +30,7 @@ * * @build MonitorDeadlock * @build ThreadDump - * @run main FindMonitorDeadlock + * @run main/othervm FindMonitorDeadlock */ import java.lang.management.*; diff --git a/test/java/lang/management/ThreadMXBean/Locks.java b/test/java/lang/management/ThreadMXBean/Locks.java index 28a4027137e09059e0710eef5a6acde806186817..1541a0865e6490f30e06b652e340f6f7352ba7cb 100644 --- a/test/java/lang/management/ThreadMXBean/Locks.java +++ b/test/java/lang/management/ThreadMXBean/Locks.java @@ -29,7 +29,7 @@ * @author Mandy Chung * * @build ThreadExecutionSynchronizer - * @run main Locks + * @run main/othervm Locks */ import java.lang.management.*; diff --git a/test/java/lang/reflect/Proxy/Boxing.java b/test/java/lang/reflect/Proxy/Boxing.java index a32a6f7341e4dd88918091912ed678d4b5ba4044..2c4c2455021e68a6faa512711aa70de6b2130aab 100644 --- a/test/java/lang/reflect/Proxy/Boxing.java +++ b/test/java/lang/reflect/Proxy/Boxing.java @@ -71,8 +71,8 @@ public class Boxing { Random random = new Random(42); // ensure consistent test domain Test proxy = (Test) Proxy.newProxyInstance( - ClassLoader.getSystemClassLoader(), - new Class[] { Test.class }, + Test.class.getClassLoader(), + new Class[] { Test.class }, new TestHandler()); for (int rep = 0; rep < REPS; rep++) { diff --git a/test/java/lang/reflect/Proxy/ClassRestrictions.java b/test/java/lang/reflect/Proxy/ClassRestrictions.java index 905e351838915b53d8fbbe6ebb1c5da06ecbced2..6c35d75e9f9b39c044347df1ee23bc25e7f91d3a 100644 --- a/test/java/lang/reflect/Proxy/ClassRestrictions.java +++ b/test/java/lang/reflect/Proxy/ClassRestrictions.java @@ -54,16 +54,16 @@ public class ClassRestrictions { "\nTest of restrictions on parameters to Proxy.getProxyClass\n"); try { - ClassLoader loader = ClassLoader.getSystemClassLoader(); - Class[] interfaces; - Class proxyClass; + ClassLoader loader = ClassRestrictions.class.getClassLoader(); + Class[] interfaces; + Class proxyClass; /* * All of the Class objects in the interfaces array must represent * interfaces, not classes or primitive types. */ try { - interfaces = new Class[] { Object.class }; + interfaces = new Class[] { Object.class }; proxyClass = Proxy.getProxyClass(loader, interfaces); throw new RuntimeException( "proxy class created with java.lang.Object as interface"); @@ -73,7 +73,7 @@ public class ClassRestrictions { // assume exception is for intended failure } try { - interfaces = new Class[] { Integer.TYPE }; + interfaces = new Class[] { Integer.TYPE }; proxyClass = Proxy.getProxyClass(loader, interfaces); throw new RuntimeException( "proxy class created with int.class as interface"); @@ -88,7 +88,7 @@ public class ClassRestrictions { * Class objects. */ try { - interfaces = new Class[] { Bar.class, Bar.class }; + interfaces = new Class[] { Bar.class, Bar.class }; proxyClass = Proxy.getProxyClass(loader, interfaces); throw new RuntimeException( "proxy class created with repeated interfaces"); @@ -107,7 +107,7 @@ public class ClassRestrictions { Class altBarClass; altBarClass = Class.forName(Bar.class.getName(), false, altLoader); try { - interfaces = new Class[] { altBarClass }; + interfaces = new Class[] { altBarClass }; proxyClass = Proxy.getProxyClass(loader, interfaces); throw new RuntimeException( "proxy class created with interface " + @@ -121,8 +121,8 @@ public class ClassRestrictions { /* * All non-public interfaces must be in the same package. */ - Class nonPublic1 = Bashful.class; - Class nonPublic2 = null; + Class nonPublic1 = Bashful.class; + Class nonPublic2 = null; String[] nonPublicInterfaces = new String[] { "java.awt.Conditional", "java.util.zip.ZipConstants", @@ -147,7 +147,7 @@ public class ClassRestrictions { "no second non-public interface found for test"); } try { - interfaces = new Class[] { nonPublic1, nonPublic2 }; + interfaces = new Class[] { nonPublic1, nonPublic2 }; proxyClass = Proxy.getProxyClass(loader, interfaces); throw new RuntimeException( "proxy class created with two non-public interfaces " + @@ -163,7 +163,7 @@ public class ClassRestrictions { * parameter signature but different return type. */ try { - interfaces = new Class[] { Bar.class, Baz.class }; + interfaces = new Class[] { Bar.class, Baz.class }; proxyClass = Proxy.getProxyClass(loader, interfaces); throw new RuntimeException( "proxy class created with conflicting methods"); diff --git a/test/java/lang/reflect/Proxy/returnTypes/Test.java b/test/java/lang/reflect/Proxy/returnTypes/Test.java index d775840db4131ddf206306fdf9df40413e4f4a7e..754e965bb0da4b10237d61e1077f6d4b37be3f07 100644 --- a/test/java/lang/reflect/Proxy/returnTypes/Test.java +++ b/test/java/lang/reflect/Proxy/returnTypes/Test.java @@ -42,7 +42,7 @@ public class Test { // additional test cases may be added to both of these lists: - private static final Class[][] GOOD = { + private static final Class[][] GOOD = { { Collection.class }, { Iterable.class, Collection.class }, { Iterable.class, Collection.class, List.class }, @@ -51,7 +51,7 @@ public class Test { GetArray.class } }; - private static final Class[][] BAD = { + private static final Class[][] BAD = { { Runnable.class, PrivilegedAction.class }, { GetSerializable.class, GetCloneable.class }, { GetObject.class, GetSerializable.class, GetCloneable.class } @@ -60,12 +60,12 @@ public class Test { public static void main(String[] args) throws Exception { System.err.println("\nRegression test for bug 4838310\n"); - ClassLoader loader = ClassLoader.getSystemClassLoader(); + ClassLoader loader = Test.class.getClassLoader(); System.err.println("Testing GOOD combinations:"); for (int i = 0; i < GOOD.length; i++) { - Class[] interfaces = GOOD[i]; + Class[] interfaces = GOOD[i]; System.err.println(Arrays.asList(interfaces)); Proxy.getProxyClass(loader, interfaces); System.err.println("--- OK."); @@ -74,7 +74,7 @@ public class Test { System.err.println("Testing BAD combinations:"); for (int i = 0; i < BAD.length; i++) { - Class[] interfaces = BAD[i]; + Class[] interfaces = BAD[i]; System.err.println(Arrays.asList(interfaces)); try { Proxy.getProxyClass(loader, interfaces); diff --git a/test/java/net/ResponseCache/file1.cache b/test/java/net/ResponseCache/file1.cache index 004b1e4074934d22b828203660e3843eca5ff23e..b00b0978714870576f7dbb15c96eca6edc1dc2d4 100644 Binary files a/test/java/net/ResponseCache/file1.cache and b/test/java/net/ResponseCache/file1.cache differ diff --git a/test/java/nio/channels/AsyncCloseAndInterrupt.java b/test/java/nio/channels/AsyncCloseAndInterrupt.java index a18a936cca621e6e474aeddf55503c4e252dcd9a..b0fb0cfa351704157ec8bbdc9daa503628859eae 100644 --- a/test/java/nio/channels/AsyncCloseAndInterrupt.java +++ b/test/java/nio/channels/AsyncCloseAndInterrupt.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4460583 4470470 4840199 6419424 6710579 6596323 6824135 + * @bug 4460583 4470470 4840199 6419424 6710579 6596323 6824135 6395224 * @summary Comprehensive test of asynchronous closing and interruption * @author Mark Reinhold */ @@ -88,6 +88,9 @@ public class AsyncCloseAndInterrupt { } private static void pumpRefuser(String msg) throws IOException { + // Can't reliably saturate connection backlog on Windows Server editions + assert !TestUtil.onWindows(); + log.print(msg); int n = refuserClients.size(); @@ -203,9 +206,9 @@ public class AsyncCloseAndInterrupt { = new ChannelFactory("DatagramChannel") { InterruptibleChannel create() throws IOException { DatagramChannel dc = DatagramChannel.open(); - dc.socket().bind(wildcardAddress); - InetAddress ia = InetAddress.getByName("127.0.0.1"); - dc.connect(new InetSocketAddress(ia, 80)); + InetAddress lb = InetAddress.getByName("127.0.0.1"); + dc.bind(new InetSocketAddress(lb, 0)); + dc.connect(new InetSocketAddress(lb, 80)); return dc; } }; @@ -636,7 +639,8 @@ public class AsyncCloseAndInterrupt { wildcardAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0); initAcceptor(); - initRefuser(); + if (!TestUtil.onWindows()) + initRefuser(); initPipes(); initFile(); @@ -658,8 +662,15 @@ public class AsyncCloseAndInterrupt { // unclear under what conditions mmap(2) will actually block. test(connectedSocketChannelFactory); - test(socketChannelFactory, CONNECT); - test(socketChannelFactory, FINISH_CONNECT); + + if (TestUtil.onWindows()) { + log.println("WARNING Cannot reliably test connect/finishConnect" + + " operations on Windows"); + } else { + test(socketChannelFactory, CONNECT); + test(socketChannelFactory, FINISH_CONNECT); + } + test(serverSocketChannelFactory, ACCEPT); test(datagramChannelFactory); test(pipeSourceChannelFactory); diff --git a/test/java/nio/channels/AsynchronousSocketChannel/Basic.java b/test/java/nio/channels/AsynchronousSocketChannel/Basic.java index 7fbe8f6921e40b24a2d2591fd0d731bf80b7a9f2..f9755de04f3c3eada3b6feaaf3782b9d3a2773b2 100644 --- a/test/java/nio/channels/AsynchronousSocketChannel/Basic.java +++ b/test/java/nio/channels/AsynchronousSocketChannel/Basic.java @@ -196,18 +196,16 @@ public class Basic { System.out.println("-- connect to non-existent host --"); - // test failure - InetAddress badHost = InetAddress.getByName("1.2.3.4"); - if (!badHost.isReachable(10*1000)) { - - ch = AsynchronousSocketChannel.open(); - try { - ch.connect(new InetSocketAddress(badHost, 9876)).get(); - throw new RuntimeException("Connection should not be established"); - } catch (ExecutionException x) { - } + // test that failure to connect closes the channel + ch = AsynchronousSocketChannel.open(); + try { + ch.connect(genSocketAddress()).get(); + } catch (ExecutionException x) { + // failed to establish connection if (ch.isOpen()) throw new RuntimeException("Channel should be closed"); + } finally { + ch.close(); } server.close(); @@ -219,27 +217,22 @@ public class Basic { AsynchronousSocketChannel ch; // asynchronous close while connecting - InetAddress rh = InetAddress.getByName("1.2.3.4"); - if (!rh.isReachable(3000)) { - InetSocketAddress isa = new InetSocketAddress(rh, 1234); - - ch = AsynchronousSocketChannel.open(); - Future result = ch.connect(isa); + ch = AsynchronousSocketChannel.open(); + Future connectResult = ch.connect(genSocketAddress()); - // give time to initiate the connect (SYN) - Thread.sleep(50); + // give time to initiate the connect (SYN) + Thread.sleep(50); - // close - ch.close(); + // close + ch.close(); - // check that AsynchronousCloseException is thrown - try { - result.get(); - throw new RuntimeException("Should not connect"); - } catch (ExecutionException x) { - if (!(x.getCause() instanceof AsynchronousCloseException)) - throw new RuntimeException(x); - } + // check that exception is thrown in timely manner + try { + connectResult.get(5, TimeUnit.SECONDS); + } catch (TimeoutException x) { + throw new RuntimeException("AsynchronousCloseException not thrown"); + } catch (ExecutionException x) { + // expected } System.out.println("-- asynchronous close when reading --"); @@ -785,30 +778,47 @@ public class Basic { ch.close(); } - // returns ByteBuffer with random bytes - static ByteBuffer genBuffer() { - int size = 1024 + rand.nextInt(16000); - byte[] buf = new byte[size]; - rand.nextBytes(buf); - boolean useDirect = rand.nextBoolean(); - if (useDirect) { - ByteBuffer bb = ByteBuffer.allocateDirect(buf.length); - bb.put(buf); - bb.flip(); - return bb; - } else { - return ByteBuffer.wrap(buf); - } - } - - // return ByteBuffer[] with random bytes - static ByteBuffer[] genBuffers(int max) { - int len = 1; - if (max > 1) - len += rand.nextInt(max); - ByteBuffer[] bufs = new ByteBuffer[len]; - for (int i=0; i 1) + len += rand.nextInt(max); + ByteBuffer[] bufs = new ByteBuffer[len]; + for (int i=0; i 0) { + throw new RuntimeException("Unexpected wakeup"); + } + + /* Test 2: connected so ICMP port unreachable may be received */ + dc.connect(refuser); + try { + sendDatagram(dc, refuser); + n = sel.select(2000); + if (n > 0) { + sel.selectedKeys().clear(); + try { + n = dc.read(ByteBuffer.allocate(100)); + throw new RuntimeException("Unexpected datagram received"); + } catch (PortUnreachableException pue) { + // expected + } + } + } finally { + dc.disconnect(); + } + + /* Test 3: not connected so ICMP port unreachable should not be received */ + sendDatagram(dc, refuser); + n = sel.select(2000); + if (n > 0) { + throw new RuntimeException("Unexpected wakeup after disconnect"); + } + + } finally { + dc.close(); + } + } + + static void sendDatagram(DatagramChannel dc, SocketAddress remote) + throws IOException + { + ByteBuffer bb = ByteBuffer.wrap("Greetings!".getBytes()); + dc.send(bb, remote); + } +} diff --git a/test/java/nio/channels/DatagramChannel/Sender.java b/test/java/nio/channels/DatagramChannel/Sender.java index 58d4a4af1059a18c4754438fff985337830cf56f..60336f54fe788ebc3d1b668043596846fa4bd2bd 100644 --- a/test/java/nio/channels/DatagramChannel/Sender.java +++ b/test/java/nio/channels/DatagramChannel/Sender.java @@ -42,13 +42,11 @@ public class Sender { } static void test() throws Exception { - Sprintable server = new Server(); - Sprintable client = new Client(); + Server server = new Server(); + Client client = new Client(server.port()); Thread serverThread = new Thread(server); serverThread.start(); - while (!server.ready()) - Thread.sleep(50); Thread clientThread = new Thread(client); clientThread.start(); @@ -60,23 +58,17 @@ public class Sender { client.throwException(); } - public interface Sprintable extends Runnable { - public void throwException() throws Exception; - public boolean ready(); - } - - public static class Client implements Sprintable { + public static class Client implements Runnable { + final int port; Exception e = null; - public void throwException() throws Exception { - if (e != null) - throw e; + Client(int port) { + this.port = port; } - private volatile boolean ready = false; - - public boolean ready() { - return ready; + void throwException() throws Exception { + if (e != null) + throw e; } public void run() { @@ -87,7 +79,7 @@ public class Sender { bb.putInt(1).putLong(1); bb.flip(); InetAddress address = InetAddress.getLocalHost(); - InetSocketAddress isa = new InetSocketAddress(address, 8888); + InetSocketAddress isa = new InetSocketAddress(address, port); dc.connect(isa); dc.write(bb); } catch (Exception ex) { @@ -96,17 +88,21 @@ public class Sender { } } - public static class Server implements Sprintable { + public static class Server implements Runnable { + final DatagramChannel dc; Exception e = null; - private volatile boolean ready = false; - public void throwException() throws Exception { - if (e != null) - throw e; + Server() throws IOException { + dc = DatagramChannel.open().bind(new InetSocketAddress(0)); + } + + int port() { + return dc.socket().getLocalPort(); } - public boolean ready() { - return ready; + void throwException() throws Exception { + if (e != null) + throw e; } void showBuffer(String s, ByteBuffer bb) { @@ -123,13 +119,10 @@ public class Sender { SocketAddress sa = null; try { - DatagramChannel dc = DatagramChannel.open(); - dc.socket().bind(new InetSocketAddress(8888)); - dc.configureBlocking(false); - ready = true; ByteBuffer bb = ByteBuffer.allocateDirect(12); bb.clear(); // Get the one valid datagram + dc.configureBlocking(false); while (sa == null) sa = dc.receive(bb); sa = null; diff --git a/test/java/nio/channels/Selector/ByteServer.java b/test/java/nio/channels/Selector/ByteServer.java index 9cb7f9670bbd1a4d7d0ae3a5dbfd50474670b908..53ab51f0ae7f3efd318cc69d063a97b14063d2b2 100644 --- a/test/java/nio/channels/Selector/ByteServer.java +++ b/test/java/nio/channels/Selector/ByteServer.java @@ -33,7 +33,6 @@ import java.net.ServerSocket; public class ByteServer { - public static final int PORT = 31415; public static final String LOCALHOST = "localhost"; private int bytecount; private Socket socket; @@ -43,7 +42,11 @@ public class ByteServer { public ByteServer(int bytecount) throws Exception{ this.bytecount = bytecount; - serversocket = new ServerSocket(PORT); + serversocket = new ServerSocket(0); + } + + public int port() { + return serversocket.getLocalPort(); } public void start() { diff --git a/test/java/nio/channels/Selector/CloseThenRegister.java b/test/java/nio/channels/Selector/CloseThenRegister.java index 03deaf4d8137dba03592b7ecf7c462b534b0f630..99192ea0cc1de5a12ae99eacf4f2e938b5eac843 100644 --- a/test/java/nio/channels/Selector/CloseThenRegister.java +++ b/test/java/nio/channels/Selector/CloseThenRegister.java @@ -32,17 +32,19 @@ import java.nio.channels.*; public class CloseThenRegister { public static void main (String [] args) throws Exception { + Selector sel = Selector.open(); + sel.close(); + ServerSocketChannel ssc = ServerSocketChannel.open(); try { - Selector s = Selector.open(); - s.close(); - ServerSocketChannel c = ServerSocketChannel.open(); - c.socket().bind(new InetSocketAddress(40000)); - c.configureBlocking(false); - c.register(s, SelectionKey.OP_ACCEPT); + ssc.bind(new InetSocketAddress(0)); + ssc.configureBlocking(false); + ssc.register(sel, SelectionKey.OP_ACCEPT); + throw new RuntimeException("register after close does not cause CSE!"); } catch (ClosedSelectorException cse) { - return; + // expected + } finally { + ssc.close(); } - throw new RuntimeException("register after close does not cause CSE!"); } } diff --git a/test/java/nio/channels/Selector/OpRead.java b/test/java/nio/channels/Selector/OpRead.java index 54a978ef2b23faaad250816b75e2144f1e631dac..b77feafeea372c169f7fa31d671c881d6129657d 100644 --- a/test/java/nio/channels/Selector/OpRead.java +++ b/test/java/nio/channels/Selector/OpRead.java @@ -24,59 +24,63 @@ /* @test * @bug 4755720 * @summary Test if OP_READ is detected with OP_WRITE in interestOps - * @library .. */ import java.net.*; -import java.io.*; import java.nio.*; import java.nio.channels.*; -import java.nio.channels.spi.SelectorProvider; import java.util.*; public class OpRead { - static final int DAYTIME_PORT = 13; - static final String DAYTIME_HOST = TestUtil.HOST; - static void test() throws Exception { - InetSocketAddress isa - = new InetSocketAddress(InetAddress.getByName(DAYTIME_HOST), - DAYTIME_PORT); - SocketChannel sc = SocketChannel.open(); + ServerSocketChannel ssc = null; + SocketChannel sc = null; + SocketChannel peer = null; + try { + ssc = ServerSocketChannel.open().bind(new InetSocketAddress(0)); - sc.connect(isa); + // loopback connection + InetAddress lh = InetAddress.getLocalHost(); + sc = SocketChannel.open(new InetSocketAddress(lh, ssc.socket().getLocalPort())); + peer = ssc.accept(); - sc.configureBlocking(false); + // peer sends message so that "sc" will be readable + int n = peer.write(ByteBuffer.wrap("Hello".getBytes())); + assert n > 0; - Selector selector = SelectorProvider.provider().openSelector(); - SelectionKey key = sc.register(selector, SelectionKey.OP_READ | - SelectionKey.OP_WRITE); + sc.configureBlocking(false); - boolean done = false; - int failCount = 0; - while (!done) { - if (selector.select() > 0) { - Set keys = selector.selectedKeys(); - Iterator iterator = keys.iterator(); - while (iterator.hasNext()) { - key = (SelectionKey)iterator.next(); - iterator.remove(); - if (key.isWritable()) { - failCount++; - if (failCount > 10) - throw new RuntimeException("Test failed"); - Thread.sleep(100); - } - if (key.isReadable()) { - done = true; + Selector selector = Selector.open(); + SelectionKey key = sc.register(selector, SelectionKey.OP_READ | + SelectionKey.OP_WRITE); + + boolean done = false; + int failCount = 0; + while (!done) { + if (selector.select() > 0) { + Set keys = selector.selectedKeys(); + Iterator iterator = keys.iterator(); + while (iterator.hasNext()) { + key = iterator.next(); + iterator.remove(); + if (key.isWritable()) { + failCount++; + if (failCount > 10) + throw new RuntimeException("Test failed"); + Thread.sleep(250); + } + if (key.isReadable()) { + done = true; + } } } } + } finally { + if (peer != null) peer.close(); + if (sc != null) sc.close(); + if (ssc != null) ssc.close(); } - - - sc.close(); } public static void main(String[] args) throws Exception { diff --git a/test/java/nio/channels/Selector/ReadAfterConnect.java b/test/java/nio/channels/Selector/ReadAfterConnect.java index 678a33af96f2db7955264865d772e56b645da69e..136778f4ac4d9fd8f0095d9ce1a23046cf81cfb8 100644 --- a/test/java/nio/channels/Selector/ReadAfterConnect.java +++ b/test/java/nio/channels/Selector/ReadAfterConnect.java @@ -37,7 +37,7 @@ public class ReadAfterConnect { ByteServer server = new ByteServer(0); // server: accept connection and do nothing server.start(); InetSocketAddress isa = new InetSocketAddress( - InetAddress.getByName(ByteServer.LOCALHOST), ByteServer.PORT); + InetAddress.getByName(ByteServer.LOCALHOST), server.port()); Selector sel = Selector.open(); SocketChannel sc = SocketChannel.open(); sc.connect(isa); diff --git a/test/java/nio/channels/Selector/SelectAfterRead.java b/test/java/nio/channels/Selector/SelectAfterRead.java index 97421310615737531886c09560bb5cee4b4a6c55..d4b2bf1eaf73e97767261f35132fc19cb00c57fa 100644 --- a/test/java/nio/channels/Selector/SelectAfterRead.java +++ b/test/java/nio/channels/Selector/SelectAfterRead.java @@ -37,14 +37,14 @@ public class SelectAfterRead { final static int TIMEOUT = 1000; public static void main(String[] argv) throws Exception { + InetAddress lh = InetAddress.getByName(ByteServer.LOCALHOST); + // server: accept connection and write one byte ByteServer server = new ByteServer(1); server.start(); - InetSocketAddress isa = new InetSocketAddress( - InetAddress.getByName(ByteServer.LOCALHOST), ByteServer.PORT); Selector sel = Selector.open(); SocketChannel sc = SocketChannel.open(); - sc.connect(isa); + sc.connect(new InetSocketAddress(lh, server.port())); sc.read(ByteBuffer.allocate(1)); sc.configureBlocking(false); sc.register(sel, SelectionKey.OP_READ); @@ -61,7 +61,7 @@ public class SelectAfterRead { server = new ByteServer(2); server.start(); sc = SocketChannel.open(); - sc.connect(isa); + sc.connect(new InetSocketAddress(lh, server.port())); sc.configureBlocking(false); sel = Selector.open(); sc.register(sel, SelectionKey.OP_READ); diff --git a/test/java/nio/channels/Selector/SelectWrite.java b/test/java/nio/channels/Selector/SelectWrite.java index 5b15dab7bf41cdbd80693f2f8260d694e55260f8..8f18c7e0a74cd682385db7e260be9dd1929f1052 100644 --- a/test/java/nio/channels/Selector/SelectWrite.java +++ b/test/java/nio/channels/Selector/SelectWrite.java @@ -39,7 +39,7 @@ public class SelectWrite { // server: accept connection and do nothing server.start(); InetSocketAddress isa = new InetSocketAddress( - InetAddress.getByName(ByteServer.LOCALHOST), ByteServer.PORT); + InetAddress.getByName(ByteServer.LOCALHOST), server.port()); Selector sel = Selector.open(); SocketChannel sc = SocketChannel.open(); sc.connect(isa); diff --git a/test/java/nio/channels/SocketChannel/BigReadWrite.java b/test/java/nio/channels/SocketChannel/BigReadWrite.java index 8a41665366f744715c058298c06187de2fd68f39..bd2ed2931c2043f859bf0bc651529527bada9dae 100644 --- a/test/java/nio/channels/SocketChannel/BigReadWrite.java +++ b/test/java/nio/channels/SocketChannel/BigReadWrite.java @@ -32,7 +32,6 @@ import java.nio.channels.*; public class BigReadWrite { - static int port = 40170; static int testSize = 15; public static void main(String[] args) throws Exception { diff --git a/test/java/nio/channels/SocketChannel/OpenLeak.java b/test/java/nio/channels/SocketChannel/OpenLeak.java index 9e9e6f1d08ff8630f5484f9f35b25e487a570728..ab5dfde6922d93b233fea47271b6e998c4569c9e 100644 --- a/test/java/nio/channels/SocketChannel/OpenLeak.java +++ b/test/java/nio/channels/SocketChannel/OpenLeak.java @@ -25,6 +25,8 @@ * @bug 6548464 * @summary SocketChannel.open(SocketAddress) leaks file descriptor if * connection cannot be established + * @build OpenLeak + * @run main/othervm OpenLeak */ import java.net.InetAddress; diff --git a/test/java/nio/channels/SocketChannel/VectorIO.java b/test/java/nio/channels/SocketChannel/VectorIO.java index 67840bed0470fe57693bd7d416df2845b0d5f533..0dfd2d66f8a0a418bad2ff9e2f53da3899944ae0 100644 --- a/test/java/nio/channels/SocketChannel/VectorIO.java +++ b/test/java/nio/channels/SocketChannel/VectorIO.java @@ -36,8 +36,6 @@ import sun.misc.*; public class VectorIO { - static int port = 40170; - static Random generator = new Random(); static int testSize; @@ -55,20 +53,12 @@ public class VectorIO { System.err.println("Length " + testSize); Server sv = new Server(testSize); sv.start(); - do { - try { - Thread.currentThread().sleep(200); - } catch (InterruptedException x) { - if (sv.finish(8000) == 0) - throw new Exception("Failed: Error in server thread"); - } - } while (!sv.ready); - bufferTest(); + bufferTest(sv.port()); if (sv.finish(8000) == 0) throw new Exception("Failed: Length = " + testSize); } - static void bufferTest() throws Exception { + static void bufferTest(int port) throws Exception { ByteBuffer[] bufs = new ByteBuffer[testSize]; for(int i=0; i initialLoggerNames = new ArrayList(); public static void main(String args[]) throws Exception { + // cache the initial set of loggers before this test begins + // to add any loggers + Enumeration e = logMgr.getLoggerNames(); + List defaultLoggers = getDefaultLoggerNames(); + while (e.hasMoreElements()) { + String logger = e.nextElement(); + if (!defaultLoggers.contains(logger)) { + initialLoggerNames.add(logger); + } + }; + String tstSrc = System.getProperty(TST_SRC_PROP); File fname = new File(tstSrc, LM_PROP_FNAME); String prop = fname.getCanonicalPath(); @@ -56,12 +68,12 @@ public class ParentLoggersTest { } } - public static Vector getDefaultLoggerNames() { - Vector expectedLoggerNames = new Vector(0); + public static List getDefaultLoggerNames() { + List expectedLoggerNames = new ArrayList(); // LogManager always creates two loggers: - expectedLoggerNames.addElement(""); // root logger: "" - expectedLoggerNames.addElement("global"); // global logger: "global" + expectedLoggerNames.add(""); // root logger: "" + expectedLoggerNames.add("global"); // global logger: "global" return expectedLoggerNames; } @@ -71,7 +83,7 @@ public class ParentLoggersTest { */ public static boolean checkLoggers() { String failMsg = "# checkLoggers: getLoggerNames() returned unexpected loggers"; - Vector expectedLoggerNames = getDefaultLoggerNames(); + Vector expectedLoggerNames = new Vector(getDefaultLoggerNames()); // Create the logger LOGGER_NAME_1 Logger logger1 = Logger.getLogger(LOGGER_NAME_1); @@ -83,18 +95,23 @@ public class ParentLoggersTest { expectedLoggerNames.addElement(PARENT_NAME_2); expectedLoggerNames.addElement(LOGGER_NAME_2); - Enumeration returnedLoggersEnum = logMgr.getLoggerNames(); - Vector returnedLoggerNames = new Vector(0); + Enumeration returnedLoggersEnum = logMgr.getLoggerNames(); + Vector returnedLoggerNames = new Vector(0); while (returnedLoggersEnum.hasMoreElements()) { - returnedLoggerNames.addElement(returnedLoggersEnum.nextElement()); + String logger = returnedLoggersEnum.nextElement(); + if (!initialLoggerNames.contains(logger)) { + // filter out the loggers that have been added before this test runs + returnedLoggerNames.addElement(logger); + } + }; return checkNames(expectedLoggerNames, returnedLoggerNames, failMsg); } // Returns boolean values: PASSED or FAILED - private static boolean checkNames(Vector expNames, - Vector retNames, + private static boolean checkNames(Vector expNames, + Vector retNames, String failMsg) { boolean status = PASSED; @@ -123,8 +140,8 @@ public class ParentLoggersTest { return status; } - private static void printFailMsg(Vector expNames, - Vector retNames, + private static void printFailMsg(Vector expNames, + Vector retNames, String failMsg) { out.println(); out.println(failMsg); diff --git a/test/java/util/zip/InfoZip.java b/test/java/util/zip/InfoZip.java index 86249b136ee7e0782401403c78bbe53727ca0679..aea1d32dcdf27a104a5a6766e0998e90259960d3 100644 --- a/test/java/util/zip/InfoZip.java +++ b/test/java/util/zip/InfoZip.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2010, 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 @@ -103,19 +103,25 @@ public class InfoZip { os.close(); ZipFile zf = new ZipFile(f); - Enumeration entries = zf.entries(); - ZipEntry ze = entries.nextElement(); - check(! entries.hasMoreElements()); - checkZipEntry(ze, contents(zf, ze)); - zf.close(); + ZipEntry ze = null; + try { + Enumeration entries = zf.entries(); + ze = entries.nextElement(); + check(! entries.hasMoreElements()); + checkZipEntry(ze, contents(zf, ze)); + } finally { + zf.close(); + } ZipInputStream is = new ZipInputStream(new FileInputStream(f)); - ze = is.getNextEntry(); - checkZipEntry(ze, contents(is)); - check(is.getNextEntry() == null); - + try { + ze = is.getNextEntry(); + checkZipEntry(ze, contents(is)); + check(is.getNextEntry() == null); + } finally { + is.close(); + } f.delete(); - System.out.printf("passed = %d, failed = %d%n", passed, failed); if (failed > 0) throw new Exception("Some tests failed"); } diff --git a/test/java/util/zip/ZipFile/Comment.java b/test/java/util/zip/ZipFile/Comment.java index db45dc876495f404e3e7085a6897a1d56daf7a64..d48cef20856f40f4e9bed21208737a169094675a 100644 --- a/test/java/util/zip/ZipFile/Comment.java +++ b/test/java/util/zip/ZipFile/Comment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2010, 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 @@ -58,13 +58,16 @@ public class Comment { throws IOException { ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(name)); - zos.setComment(comment); - ZipEntry ze = new ZipEntry(entryName); - ze.setMethod(ZipEntry.DEFLATED); - zos.putNextEntry(ze); - new DataOutputStream(zos).writeUTF(entryContents); - zos.closeEntry(); - zos.close(); + try { + zos.setComment(comment); + ZipEntry ze = new ZipEntry(entryName); + ze.setMethod(ZipEntry.DEFLATED); + zos.putNextEntry(ze); + new DataOutputStream(zos).writeUTF(entryContents); + zos.closeEntry(); + } finally { + zos.close(); + } } private static void verifyZipFile(String name, String comment) @@ -91,6 +94,8 @@ public class Comment { file.seek(file.length() - comment.length()); byte [] bytes = new byte [comment.length()]; file.readFully(bytes); + zipFile.close(); + file.close(); if (! comment.equals(new String(bytes, "UTF8"))) throw new Exception("Zip file comment corrupted"); } diff --git a/test/java/util/zip/ZipFile/CorruptedZipFiles.java b/test/java/util/zip/ZipFile/CorruptedZipFiles.java index 55c102bdd4ee86efe9df0a35cf2f99d5e86583e3..a53fdbee9e9f4a08ac25ab83ca254f91936bae86 100644 --- a/test/java/util/zip/ZipFile/CorruptedZipFiles.java +++ b/test/java/util/zip/ZipFile/CorruptedZipFiles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2010, 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 @@ -47,13 +47,14 @@ public class CorruptedZipFiles { } public static void main(String[] args) throws Exception { - ZipOutputStream zos = new ZipOutputStream( - new FileOutputStream("x.zip")); - ZipEntry e = new ZipEntry("x"); - zos.putNextEntry(e); - zos.write((int)'x'); - zos.close(); - zos = null; + ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("x.zip")); + try { + ZipEntry e = new ZipEntry("x"); + zos.putNextEntry(e); + zos.write((int)'x'); + } finally { + zos.close(); + } int len = (int)(new File("x.zip").length()); byte[] good = new byte[len]; @@ -153,12 +154,15 @@ public class CorruptedZipFiles { fos.write(data); fos.close(); ZipFile zf = new ZipFile(zipName); - if (getInputStream) { - InputStream is = zf.getInputStream(new ZipEntry("x")); - is.read(); + try { + if (getInputStream) { + InputStream is = zf.getInputStream(new ZipEntry("x")); + is.read(); + } + } finally { + zf.close(); } fail("Failed to throw expected ZipException"); - zf.close(); } catch (ZipException e) { if (e.getMessage().matches(msgPattern)) passed++; diff --git a/test/java/util/zip/ZipFile/ManyEntries.java b/test/java/util/zip/ZipFile/ManyEntries.java index cbd11f53f0c480e7c96c1d26a465a4a11c41062b..4d36e7ac6217cb49a07415afaa903b5b3bfc1a98 100644 --- a/test/java/util/zip/ZipFile/ManyEntries.java +++ b/test/java/util/zip/ZipFile/ManyEntries.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2010, 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 @@ -55,52 +55,58 @@ public class ManyEntries { File zipFile = new File(++uniquifier + ".zip"); try { zipFile.delete(); - ZipOutputStream zos = - new ZipOutputStream( - new BufferedOutputStream( - new FileOutputStream(zipFile))); - for (int i = 0; i < N; i++) { - ZipEntry e = new ZipEntry("DIR/"+i); - e.setMethod(method); - e.setTime(time); - if (method == ZipEntry.STORED) { - e.setSize(1); - crc32.reset(); - crc32.update((byte)i); - e.setCrc(crc32.getValue()); - } else { - e.setSize(0); - e.setCrc(0); + ZipOutputStream zos = new ZipOutputStream( + new BufferedOutputStream( + new FileOutputStream(zipFile))); + try { + for (int i = 0; i < N; i++) { + ZipEntry e = new ZipEntry("DIR/"+i); + e.setMethod(method); + e.setTime(time); + if (method == ZipEntry.STORED) { + e.setSize(1); + crc32.reset(); + crc32.update((byte)i); + e.setCrc(crc32.getValue()); + } else { + e.setSize(0); + e.setCrc(0); + } + zos.putNextEntry(e); + zos.write(i); } - zos.putNextEntry(e); - zos.write(i); + } finally { + zos.close(); + zos = null; } - zos.close(); - zos = null; - ZipFile zip = new ZipFile(zipFile); - if (! (zip.size() == N)) - throw new Exception("Bad ZipFile size: " + zip.size()); - Enumeration entries = zip.entries(); + ZipFile zip = zip = new ZipFile(zipFile); + try { + if (! (zip.size() == N)) + throw new Exception("Bad ZipFile size: " + zip.size()); + Enumeration entries = zip.entries(); - for (int i = 0; i < N; i++) { - if (i % 1000 == 0) {System.gc(); System.runFinalization();} - if (! (entries.hasMoreElements())) - throw new Exception("only " + i + " elements"); - ZipEntry e = (ZipEntry)entries.nextElement(); - if (! (e.getSize() == 1)) - throw new Exception("bad size: " + e.getSize()); - if (! (e.getName().equals("DIR/" + i))) - throw new Exception("bad name: " + i); - if (! (e.getMethod() == method)) - throw new Exception("getMethod="+e.getMethod()+", method=" + method); - if (! (e.getTime() == time)) - throw new Exception("getTime="+e.getTime()+", time=" + time); - if (! (zip.getInputStream(e).read() == (i & 0xff))) - throw new Exception("Bad file contents: " + i); + for (int i = 0; i < N; i++) { + if (i % 1000 == 0) {System.gc(); System.runFinalization();} + if (! (entries.hasMoreElements())) + throw new Exception("only " + i + " elements"); + ZipEntry e = (ZipEntry)entries.nextElement(); + if (! (e.getSize() == 1)) + throw new Exception("bad size: " + e.getSize()); + if (! (e.getName().equals("DIR/" + i))) + throw new Exception("bad name: " + i); + if (! (e.getMethod() == method)) + throw new Exception("getMethod="+e.getMethod()+", method=" + method); + if (! (e.getTime() == time)) + throw new Exception("getTime="+e.getTime()+", time=" + time); + if (! (zip.getInputStream(e).read() == (i & 0xff))) + throw new Exception("Bad file contents: " + i); + } + if (entries.hasMoreElements()) + throw new Exception("too many elements"); + } finally { + zip.close(); } - if (entries.hasMoreElements()) - throw new Exception("too many elements"); } finally { zipFile.delete(); diff --git a/test/sun/jvmstat/testlibrary/utils.sh b/test/sun/jvmstat/testlibrary/utils.sh index fc27e1c65098a04dbfc44494a342767279a64235..a2e4608dae1a4e9e0e18a2d0f73ee8fd980300b2 100644 --- a/test/sun/jvmstat/testlibrary/utils.sh +++ b/test/sun/jvmstat/testlibrary/utils.sh @@ -189,3 +189,37 @@ kill_proc_common() { echo "Error sending term signal to ${kpid}!" fi } + +# check to see if a port is free +checkPort() # port +{ + inuse=`netstat -a | egrep "\.$1"` + if [ "${inuse}" = "" ] ; then + echo "free" + else + echo "inuse" + fi +} + +# Get a free port, where port+1 is also free, return 0 when giving up +freePort() +{ + start=3000 + while [ ${start} -lt 3030 ] ; do + port1=`expr ${start} '+' $$ '%' 1000` + port2=`expr ${port1} '+' 1` + if [ "`checkPort ${port1}`" = "inuse" \ + -o "`checkPort ${port2}`" = "inuse" ] ; then + start=`expr ${start} '+' 1` + else + break + fi + done + if [ "`checkPort ${port1}`" = "inuse" \ + -o "`checkPort ${port2}`" = "inuse" ] ; then + port1="0" + fi + echo "${port1}" +} + + diff --git a/test/sun/security/krb5/auto/Context.java b/test/sun/security/krb5/auto/Context.java index 60fa61a3b2fd7222dc463ef4023e4b782c910e86..14ba827e35776903890724ddb010b7d3d0d91732 100644 --- a/test/sun/security/krb5/auto/Context.java +++ b/test/sun/security/krb5/auto/Context.java @@ -42,6 +42,7 @@ import org.ietf.jgss.Oid; import com.sun.security.jgss.ExtendedGSSContext; import com.sun.security.jgss.InquireType; import com.sun.security.jgss.AuthorizationDataEntry; +import java.io.File; /** * Context of a JGSS subject, encapsulating Subject and GSSContext. @@ -107,7 +108,8 @@ public class Context { * Logins with a username and a password, using Krb5LoginModule directly * @param storeKey true if key should be saved, used on acceptor side */ - public static Context fromUserPass(String user, char[] pass, boolean storeKey) throws Exception { + public static Context fromUserPass(String user, char[] pass, boolean storeKey) + throws Exception { Context out = new Context(); out.name = user; out.s = new Subject(); @@ -136,6 +138,33 @@ public class Context { return out; } + /** + * Logins with a username and a keytab, using Krb5LoginModule directly + * @param storeKey true if key should be saved, used on acceptor side + */ + public static Context fromUserKtab(String user, String ktab, boolean storeKey) + throws Exception { + Context out = new Context(); + out.name = user; + out.s = new Subject(); + Krb5LoginModule krb5 = new Krb5LoginModule(); + Map map = new HashMap(); + + map.put("doNotPrompt", "true"); + map.put("useTicketCache", "false"); + map.put("useKeyTab", "true"); + map.put("keyTab", ktab); + map.put("principal", user); + if (storeKey) { + map.put("storeKey", "true"); + } + + krb5.initialize(out.s, null, null, map); + krb5.login(); + krb5.commit(); + return out; + } + /** * Starts as a client * @param target communication peer diff --git a/test/sun/security/krb5/auto/KDC.java b/test/sun/security/krb5/auto/KDC.java index 9e4fe52018ed54050b686004506847f7e224e242..6aca26c7f4d8df37917fac37e05315dff030cece 100644 --- a/test/sun/security/krb5/auto/KDC.java +++ b/test/sun/security/krb5/auto/KDC.java @@ -35,6 +35,7 @@ import sun.net.spi.nameservice.NameServiceDescriptor; import sun.security.krb5.*; import sun.security.krb5.internal.*; import sun.security.krb5.internal.ccache.CredentialsCache; +import sun.security.krb5.internal.crypto.EType; import sun.security.krb5.internal.crypto.KeyUsage; import sun.security.krb5.internal.ktab.KeyTab; import sun.security.util.DerInputStream; @@ -153,6 +154,14 @@ public class KDC { * Whether pre-authentication is required. Default Boolean.TRUE */ PREAUTH_REQUIRED, + /** + * Only issue TGT in RC4 + */ + ONLY_RC4_TGT, + /** + * Only use RC4 in preauth, enc-type still using eTypes[0] + */ + ONLY_RC4_PREAUTH, }; static { @@ -743,13 +752,25 @@ public class KDC { Field f = KDCReqBody.class.getDeclaredField("eType"); f.setAccessible(true); eTypes = (int[])f.get(body); - if (eTypes.length < 2) { - throw new KrbException(Krb5.KDC_ERR_ETYPE_NOSUPP); - } int eType = eTypes[0]; EncryptionKey ckey = keyForUser(body.cname, eType, false); EncryptionKey skey = keyForUser(body.sname, eType, true); + + if (options.containsKey(KDC.Option.ONLY_RC4_TGT)) { + int tgtEType = EncryptedData.ETYPE_ARCFOUR_HMAC; + boolean found = false; + for (int i=0; i ctor = EncryptedData.class.getDeclaredConstructor(DerValue.class); ctor.setAccessible(true); EncryptedData data = ctor.newInstance(new DerValue(pas[0].getValue())); - data.decrypt(ckey, KeyUsage.KU_PA_ENC_TS); + EncryptionKey pakey = keyForUser(body.cname, data.getEType(), false); + data.decrypt(pakey, KeyUsage.KU_PA_ENC_TS); } catch (Exception e) { throw new KrbException(Krb5.KDC_ERR_PREAUTH_FAILED); } @@ -887,7 +909,11 @@ public class KDC { ke.returnCode() == Krb5.KDC_ERR_PREAUTH_FAILED) { PAData pa; - ETypeInfo2 ei2 = new ETypeInfo2(eTypes[0], null, null); + int epa = eTypes[0]; + if (options.containsKey(KDC.Option.ONLY_RC4_PREAUTH)) { + epa = EncryptedData.ETYPE_ARCFOUR_HMAC; + } + ETypeInfo2 ei2 = new ETypeInfo2(epa, null, null); DerOutputStream eid = new DerOutputStream(); eid.write(DerValue.tag_Sequence, ei2.asn1Encode()); @@ -906,7 +932,7 @@ public class KDC { } } if (allOld) { - ETypeInfo ei = new ETypeInfo(eTypes[0], null); + ETypeInfo ei = new ETypeInfo(epa, null); eid = new DerOutputStream(); eid.write(DerValue.tag_Sequence, ei.asn1Encode()); pa = new PAData(Krb5.PA_ETYPE_INFO, eid.toByteArray()); diff --git a/test/sun/security/krb5/auto/W83.java b/test/sun/security/krb5/auto/W83.java new file mode 100644 index 0000000000000000000000000000000000000000..a0951cad2893bf879129f7f94b3368f603323e04 --- /dev/null +++ b/test/sun/security/krb5/auto/W83.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2010, 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 6932525 6951366 6959292 + * @summary kerberos login failure on win2008 with AD set to win2000 compat mode + * and cannot login if session key and preauth does not use the same etype + */ +import com.sun.security.auth.module.Krb5LoginModule; +import java.io.File; +import sun.security.krb5.Config; +import sun.security.krb5.EncryptedData; +import sun.security.krb5.PrincipalName; +import sun.security.krb5.internal.crypto.EType; +import sun.security.krb5.internal.ktab.KeyTab; + +public class W83 { + public static void main(String[] args) throws Exception { + + W83 x = new W83(); + + // Cannot use OneKDC. kinit command cannot resolve + // hostname kdc.rabbit.hole + KDC kdc = new KDC(OneKDC.REALM, "127.0.0.1", 0, true); + kdc.addPrincipal(OneKDC.USER, OneKDC.PASS); + kdc.addPrincipalRandKey("krbtgt/" + OneKDC.REALM); + KDC.saveConfig(OneKDC.KRB5_CONF, kdc); + System.setProperty("java.security.krb5.conf", OneKDC.KRB5_CONF); + Config.refresh(); + + kdc.writeKtab(OneKDC.KTAB); + new File(OneKDC.KRB5_CONF).deleteOnExit(); + new File(OneKDC.KTAB).deleteOnExit(); + + KeyTab ktab = KeyTab.getInstance(OneKDC.KTAB); + for (int etype: EType.getBuiltInDefaults()) { + if (etype != EncryptedData.ETYPE_ARCFOUR_HMAC) { + ktab.deleteEntry(new PrincipalName(OneKDC.USER), etype); + } + } + ktab.save(); + + // For 6932525 and 6951366, make sure the etypes sent in 2nd AS-REQ + // is not restricted to that of preauth + kdc.setOption(KDC.Option.ONLY_RC4_TGT, true); + x.go(); + + // For 6959292, make sure that when etype for enc-part in 2nd AS-REQ + // is different from that of preauth, client can still decrypt it + kdc.setOption(KDC.Option.ONLY_RC4_PREAUTH, true); + x.go(); + } + + void go() throws Exception { + Krb5LoginModule krb5 = new Krb5LoginModule(); + StringBuffer error = new StringBuffer(); + try { + Context.fromUserPass(OneKDC.USER, OneKDC.PASS, false); + } catch (Exception e) { + error.append("Krb5LoginModule password login error\n"); + } + try { + Context.fromUserKtab(OneKDC.USER, OneKDC.KTAB, false); + } catch (Exception e) { + error.append("Krb5LoginModule keytab login error\n"); + } + try { + Class.forName("sun.security.krb5.internal.tools.Kinit"); + String cmd = System.getProperty("java.home") + + System.getProperty("file.separator") + + "bin" + + System.getProperty("file.separator") + + "kinit"; + + int p = execute( + cmd, + "-J-Djava.security.krb5.conf=" + OneKDC.KRB5_CONF, + "-c", "cache1", + OneKDC.USER, + new String(OneKDC.PASS)); + if (p != 0) { + error.append("kinit password login error\n"); + } + p = execute( + cmd, + "-J-Djava.security.krb5.conf=" + OneKDC.KRB5_CONF, + "-c", "cache2", + "-k", "-t", OneKDC.KTAB, + OneKDC.USER); + if (p != 0) { + error.append("kinit keytab login error\n"); + } + } catch (ClassNotFoundException cnfe) { + System.out.println("No kinit, test ignored."); + // Ignore, not on windows + } + if (error.length() != 0) { + throw new Exception(error.toString()); + } + } + + private static int execute(String... args) throws Exception { + for (String arg: args) { + System.out.printf("%s ", arg); + } + System.out.println(); + Process p = Runtime.getRuntime().exec(args); + return p.waitFor(); + } +} diff --git a/test/sun/security/validator/CertReplace.java b/test/sun/security/validator/CertReplace.java index e2a1a1bfe3723026579db8d90544a800432df357..e858cc7657c12bdbe97d62a29499ecd5a9786cd2 100644 --- a/test/sun/security/validator/CertReplace.java +++ b/test/sun/security/validator/CertReplace.java @@ -1,5 +1,5 @@ /* - * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010, 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 @@ -16,9 +16,9 @@ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * 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. */ /* @@ -37,25 +37,28 @@ import sun.security.validator.Validator; public class CertReplace { - private final static String cacerts = "certreplace.jks"; - private final static String certs = "certreplace.certs"; - + /** + * @param args {cacerts keystore, cert chain} + */ public static void main(String[] args) throws Exception { KeyStore ks = KeyStore.getInstance("JKS"); - ks.load(new FileInputStream(cacerts), "changeit".toCharArray()); + ks.load(new FileInputStream(args[0]), "changeit".toCharArray()); Validator v = Validator.getInstance (Validator.TYPE_PKIX, Validator.VAR_GENERIC, ks); - X509Certificate[] chain = createPath(); - System.out.println(Arrays.toString(v.validate(chain))); - + X509Certificate[] chain = createPath(args[1]); + System.out.println("Chain: "); + for (X509Certificate c: v.validate(chain)) { + System.out.println(" " + c.getSubjectX500Principal() + + " issued by " + c.getIssuerX500Principal()); + } } - public static X509Certificate[] createPath() throws Exception { + public static X509Certificate[] createPath(String chain) throws Exception { CertificateFactory cf = CertificateFactory.getInstance("X.509"); List list = new ArrayList(); for (Certificate c: cf.generateCertificates( - new FileInputStream(certs))) { + new FileInputStream(chain))) { list.add((X509Certificate)c); } return (X509Certificate[]) list.toArray(new X509Certificate[0]); diff --git a/test/sun/security/validator/certreplace.sh b/test/sun/security/validator/certreplace.sh index af5ed1c54087f6307f42676033a88142313e4683..16470a3994abf823d3bf4705960c07e57b82f4e1 100644 --- a/test/sun/security/validator/certreplace.sh +++ b/test/sun/security/validator/certreplace.sh @@ -1,5 +1,5 @@ # -# Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. +# Copyright (c) 2010, 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 @@ -16,9 +16,9 @@ # 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -# CA 95054 USA or visit www.sun.com if you need additional information or -# have any questions. +# 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 @@ -82,4 +82,4 @@ $KT -delete -alias user # 5. Build and run test $JAVAC -d . ${TESTSRC}${FS}CertReplace.java -$JAVA CertReplace +$JAVA CertReplace certreplace.jks certreplace.certs diff --git a/test/sun/security/validator/samedn.sh b/test/sun/security/validator/samedn.sh new file mode 100644 index 0000000000000000000000000000000000000000..9d5afd40a8e27090eeeb27677da46c6a475907b2 --- /dev/null +++ b/test/sun/security/validator/samedn.sh @@ -0,0 +1,82 @@ +# +# Copyright (c) 2010, 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 6958869 +# @summary regression: PKIXValidator fails when multiple trust anchors +# have same dn +# + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC="." +fi +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + Windows_* ) + FS="\\" + ;; + * ) + FS="/" + ;; +esac + +KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit \ + -keypass changeit -keystore samedn.jks" +JAVAC=$TESTJAVA${FS}bin${FS}javac +JAVA=$TESTJAVA${FS}bin${FS}java + +rm -rf samedn.jks 2> /dev/null + +# 1. Generate 3 aliases in a keystore: ca1, ca2, user. The CAs' startdate +# is set to one year ago so that they are expired now + +$KT -genkeypair -alias ca1 -dname CN=CA -keyalg rsa -sigalg md5withrsa -ext bc -startdate -1y +$KT -genkeypair -alias ca2 -dname CN=CA -keyalg rsa -sigalg sha1withrsa -ext bc -startdate -1y +$KT -genkeypair -alias user -dname CN=User -keyalg rsa + +# 2. Signing: ca -> user + +$KT -certreq -alias user | $KT -gencert -rfc -alias ca1 > samedn1.certs +$KT -certreq -alias user | $KT -gencert -rfc -alias ca2 > samedn2.certs + +# 3. Append the ca file + +$KT -export -rfc -alias ca1 >> samedn1.certs +$KT -export -rfc -alias ca2 >> samedn2.certs + +# 4. Remove user for cacerts + +$KT -delete -alias user + +# 5. Build and run test. Make sure the CA certs are ignored for validity check. +# Check both, one of them might be dropped out of map in old codes. + +$JAVAC -d . ${TESTSRC}${FS}CertReplace.java +$JAVA CertReplace samedn.jks samedn1.certs || exit 1 +$JAVA CertReplace samedn.jks samedn2.certs || exit 2 diff --git a/test/sun/tools/jps/jps-Vvml_2.sh b/test/sun/tools/jps/jps-Vvml_2.sh index 96f8678281becb6b3957cb38bdc69a4182b78346..83f9a05249adcc3747b5f0f5b2b4b7a836b8e72c 100644 --- a/test/sun/tools/jps/jps-Vvml_2.sh +++ b/test/sun/tools/jps/jps-Vvml_2.sh @@ -51,3 +51,9 @@ ${JAVA} -cp ${TESTCLASSES} Sleeper & SLEEPER_PID=$! ${JPS} -J-XX:Flags=${TESTSRC}/vmflags -Vvml | awk -f ${TESTSRC}/jps-Vvml_Output2.awk +RC=$? + +cleanup + +exit ${RC} + diff --git a/test/sun/tools/jps/jps-m_2.sh b/test/sun/tools/jps/jps-m_2.sh index 2846ff32d896889b4bd62f322046626bd6aadf31..afa0451804edd68b4e6fe65d84eaeecb2c2368bc 100644 --- a/test/sun/tools/jps/jps-m_2.sh +++ b/test/sun/tools/jps/jps-m_2.sh @@ -50,3 +50,9 @@ ${JAVA} -cp ${TESTCLASSES} Sleeper & SLEEPER_PID=$! ${JPS} -m | awk -f ${TESTSRC}/jps-m_Output2.awk +RC=$? + +cleanup + +exit ${RC} + diff --git a/test/sun/tools/jstat/classloadOutput1.awk b/test/sun/tools/jstat/classloadOutput1.awk new file mode 100644 index 0000000000000000000000000000000000000000..66e2b5dcd18626033a7226e8ca0c96cea42cddc0 --- /dev/null +++ b/test/sun/tools/jstat/classloadOutput1.awk @@ -0,0 +1,31 @@ +# +# matching the following output specified as a pattern that verifies +# that the numerical values conform to a specific pattern, rather than +# specific values. +# +# Loaded Time Inited Time Shared Kbytes LoadTime SysClass Kbytes LoadTime Lookup Parse Linked Time Verified Time AppClass Kbytes AppCL DefineClass Time FindClass Time Delegation URLCL Read +# 956 0.115 777 0.032 0 0.0 0.000 956 3437.5 0.085 0.013 0.045 918 0.032 917 0.011 13 1.0 0.003 1 0.000 1 0.004 0.005 0.000 +# + +BEGIN { + headerlines=0; datalines=0; totallines=0 + } + +/^Loaded Time Inited Time Shared Kbytes LoadTime SysClass Kbytes LoadTime Lookup Parse Linked Time Verified Time AppClass Kbytes AppCL DefineClass Time FindClass Time Delegation URLCL Read$/ { + headerlines++; + } + +/^[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9][ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9][ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9][ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ { + datalines++; + } + + { totallines++; print $0 } + +END { + if ((headerlines == 1) && (datalines == 1) && (totallines == 2)) { + exit 0 + } + else { + exit 1 + } + } diff --git a/test/sun/tools/jstat/jstatClassloadOutput1.sh b/test/sun/tools/jstat/jstatClassloadOutput1.sh new file mode 100644 index 0000000000000000000000000000000000000000..42e5bf1b0c1ba20941ebdc42c21f94c8cc45b1e5 --- /dev/null +++ b/test/sun/tools/jstat/jstatClassloadOutput1.sh @@ -0,0 +1,36 @@ +# +# Copyright (c) 2010, 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 6959965 +# @run shell jstatClassloadOutput1.sh +# @summary Test that output of 'jstat -classload 0' has expected line counts + +. ${TESTSRC-.}/../../jvmstat/testlibrary/utils.sh + +setup +verify_os + +JSTAT="${TESTJAVA}/bin/jstat" + +${JSTAT} -classload -J-Djstat.showUnsupported=true 0 2>&1 | awk -f ${TESTSRC}/classloadOutput1.awk diff --git a/test/sun/tools/jstat/jstatOptions1.sh b/test/sun/tools/jstat/jstatOptions1.sh index c8d012003086d5853ae824d3bc952b47c612d933..af9367f7915d2b365f6651fa3d4364bf7fb5ed85 100644 --- a/test/sun/tools/jstat/jstatOptions1.sh +++ b/test/sun/tools/jstat/jstatOptions1.sh @@ -32,7 +32,9 @@ setup JSTAT="${TESTJAVA}/bin/jstat" -rm -f jstat.out 2>/dev/null -${JSTAT} -options > jstat.out 2>&1 +rm -f jstat.out1 jstat.out2 2>/dev/null +${JSTAT} -options > jstat.out1 2>&1 +${JSTAT} -options -J-Djstat.showUnsupported=true > jstat.out2 2>&1 -diff -w jstat.out ${TESTSRC}/options1.out +diff -w jstat.out1 ${TESTSRC}/options1.out +diff -w jstat.out2 ${TESTSRC}/options2.out diff --git a/test/sun/tools/jstat/options2.out b/test/sun/tools/jstat/options2.out new file mode 100644 index 0000000000000000000000000000000000000000..5d05d60f0dc4451057cd1c324cf1427cb6694909 --- /dev/null +++ b/test/sun/tools/jstat/options2.out @@ -0,0 +1,13 @@ +-class +-classload +-compiler +-gc +-gccapacity +-gccause +-gcnew +-gcnewcapacity +-gcold +-gcoldcapacity +-gcpermcapacity +-gcutil +-printcompilation diff --git a/test/sun/tools/jstatd/jstatdDefaults.sh b/test/sun/tools/jstatd/jstatdDefaults.sh index 1e25137e251dc4bbaeaec30032bea5eb065f6331..34b21801191e07ec646da3d053c0f8bdce57128f 100644 --- a/test/sun/tools/jstatd/jstatdDefaults.sh +++ b/test/sun/tools/jstatd/jstatdDefaults.sh @@ -56,12 +56,11 @@ ${JPS} ${HOSTNAME} 2>&1 | awk -f ${TESTSRC}/jpsOutput1.awk if [ $? -ne 0 ] then echo "Output of jps differs from expected output. Failed." + cleanup exit 1 fi -TARGET_PID=`${JPS} | grep "Jstatd" | cut -d" " -f1` - -${JSTAT} -gcutil ${TARGET_PID}@${HOSTNAME} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk +${JSTAT} -gcutil ${JSTATD_PID}@${HOSTNAME} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk RC=$? if [ ${RC} -ne 0 ] @@ -75,4 +74,6 @@ then RC=1 fi +cleanup + exit ${RC} diff --git a/test/sun/tools/jstatd/jstatdExternalRegistry.sh b/test/sun/tools/jstatd/jstatdExternalRegistry.sh index ce523681970acf118fe538f7817ece01e58105a1..3385c821ee6ee4afa0277a9f1ae0ded34fee9f01 100644 --- a/test/sun/tools/jstatd/jstatdExternalRegistry.sh +++ b/test/sun/tools/jstatd/jstatdExternalRegistry.sh @@ -44,7 +44,11 @@ JPS="${TESTJAVA}/bin/jps" JSTAT="${TESTJAVA}/bin/jstat" HOSTNAME=`uname -n` -PORT=2099 +PORT=`freePort` +if [ "${PORT}" = "0" ] ; then + echo "Cannot get free port" + exit 1 +fi RMIREGISTRY_OUT="rmiregistry_$$.out" JSTATD_OUT="jstatd_$$.out" @@ -69,12 +73,7 @@ then exit 1 fi -# get the process id for the target app (jstatd). note, don't rely -# on JSTATD_PID as mks interposes a shell when starting a process in -# the background -TARGET_PID=`${JPS} | grep "Jstatd" | cut -d" " -f1` - -${JSTAT} -gcutil ${TARGET_PID}@${HOSTNAME}:${PORT} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk +${JSTAT} -gcutil ${JSTATD_PID}@${HOSTNAME}:${PORT} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk RC=$? if [ ${RC} -ne 0 ] diff --git a/test/sun/tools/jstatd/jstatdPort.sh b/test/sun/tools/jstatd/jstatdPort.sh index 48bed6616a8a490d894927e78064d08b7e91ff2c..7e8f4455dea8f9d6c3d2c6606c3afe75766ce6f2 100644 --- a/test/sun/tools/jstatd/jstatdPort.sh +++ b/test/sun/tools/jstatd/jstatdPort.sh @@ -42,7 +42,11 @@ JPS="${TESTJAVA}/bin/jps" JSTAT="${TESTJAVA}/bin/jstat" HOSTNAME=`uname -n` -PORT=2099 +PORT=`freePort` +if [ "${PORT}" = "0" ] ; then + echo "Cannot get free port" + exit 1 +fi JSTATD_OUT="jstatd_$$.out" @@ -57,12 +61,11 @@ ${JPS} ${HOSTNAME}:${PORT} 2>&1 | awk -f ${TESTSRC}/jpsOutput1.awk if [ $? -ne 0 ] then echo "Output of jps differs from expected output. Failed." + cleanup exit 1 fi -TARGET_PID=`${JPS} | grep "Jstatd" | cut -d" " -f1` - -${JSTAT} -gcutil ${TARGET_PID}@${HOSTNAME}:${PORT} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk +${JSTAT} -gcutil ${JSTATD_PID}@${HOSTNAME}:${PORT} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk RC=$? if [ ${RC} -ne 0 ] @@ -76,4 +79,6 @@ then RC=1 fi +cleanup + exit ${RC} diff --git a/test/sun/tools/jstatd/jstatdServerName.sh b/test/sun/tools/jstatd/jstatdServerName.sh index 4215035d334549392f2764a5e3eb2689946e9f0c..723a26c2efeaa39ed9dede9963cfb749844235fb 100644 --- a/test/sun/tools/jstatd/jstatdServerName.sh +++ b/test/sun/tools/jstatd/jstatdServerName.sh @@ -43,8 +43,12 @@ JPS="${TESTJAVA}/bin/jps" JSTAT="${TESTJAVA}/bin/jstat" HOSTNAME=`uname -n` -PORT_1=2098 -PORT_2=2099 +PORT_1=`freePort` +if [ "${PORT_1}" = "0" ] ; then + echo "ERROR: No free port" + exit 1 +fi +PORT_2=`expr ${PORT_1} '+' 1` SERVERNAME="SecondJstatdServer" JSTATD_1_OUT="jstatd_$$_1.out" @@ -68,6 +72,7 @@ ${JPS} ${HOSTNAME}:${PORT_1} 2>&1 | awk -f ${TESTSRC}/jpsOutput1.awk if [ $? -ne 0 ] then echo "Output of jps differs from expected output. Failed." + cleanup exit 1 fi @@ -77,13 +82,12 @@ ${JPS} ${HOSTNAME}:${PORT_2}/${SERVERNAME} 2>&1 | awk -f ${TESTSRC}/jpsOutput1.a if [ $? -ne 0 ] then echo "Output of jps differs from expected output. Failed." + cleanup exit 1 fi -TARGET_PID=`${JPS} | grep "Jstatd" | cut -d" " -f1 | head -1` - -echo "running: ${JSTAT} -gcutil ${TARGET_PID}@${HOSTNAME}:${PORT_1} 250 5" -${JSTAT} -gcutil ${TARGET_PID}@${HOSTNAME}:${PORT_1} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk +echo "running: ${JSTAT} -gcutil ${JSTATD_1_PID}@${HOSTNAME}:${PORT_1} 250 5" +${JSTAT} -gcutil ${JSTATD_1_PID}@${HOSTNAME}:${PORT_1} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk RC=$? if [ ${RC} -ne 0 ] @@ -91,8 +95,8 @@ then echo "jstat output differs from expected output" fi -echo "running: ${JSTAT} -gcutil ${TARGET_PID}@${HOSTNAME}:${PORT_2}/${SERVERNAME} 250 5" -${JSTAT} -gcutil ${TARGET_PID}@${HOSTNAME}:${PORT_2}/${SERVERNAME} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk +echo "running: ${JSTAT} -gcutil ${JSTATD_1_PID}@${HOSTNAME}:${PORT_2}/${SERVERNAME} 250 5" +${JSTAT} -gcutil ${JSTATD_1_PID}@${HOSTNAME}:${PORT_2}/${SERVERNAME} 250 5 2>&1 | awk -f ${TESTSRC}/jstatGcutilOutput1.awk RC=$? if [ ${RC} -ne 0 ] @@ -112,4 +116,6 @@ then RC=1 fi +cleanup + exit ${RC} diff --git a/test/tools/jar/UpdateManifest.java b/test/tools/jar/UpdateManifest.java index f2b5ca4e3aebe4ab3067f6048d7f25ee229568fd..2bcd25081ea7238a4ce8f84d87f45d0db88b1fd8 100644 --- a/test/tools/jar/UpdateManifest.java +++ b/test/tools/jar/UpdateManifest.java @@ -143,6 +143,7 @@ public class UpdateManifest { } else { fail("did not match specVersion nor specTitle"); } + zf.close(); } // --------------------- Convenience --------------------------- diff --git a/test/tools/jar/index/MetaInf.java b/test/tools/jar/index/MetaInf.java index 2ffaa4afb188ec00d4f0487a03153c1b693214d1..ea62e2ba7bcb536c5074a50f178679eb424dd244 100644 --- a/test/tools/jar/index/MetaInf.java +++ b/test/tools/jar/index/MetaInf.java @@ -62,7 +62,13 @@ public class MetaInf { static boolean contains(File jarFile, String entryName) throws IOException { - return new ZipFile(jarFile).getEntry(entryName) != null; + ZipFile zf = new ZipFile(jarFile); + if ( zf != null ) { + boolean result = zf.getEntry(entryName) != null; + zf.close(); + return result; + } + return false; } static void checkContains(File jarFile, String entryName) @@ -94,9 +100,13 @@ public class MetaInf { String line; while ((line = index.readLine()) != null) { if (line.equals(SERVICES)) { + index.close(); + f.close(); return; } } + index.close(); + f.close(); throw new Error(SERVICES + " not indexed."); } diff --git a/test/tools/pack200/Pack200Test.java b/test/tools/pack200/Pack200Test.java index ec0489af3c098c7c10f476cd42742d9336290133..631b50709da056d28ce48a2949fe99f60b308ad1 100644 --- a/test/tools/pack200/Pack200Test.java +++ b/test/tools/pack200/Pack200Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2010 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 @@ -39,8 +39,8 @@ import java.util.zip.*; */ public class Pack200Test { - private static ArrayList jarList = new ArrayList(); - private static final String PACKEXT = ".pack"; + private static ArrayList jarList = new ArrayList(); + static final String PACKEXT = ".pack"; /** Creates a new instance of Pack200Test */ private Pack200Test() {} @@ -48,7 +48,7 @@ public class Pack200Test { private static void doPackUnpack() { for (File in : jarList) { Pack200.Packer packer = Pack200.newPacker(); - Map p = packer.properties(); + Map p = packer.properties(); // Take the time optimization vs. space p.put(packer.EFFORT, "1"); // CAUTION: do not use 0. // Make the memory consumption as effective as possible @@ -96,7 +96,7 @@ public class Pack200Test { } private static ArrayList getZipFileEntryNames(ZipFile z) { - ArrayList out = new ArrayList(); + ArrayList out = new ArrayList(); for (ZipEntry ze : Collections.list(z.entries())) { out.add(ze.getName()); } diff --git a/test/tools/pack200/PackageVersionTest.java b/test/tools/pack200/PackageVersionTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0cd9ca26453265eb8f55f404e5df4a29d27d8df2 --- /dev/null +++ b/test/tools/pack200/PackageVersionTest.java @@ -0,0 +1,169 @@ + +/* + * Copyright (c) 2010, 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 6712743 + * @summary verify package versioning + * @compile -XDignore.symbol.file PackageVersionTest.java + * @run main PackageVersionTest + */ + +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.jar.JarFile; +import java.util.jar.Pack200; +import java.util.jar.Pack200.Packer; + +public class PackageVersionTest { + private static final File javaHome = new File(System.getProperty("java.home")); + + public final static int JAVA5_PACKAGE_MAJOR_VERSION = 150; + public final static int JAVA5_PACKAGE_MINOR_VERSION = 7; + + public final static int JAVA6_PACKAGE_MAJOR_VERSION = 160; + public final static int JAVA6_PACKAGE_MINOR_VERSION = 1; + + public static void main(String... args) { + if (!javaHome.getName().endsWith("jre")) { + throw new RuntimeException("Error: requires an SDK to run"); + } + + File out = new File("test.pack"); + createClassFile("Test5"); + createClassFile("Test6"); + createClassFile("Test7"); + + verifyPack("Test5.class", JAVA5_PACKAGE_MAJOR_VERSION, + JAVA5_PACKAGE_MINOR_VERSION); + + verifyPack("Test6.class", JAVA6_PACKAGE_MAJOR_VERSION, + JAVA6_PACKAGE_MINOR_VERSION); + + // TODO: change this to the java7 package version as needed. + verifyPack("Test7.class", JAVA6_PACKAGE_MAJOR_VERSION, + JAVA6_PACKAGE_MINOR_VERSION); + + // test for resource file, ie. no class files + verifyPack("Test6.java", JAVA5_PACKAGE_MAJOR_VERSION, + JAVA5_PACKAGE_MINOR_VERSION); + } + + static void close(Closeable c) { + if (c == null) { + return; + } + try { + c.close(); + } catch (IOException ignore) {} + } + + static void createClassFile(String name) { + createJavaFile(name); + String target = name.substring(name.length() - 1); + String javacCmds[] = { + "-source", + "5", + "-target", + name.substring(name.length() - 1), + name + ".java" + }; + compileJava(javacCmds); + } + + static void createJavaFile(String name) { + PrintStream ps = null; + FileOutputStream fos = null; + File outputFile = new File(name + ".java"); + outputFile.delete(); + try { + fos = new FileOutputStream(outputFile); + ps = new PrintStream(fos); + ps.format("public class %s {}", name); + } catch (IOException ioe) { + throw new RuntimeException("creation of test file failed"); + } finally { + close(ps); + close(fos); + } + } + + static void compileJava(String... javacCmds) { + if (com.sun.tools.javac.Main.compile(javacCmds) != 0) { + throw new RuntimeException("compilation failed"); + } + } + + static void makeJar(String... jargs) { + sun.tools.jar.Main jarTool = + new sun.tools.jar.Main(System.out, System.err, "jartool"); + if (!jarTool.run(jargs)) { + throw new RuntimeException("jar command failed"); + } + } + + static void verifyPack(String filename, int expected_major, int expected_minor) { + + File jarFileName = new File("test.jar"); + jarFileName.delete(); + String jargs[] = { + "cvf", + jarFileName.getName(), + filename + }; + makeJar(jargs); + JarFile jfin = null; + + try { + jfin = new JarFile(jarFileName); + Packer packer = Pack200.newPacker(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + packer.pack(jfin, baos); + baos.flush(); + baos.close(); + byte[] buf = baos.toByteArray(); + + int minor = buf[4] & 0x000000ff; + int major = buf[5] & 0x000000ff; + + if (major != expected_major || minor != expected_minor) { + String msg = + String.format("test fails: expected:%d.%d but got %d.%d\n", + expected_major, expected_minor, + major, minor); + throw new Error(msg); + } + + System.out.println(filename + ": OK"); + } catch (IOException ioe) { + throw new RuntimeException(ioe.getMessage()); + } finally { + close(jfin); + } + } +} diff --git a/test/tools/pack200/SegmentLimit.java b/test/tools/pack200/SegmentLimit.java new file mode 100644 index 0000000000000000000000000000000000000000..249e47b032f05de460d8958a56dae1b09043b6be --- /dev/null +++ b/test/tools/pack200/SegmentLimit.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2010, 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 6575373 + * @summary verify default segment limit + * @compile SegmentLimit.java + * @run main SegmentLimit + */ + +import java.io.BufferedReader; +import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; + +/* + * Run this against a large jar file, by default the packer should generate only + * one segment, parse the output of the packer to verify if this is indeed true. + */ + +public class SegmentLimit { + + private static final File javaHome = new File(System.getProperty("java.home")); + + public static void main(String... args) { + if (!javaHome.getName().endsWith("jre")) { + throw new RuntimeException("Error: requires an SDK to run"); + } + + File out = new File("test" + Pack200Test.PACKEXT); + out.delete(); + runPack200(out); + } + + static void close(Closeable c) { + if (c == null) { + return; + } + try { + c.close(); + } catch (IOException ignore) {} + } + + static void runPack200(File outFile) { + File binDir = new File(javaHome, "bin"); + File pack200Exe = System.getProperty("os.name").startsWith("Windows") + ? new File(binDir, "pack200.exe") + : new File(binDir, "pack200"); + File sdkHome = javaHome.getParentFile(); + File testJar = new File(new File(sdkHome, "lib"), "tools.jar"); + + System.out.println("using pack200: " + pack200Exe.getAbsolutePath()); + + String[] cmds = { pack200Exe.getAbsolutePath(), + "--effort=1", + "--verbose", + "--no-gzip", + outFile.getName(), + testJar.getAbsolutePath() + }; + InputStream is = null; + BufferedReader br = null; + InputStreamReader ir = null; + + FileOutputStream fos = null; + PrintStream ps = null; + + try { + ProcessBuilder pb = new ProcessBuilder(cmds); + pb.redirectErrorStream(true); + Process p = pb.start(); + is = p.getInputStream(); + ir = new InputStreamReader(is); + br = new BufferedReader(ir); + + File logFile = new File("pack200.log"); + fos = new FileOutputStream(logFile); + ps = new PrintStream(fos); + + String line = br.readLine(); + int count = 0; + while (line != null) { + line = line.trim(); + if (line.matches(".*Transmitted.*files of.*input bytes in a segment of.*bytes")) { + count++; + } + ps.println(line); + line=br.readLine(); + } + p.waitFor(); + if (p.exitValue() != 0) { + throw new RuntimeException("pack200 failed"); + } + p.destroy(); + if (count > 1) { + throw new Error("test fails: check for multiple segments(" + + count + ") in: " + logFile.getAbsolutePath()); + } + } catch (IOException ex) { + throw new RuntimeException(ex.getMessage()); + } catch (InterruptedException ignore){ + } finally { + close(is); + close(ps); + close(fos); + } + } +} +