changeset 60825:8d9804c38e0c

8225319: Remove rmic from the set of supported tools Reviewed-by: erikj, alanb, lancea, jjg, amlu
author rriggs
date Wed, 08 Apr 2020 09:22:08 -0400
parents db8ac4690d6a
children 6aa5b72029bb
files make/CompileJavaModules.gmk make/common/Modules.gmk make/launcher/Launcher-jdk.rmic.gmk make/nashorn/element-list src/java.rmi/share/classes/java/rmi/server/Operation.java src/java.rmi/share/classes/java/rmi/server/Skeleton.java src/java.rmi/share/classes/java/rmi/server/SkeletonMismatchException.java src/java.rmi/share/classes/java/rmi/server/UnicastRemoteObject.java src/java.rmi/share/classes/java/rmi/server/package-info.java src/jdk.rmic/share/classes/module-info.java src/jdk.rmic/share/classes/sun/rmi/rmic/BatchEnvironment.java src/jdk.rmic/share/classes/sun/rmi/rmic/Constants.java src/jdk.rmic/share/classes/sun/rmi/rmic/Generator.java src/jdk.rmic/share/classes/sun/rmi/rmic/IndentingWriter.java src/jdk.rmic/share/classes/sun/rmi/rmic/Main.java src/jdk.rmic/share/classes/sun/rmi/rmic/Names.java src/jdk.rmic/share/classes/sun/rmi/rmic/RMIConstants.java src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java src/jdk.rmic/share/classes/sun/rmi/rmic/Util.java src/jdk.rmic/share/classes/sun/rmi/rmic/resources/rmic.properties src/jdk.rmic/share/classes/sun/rmi/rmic/resources/rmic_ja.properties src/jdk.rmic/share/classes/sun/rmi/rmic/resources/rmic_zh_CN.properties src/jdk.rmic/share/classes/sun/tools/asm/ArrayData.java src/jdk.rmic/share/classes/sun/tools/asm/Assembler.java src/jdk.rmic/share/classes/sun/tools/asm/CatchData.java src/jdk.rmic/share/classes/sun/tools/asm/ClassConstantData.java src/jdk.rmic/share/classes/sun/tools/asm/ConstantPool.java src/jdk.rmic/share/classes/sun/tools/asm/ConstantPoolData.java src/jdk.rmic/share/classes/sun/tools/asm/Cover.java src/jdk.rmic/share/classes/sun/tools/asm/FieldConstantData.java src/jdk.rmic/share/classes/sun/tools/asm/Instruction.java src/jdk.rmic/share/classes/sun/tools/asm/Label.java src/jdk.rmic/share/classes/sun/tools/asm/LocalVariable.java src/jdk.rmic/share/classes/sun/tools/asm/LocalVariableTable.java src/jdk.rmic/share/classes/sun/tools/asm/NameAndTypeConstantData.java src/jdk.rmic/share/classes/sun/tools/asm/NameAndTypeData.java src/jdk.rmic/share/classes/sun/tools/asm/NumberConstantData.java src/jdk.rmic/share/classes/sun/tools/asm/StringConstantData.java src/jdk.rmic/share/classes/sun/tools/asm/StringExpressionConstantData.java src/jdk.rmic/share/classes/sun/tools/asm/SwitchData.java src/jdk.rmic/share/classes/sun/tools/asm/TryData.java src/jdk.rmic/share/classes/sun/tools/java/AmbiguousClass.java src/jdk.rmic/share/classes/sun/tools/java/AmbiguousMember.java src/jdk.rmic/share/classes/sun/tools/java/ArrayType.java src/jdk.rmic/share/classes/sun/tools/java/BinaryAttribute.java src/jdk.rmic/share/classes/sun/tools/java/BinaryClass.java src/jdk.rmic/share/classes/sun/tools/java/BinaryCode.java src/jdk.rmic/share/classes/sun/tools/java/BinaryConstantPool.java src/jdk.rmic/share/classes/sun/tools/java/BinaryExceptionHandler.java src/jdk.rmic/share/classes/sun/tools/java/BinaryMember.java src/jdk.rmic/share/classes/sun/tools/java/ClassDeclaration.java src/jdk.rmic/share/classes/sun/tools/java/ClassDefinition.java src/jdk.rmic/share/classes/sun/tools/java/ClassFile.java src/jdk.rmic/share/classes/sun/tools/java/ClassNotFound.java src/jdk.rmic/share/classes/sun/tools/java/ClassPath.java src/jdk.rmic/share/classes/sun/tools/java/ClassType.java src/jdk.rmic/share/classes/sun/tools/java/CompilerError.java src/jdk.rmic/share/classes/sun/tools/java/Constants.java src/jdk.rmic/share/classes/sun/tools/java/Environment.java src/jdk.rmic/share/classes/sun/tools/java/FileClassFile.java src/jdk.rmic/share/classes/sun/tools/java/Identifier.java src/jdk.rmic/share/classes/sun/tools/java/IdentifierToken.java src/jdk.rmic/share/classes/sun/tools/java/Imports.java src/jdk.rmic/share/classes/sun/tools/java/MemberDefinition.java src/jdk.rmic/share/classes/sun/tools/java/MethodSet.java src/jdk.rmic/share/classes/sun/tools/java/MethodType.java src/jdk.rmic/share/classes/sun/tools/java/Package.java src/jdk.rmic/share/classes/sun/tools/java/Parser.java src/jdk.rmic/share/classes/sun/tools/java/ParserActions.java src/jdk.rmic/share/classes/sun/tools/java/PathClassFile.java src/jdk.rmic/share/classes/sun/tools/java/RuntimeConstants.java src/jdk.rmic/share/classes/sun/tools/java/Scanner.java src/jdk.rmic/share/classes/sun/tools/java/ScannerInputReader.java src/jdk.rmic/share/classes/sun/tools/java/SyntaxError.java src/jdk.rmic/share/classes/sun/tools/java/Type.java src/jdk.rmic/share/classes/sun/tools/java/ZipClassFile.java src/jdk.rmic/share/classes/sun/tools/javac/BatchEnvironment.java src/jdk.rmic/share/classes/sun/tools/javac/BatchParser.java src/jdk.rmic/share/classes/sun/tools/javac/CompilerMember.java src/jdk.rmic/share/classes/sun/tools/javac/ErrorConsumer.java src/jdk.rmic/share/classes/sun/tools/javac/ErrorMessage.java src/jdk.rmic/share/classes/sun/tools/javac/Main.java src/jdk.rmic/share/classes/sun/tools/javac/SourceClass.java src/jdk.rmic/share/classes/sun/tools/javac/SourceMember.java src/jdk.rmic/share/classes/sun/tools/javac/resources/javac.properties src/jdk.rmic/share/classes/sun/tools/javac/resources/javac_ja.properties src/jdk.rmic/share/classes/sun/tools/javac/resources/javac_zh_CN.properties src/jdk.rmic/share/classes/sun/tools/tree/AddExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AndExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ArrayAccessExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ArrayExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignAddExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignBitAndExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignBitOrExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignBitXorExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignDivideExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignMultiplyExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignOpExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignRemainderExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignShiftLeftExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignShiftRightExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignSubtractExpression.java src/jdk.rmic/share/classes/sun/tools/tree/AssignUnsignedShiftRightExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BinaryArithmeticExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BinaryAssignExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BinaryBitExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BinaryCompareExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BinaryEqualityExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BinaryExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BinaryLogicalExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BinaryShiftExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BitAndExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BitNotExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BitOrExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BitXorExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BooleanExpression.java src/jdk.rmic/share/classes/sun/tools/tree/BreakStatement.java src/jdk.rmic/share/classes/sun/tools/tree/ByteExpression.java src/jdk.rmic/share/classes/sun/tools/tree/CaseStatement.java src/jdk.rmic/share/classes/sun/tools/tree/CastExpression.java src/jdk.rmic/share/classes/sun/tools/tree/CatchStatement.java src/jdk.rmic/share/classes/sun/tools/tree/CharExpression.java src/jdk.rmic/share/classes/sun/tools/tree/CheckContext.java src/jdk.rmic/share/classes/sun/tools/tree/CodeContext.java src/jdk.rmic/share/classes/sun/tools/tree/CommaExpression.java src/jdk.rmic/share/classes/sun/tools/tree/CompoundStatement.java src/jdk.rmic/share/classes/sun/tools/tree/ConditionVars.java src/jdk.rmic/share/classes/sun/tools/tree/ConditionalExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ConstantExpression.java src/jdk.rmic/share/classes/sun/tools/tree/Context.java src/jdk.rmic/share/classes/sun/tools/tree/ContinueStatement.java src/jdk.rmic/share/classes/sun/tools/tree/ConvertExpression.java src/jdk.rmic/share/classes/sun/tools/tree/DeclarationStatement.java src/jdk.rmic/share/classes/sun/tools/tree/DivRemExpression.java src/jdk.rmic/share/classes/sun/tools/tree/DivideExpression.java src/jdk.rmic/share/classes/sun/tools/tree/DoStatement.java src/jdk.rmic/share/classes/sun/tools/tree/DoubleExpression.java src/jdk.rmic/share/classes/sun/tools/tree/EqualExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ExprExpression.java src/jdk.rmic/share/classes/sun/tools/tree/Expression.java src/jdk.rmic/share/classes/sun/tools/tree/ExpressionStatement.java src/jdk.rmic/share/classes/sun/tools/tree/FieldExpression.java src/jdk.rmic/share/classes/sun/tools/tree/FieldUpdater.java src/jdk.rmic/share/classes/sun/tools/tree/FinallyStatement.java src/jdk.rmic/share/classes/sun/tools/tree/FloatExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ForStatement.java src/jdk.rmic/share/classes/sun/tools/tree/GreaterExpression.java src/jdk.rmic/share/classes/sun/tools/tree/GreaterOrEqualExpression.java src/jdk.rmic/share/classes/sun/tools/tree/IdentifierExpression.java src/jdk.rmic/share/classes/sun/tools/tree/IfStatement.java src/jdk.rmic/share/classes/sun/tools/tree/IncDecExpression.java src/jdk.rmic/share/classes/sun/tools/tree/InlineMethodExpression.java src/jdk.rmic/share/classes/sun/tools/tree/InlineNewInstanceExpression.java src/jdk.rmic/share/classes/sun/tools/tree/InlineReturnStatement.java src/jdk.rmic/share/classes/sun/tools/tree/InstanceOfExpression.java src/jdk.rmic/share/classes/sun/tools/tree/IntExpression.java src/jdk.rmic/share/classes/sun/tools/tree/IntegerExpression.java src/jdk.rmic/share/classes/sun/tools/tree/LengthExpression.java src/jdk.rmic/share/classes/sun/tools/tree/LessExpression.java src/jdk.rmic/share/classes/sun/tools/tree/LessOrEqualExpression.java src/jdk.rmic/share/classes/sun/tools/tree/LocalMember.java src/jdk.rmic/share/classes/sun/tools/tree/LongExpression.java src/jdk.rmic/share/classes/sun/tools/tree/MethodExpression.java src/jdk.rmic/share/classes/sun/tools/tree/MultiplyExpression.java src/jdk.rmic/share/classes/sun/tools/tree/NaryExpression.java src/jdk.rmic/share/classes/sun/tools/tree/NegativeExpression.java src/jdk.rmic/share/classes/sun/tools/tree/NewArrayExpression.java src/jdk.rmic/share/classes/sun/tools/tree/NewInstanceExpression.java src/jdk.rmic/share/classes/sun/tools/tree/Node.java src/jdk.rmic/share/classes/sun/tools/tree/NotEqualExpression.java src/jdk.rmic/share/classes/sun/tools/tree/NotExpression.java src/jdk.rmic/share/classes/sun/tools/tree/NullExpression.java src/jdk.rmic/share/classes/sun/tools/tree/OrExpression.java src/jdk.rmic/share/classes/sun/tools/tree/PositiveExpression.java src/jdk.rmic/share/classes/sun/tools/tree/PostDecExpression.java src/jdk.rmic/share/classes/sun/tools/tree/PostIncExpression.java src/jdk.rmic/share/classes/sun/tools/tree/PreDecExpression.java src/jdk.rmic/share/classes/sun/tools/tree/PreIncExpression.java src/jdk.rmic/share/classes/sun/tools/tree/RemainderExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ReturnStatement.java src/jdk.rmic/share/classes/sun/tools/tree/ShiftLeftExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ShiftRightExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ShortExpression.java src/jdk.rmic/share/classes/sun/tools/tree/Statement.java src/jdk.rmic/share/classes/sun/tools/tree/StringExpression.java src/jdk.rmic/share/classes/sun/tools/tree/SubtractExpression.java src/jdk.rmic/share/classes/sun/tools/tree/SuperExpression.java src/jdk.rmic/share/classes/sun/tools/tree/SwitchStatement.java src/jdk.rmic/share/classes/sun/tools/tree/SynchronizedStatement.java src/jdk.rmic/share/classes/sun/tools/tree/ThisExpression.java src/jdk.rmic/share/classes/sun/tools/tree/ThrowStatement.java src/jdk.rmic/share/classes/sun/tools/tree/TryStatement.java src/jdk.rmic/share/classes/sun/tools/tree/TypeExpression.java src/jdk.rmic/share/classes/sun/tools/tree/UnaryExpression.java src/jdk.rmic/share/classes/sun/tools/tree/UnsignedShiftRightExpression.java src/jdk.rmic/share/classes/sun/tools/tree/UplevelReference.java src/jdk.rmic/share/classes/sun/tools/tree/VarDeclarationStatement.java src/jdk.rmic/share/classes/sun/tools/tree/Vset.java src/jdk.rmic/share/classes/sun/tools/tree/WhileStatement.java src/jdk.rmic/share/classes/sun/tools/util/CommandLine.java src/jdk.rmic/share/classes/sun/tools/util/ModifierFilter.java src/jdk.rmic/share/man/rmic.1 test/jdk/java/rmi/reliability/benchmark/bench/rmi/Makefile test/jdk/java/rmi/testlibrary/README.jcov test/jdk/sun/rmi/rmic/RMIGenerator/RmicDefault.java test/jdk/sun/rmi/rmic/RMIGenerator/packagedir/AppletServer.java test/jdk/sun/rmi/rmic/RMIGenerator/packagedir/RmicMeImpl.java test/jdk/sun/rmi/rmic/RMIGenerator/packagedir/RmicMeInterface.java test/jdk/sun/rmi/rmic/classFileVersion/G1.java test/jdk/sun/rmi/rmic/classFileVersion/G1Impl.java test/jdk/sun/rmi/rmic/classFileVersion/run.sh test/jdk/sun/rmi/rmic/classpath/RMICClassPathTest.java test/jdk/sun/rmi/rmic/covariantReturns/G2.java test/jdk/sun/rmi/rmic/covariantReturns/G2Impl.java test/jdk/sun/rmi/rmic/covariantReturns/G5.java test/jdk/sun/rmi/rmic/covariantReturns/G5Impl.java test/jdk/sun/rmi/rmic/covariantReturns/run.sh test/jdk/sun/rmi/rmic/defaultStubVersion/G1.java test/jdk/sun/rmi/rmic/defaultStubVersion/G1Impl.java test/jdk/sun/rmi/rmic/defaultStubVersion/run.sh test/jdk/sun/rmi/rmic/extraCompilation/run.sh test/jdk/sun/rmi/rmic/manifestClassPath/Util.sh test/jdk/sun/rmi/rmic/manifestClassPath/run.sh test/jdk/sun/rmi/rmic/minimizeWrapperInstances/P.java test/jdk/sun/rmi/rmic/minimizeWrapperInstances/PImpl.java test/jdk/sun/rmi/rmic/minimizeWrapperInstances/Test.java test/jdk/sun/rmi/rmic/minimizeWrapperInstances/run.sh test/jdk/sun/rmi/rmic/oldjavacRemoved/Foo.java test/jdk/sun/rmi/rmic/oldjavacRemoved/sunToolsJavacMain.sh test/jdk/sun/tools/java/CFCTest.java test/jdk/tools/launcher/HelpFlagsTest.java test/jdk/tools/launcher/VersionCheck.java
diffstat 234 files changed, 28 insertions(+), 49808 deletions(-) [+]
line wrap: on
line diff
--- a/make/CompileJavaModules.gmk	Wed Apr 08 15:00:39 2020 +0200
+++ b/make/CompileJavaModules.gmk	Wed Apr 08 09:22:08 2020 -0400
@@ -351,11 +351,6 @@
 
 ################################################################################
 
-jdk.rmic_DISABLED_WARNINGS += deprecation
-jdk.rmic_CLEAN += .properties
-
-################################################################################
-
 # No SCTP implementation on Mac OS X or AIX. These classes should be excluded.
 SCTP_IMPL_CLASSES = \
     $(TOPDIR)/src/jdk.sctp/unix/classes/sun/nio/ch/sctp/AssociationChange.java \
--- a/make/common/Modules.gmk	Wed Apr 08 15:00:39 2020 +0200
+++ b/make/common/Modules.gmk	Wed Apr 08 09:22:08 2020 -0400
@@ -172,7 +172,6 @@
     jdk.naming.rmi \
     jdk.net \
     jdk.nio.mapmode \
-    jdk.rmic \
     jdk.scripting.nashorn \
     jdk.sctp \
     jdk.security.auth \
--- a/make/launcher/Launcher-jdk.rmic.gmk	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-#
-# Copyright (c) 2011, 2015, 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.
-#
-
-include LauncherCommon.gmk
-
-$(eval $(call SetupBuildLauncher, rmic, \
-    MAIN_CLASS := sun.rmi.rmic.Main, \
-    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
-))
--- a/make/nashorn/element-list	Wed Apr 08 15:00:39 2020 +0200
+++ b/make/nashorn/element-list	Wed Apr 08 09:22:08 2020 -0400
@@ -260,7 +260,6 @@
 module:jdk.net
 jdk.net
 jdk.nio
-module:jdk.rmic
 module:jdk.scripting.nashorn
 jdk.nashorn.api.scripting
 jdk.nashorn.api.tree
--- a/src/java.rmi/share/classes/java/rmi/server/Operation.java	Wed Apr 08 15:00:39 2020 +0200
+++ b/src/java.rmi/share/classes/java/rmi/server/Operation.java	Wed Apr 08 09:22:08 2020 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2020, 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
@@ -29,8 +29,7 @@
  * An <code>Operation</code> contains a description of a Java method.
  * <code>Operation</code> objects were used in JDK1.1 version stubs and
  * skeletons. The <code>Operation</code> class is not needed for 1.2 style
- * stubs (stubs generated with <code>rmic -v1.2</code>); hence, this class
- * is deprecated.
+ * stubs; hence, this class is deprecated.
  *
  * @since 1.1
  * @deprecated no replacement
--- a/src/java.rmi/share/classes/java/rmi/server/Skeleton.java	Wed Apr 08 15:00:39 2020 +0200
+++ b/src/java.rmi/share/classes/java/rmi/server/Skeleton.java	Wed Apr 08 09:22:08 2020 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2020, 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
@@ -30,11 +30,9 @@
  * The <code>Skeleton</code> interface is used solely by the RMI
  * implementation.
  *
- * <p> Every version 1.1 (and version 1.1 compatible skeletons generated in
- * 1.2 using <code>rmic -vcompat</code>) skeleton class generated by the rmic
- * stub compiler implements this interface. A skeleton for a remote object is
- * a server-side entity that dispatches calls to the actual remote object
- * implementation.
+ * <p> Every version 1.1 compatible skeleton implements this interface.
+ * A skeleton for a remote object is a server-side entity that dispatches calls
+ * to the actual remote object implementation.
  *
  * @author  Ann Wollrath
  * @since   1.1
--- a/src/java.rmi/share/classes/java/rmi/server/SkeletonMismatchException.java	Wed Apr 08 15:00:39 2020 +0200
+++ b/src/java.rmi/share/classes/java/rmi/server/SkeletonMismatchException.java	Wed Apr 08 09:22:08 2020 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2020, 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
@@ -33,7 +33,7 @@
  * remote method names or signatures in this interface have changed or
  * that the stub class used to make the call and the skeleton
  * receiving the call were not generated by the same version of
- * the stub compiler (<code>rmic</code>).
+ * the stub protocol.
  *
  * @author  Roger Riggs
  * @since   1.1
--- a/src/java.rmi/share/classes/java/rmi/server/UnicastRemoteObject.java	Wed Apr 08 15:00:39 2020 +0200
+++ b/src/java.rmi/share/classes/java/rmi/server/UnicastRemoteObject.java	Wed Apr 08 09:22:08 2020 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2020, 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
@@ -32,17 +32,14 @@
 
 /**
  * Used for exporting a remote object with JRMP and obtaining a stub
- * that communicates to the remote object. Stubs are either generated
- * at runtime using dynamic proxy objects, or they are generated statically
- * at build time, typically using the {@code rmic} tool.
+ * that communicates to the remote object. Stubs are generated
+ * at runtime using dynamic proxy objects.
  *
  * <p><strong>Deprecated: Static Stubs.</strong> <em>Support for statically
  * generated stubs is deprecated. This includes the API in this class that
  * requires the use of static stubs, as well as the runtime support for
  * loading static stubs.  Generating stubs dynamically is preferred, using one
- * of the non-deprecated ways of exporting objects as listed below. Do
- * not run {@code rmic} to generate static stub classes. It is unnecessary, and
- * it is also deprecated.</em>
+ * of the non-deprecated ways of exporting objects as listed below. </em>
  *
  * <p>There are eight ways to export remote objects:
  *
@@ -90,10 +87,8 @@
  * <p>The default value of the
  * {@code java.rmi.server.ignoreStubClasses} property is {@code false}.
  *
- * <p>Statically generated stubs are typically pregenerated from the
- * remote object's class using the {@code rmic} tool. A static stub is
- * loaded and an instance of that stub class is constructed as described
- * below.
+ * <p>Statically generated stubs are typically pregenerated from the remote object's class.
+ * A static stub is loaded and an instance of that stub class is constructed as described below.
  *
  * <ul>
  *
--- a/src/java.rmi/share/classes/java/rmi/server/package-info.java	Wed Apr 08 15:00:39 2020 +0200
+++ b/src/java.rmi/share/classes/java/rmi/server/package-info.java	Wed Apr 08 09:22:08 2020 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2020, 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
@@ -24,31 +24,22 @@
  */
 
 /**
- * Provides classes and interfaces for supporting the server
- * side of RMI.  A group of classes are used by the stubs and skeletons
- * generated by the rmic stub compiler.  Another group of classes
- * implements the RMI Transport protocol and HTTP tunneling.
- *
- * <p><strong>Deprecated: HTTP Tunneling.</strong> <em>The HTTP tunneling
- * mechanism has been deprecated. See {@link java.rmi.server.RMISocketFactory} for
- * further information.</em>
+ * Provides classes and interfaces for supporting the server side of RMI.
+ * One group of classes are used by the static stubs and skeletons.
+ * Another group of classes implements the RMI Transport protocol.
  *
  * <p><strong>Deprecated: Skeletons and Static Stubs.</strong>
  *
  * <em>Skeletons and statically generated stubs are deprecated.  This
  * includes the APIs in this package that require the use of skeletons
- * or static stubs, the runtime support for them, and the use of the
- * {@code rmic} stub compiler to generate them.  Support for skeletons
+ * or static stubs and the runtime support for them.  Support for skeletons
  * and static stubs may be removed in a future release of the
  * platform. Skeletons are unnecessary, as server-side method dispatching
  * is handled directly by the RMI runtime. Statically generated stubs are
  * unnecessary, as stubs are generated dynamically using {@link
  * java.lang.reflect.Proxy Proxy} objects. See {@link
  * java.rmi.server.UnicastRemoteObject UnicastRemoteObject} for
- * information about dynamic stub generation. Generation of skeletons and
- * static stubs was typically performed as part of an application's build
- * process by calling the {@code rmic} tool. This is unnecessary, and
- * calls to {@code rmic} can simply be omitted.</em>
+ * information about dynamic stub generation.</em>
  *
  * @since 1.1
  */
--- a/src/jdk.rmic/share/classes/module-info.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, 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.
- */
-
-/**
- * Defines the <em>{@index rmic rmic}</em> compiler for generating stubs and
- * skeletons using the Java Remote Method Protocol (JRMP) for remote objects.
- *
- * @toolGuide rmic
- *
- * @moduleGraph
- * @since 9
- */
-module jdk.rmic {
-    requires jdk.compiler;
-    requires jdk.javadoc;
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/BatchEnvironment.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,438 +0,0 @@
-/*
- * Copyright (c) 1996, 2015, 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.
- */
-
-/*****************************************************************************/
-/*                    Copyright (c) IBM Corporation 1998                     */
-/*                                                                           */
-/* (C) Copyright IBM Corp. 1998                                              */
-/*                                                                           */
-/*****************************************************************************/
-
-package sun.rmi.rmic;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import java.util.jar.Attributes;
-import sun.tools.java.ClassPath;
-
-/**
- * BatchEnvironment for rmic extends javac's version in four ways:
- * 1. It overrides errorString() to handle looking for rmic-specific
- * error messages in rmic's resource bundle
- * 2. It provides a mechanism for recording intermediate generated
- * files so that they can be deleted later.
- * 3. It holds a reference to the Main instance so that generators
- * can refer to it.
- * 4. It provides access to the ClassPath passed to the constructor.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-
-@SuppressWarnings("deprecation")
-public class BatchEnvironment extends sun.tools.javac.BatchEnvironment {
-
-    /** instance of Main which created this environment */
-    private Main main;
-
-    /**
-     * Create a ClassPath object for rmic from a class path string.
-     */
-    public static ClassPath createClassPath(String classPathString) {
-        ClassPath[] paths = classPaths(null, classPathString, null);
-        return paths[1];
-    }
-
-    /**
-     * Create a ClassPath object for rmic from the relevant command line
-     * options for class path and boot class path.
-     */
-    public static ClassPath createClassPath(String classPathString,
-                                            String sysClassPathString)
-    {
-        /**
-         * Previously, this method delegated to the
-         * sun.tools.javac.BatchEnvironment.classPaths method in order
-         * to supply default values for paths not specified on the
-         * command line, expand extensions directories into specific
-         * JAR files, and construct the ClassPath object-- but as part
-         * of the fix for 6473331, which adds support for Class-Path
-         * manifest entries in JAR files, those steps are now handled
-         * here directly, with the help of a Path utility class copied
-         * from the new javac implementation (see below).
-         */
-        Path path = new Path();
-
-        if (sysClassPathString == null) {
-            sysClassPathString = System.getProperty("sun.boot.class.path");
-        }
-        if (sysClassPathString != null) {
-            path.addFiles(sysClassPathString);
-        }
-
-        /*
-         * Class-Path manifest entries are supported for JAR files
-         * everywhere except in the boot class path.
-         */
-        path.expandJarClassPaths(true);
-
-        /*
-         * In the application class path, an empty element means
-         * the current working directory.
-         */
-        path.emptyPathDefault(".");
-
-        if (classPathString == null) {
-            // The env.class.path property is the user's CLASSPATH
-            // environment variable, and it set by the wrapper (ie,
-            // javac.exe).
-            classPathString = System.getProperty("env.class.path");
-            if (classPathString == null) {
-                classPathString = ".";
-            }
-        }
-        path.addFiles(classPathString);
-
-        return new ClassPath(path.toArray(new String[path.size()]));
-    }
-
-    /**
-     * Create a BatchEnvironment for rmic with the given class path,
-     * stream for messages and Main.
-     */
-    public BatchEnvironment(OutputStream out, ClassPath path, Main main) {
-        super(out, new ClassPath(""), path);
-                                // use empty "sourcePath" (see 4666958)
-        this.main = main;
-    }
-
-    /**
-     * Get the instance of Main which created this environment.
-     */
-    public Main getMain() {
-        return main;
-    }
-
-    /**
-     * Get the ClassPath.
-     */
-    public ClassPath getClassPath() {
-        return binaryPath;
-    }
-
-    /** list of generated source files created in this environment */
-    private Vector<File> generatedFiles = new Vector<>();
-
-    /**
-     * Remember a generated source file generated so that it
-     * can be removed later, if appropriate.
-     */
-    public void addGeneratedFile(File file) {
-        generatedFiles.addElement(file);
-    }
-
-    /**
-     * Delete all the generated source files made during the execution
-     * of this environment (those that have been registered with the
-     * "addGeneratedFile" method).
-     */
-    public void deleteGeneratedFiles() {
-        synchronized(generatedFiles) {
-            Enumeration<File> enumeration = generatedFiles.elements();
-            while (enumeration.hasMoreElements()) {
-                File file = enumeration.nextElement();
-                file.delete();
-            }
-            generatedFiles.removeAllElements();
-        }
-    }
-
-    /**
-     * Release resources, if any.
-     */
-    public void shutdown() {
-        main = null;
-        generatedFiles = null;
-        super.shutdown();
-    }
-
-    /**
-     * Return the formatted, localized string for a named error message
-     * and supplied arguments.  For rmic error messages, with names that
-     * being with "rmic.", look up the error message in rmic's resource
-     * bundle; otherwise, defer to java's superclass method.
-     */
-    public String errorString(String err,
-                              Object arg0, Object arg1, Object arg2)
-    {
-        if (err.startsWith("rmic.") || err.startsWith("warn.rmic.")) {
-            String result =  Main.getText(err,
-                                          (arg0 != null ? arg0.toString() : null),
-                                          (arg1 != null ? arg1.toString() : null),
-                                          (arg2 != null ? arg2.toString() : null));
-
-            if (err.startsWith("warn.")) {
-                result = "warning: " + result;
-            }
-            return result;
-        } else {
-            return super.errorString(err, arg0, arg1, arg2);
-        }
-    }
-    public void reset() {
-    }
-
-    /**
-     * Utility for building paths of directories and JAR files.  This
-     * class was copied from com.sun.tools.javac.util.Paths as part of
-     * the fix for 6473331, which adds support for Class-Path manifest
-     * entries in JAR files.  Diagnostic code is simply commented out
-     * because rmic silently ignored these conditions historically.
-     */
-    private static class Path extends LinkedHashSet<String> {
-        private static final long serialVersionUID = 0;
-        private static final boolean warn = false;
-
-        private static class PathIterator implements Collection<String> {
-            private int pos = 0;
-            private final String path;
-            private final String emptyPathDefault;
-
-            public PathIterator(String path, String emptyPathDefault) {
-                this.path = path;
-                this.emptyPathDefault = emptyPathDefault;
-            }
-            public PathIterator(String path) { this(path, null); }
-            public Iterator<String> iterator() {
-                return new Iterator<String>() {
-                    public boolean hasNext() {
-                        return pos <= path.length();
-                    }
-                    public String next() {
-                        int beg = pos;
-                        int end = path.indexOf(File.pathSeparator, beg);
-                        if (end == -1)
-                            end = path.length();
-                        pos = end + 1;
-
-                        if (beg == end && emptyPathDefault != null)
-                            return emptyPathDefault;
-                        else
-                            return path.substring(beg, end);
-                    }
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-                };
-            }
-
-            // required for Collection.
-            public int size() {
-                throw new UnsupportedOperationException();
-            }
-            public boolean isEmpty() {
-                throw new UnsupportedOperationException();
-            }
-            public boolean contains(Object o) {
-                throw new UnsupportedOperationException();
-            }
-            public Object[] toArray() {
-                throw new UnsupportedOperationException();
-            }
-            public <T> T[] toArray(T[] a) {
-                throw new UnsupportedOperationException();
-            }
-            public boolean add(String o) {
-                throw new UnsupportedOperationException();
-            }
-            public boolean remove(Object o) {
-                throw new UnsupportedOperationException();
-            }
-            public boolean containsAll(Collection<?> c) {
-                throw new UnsupportedOperationException();
-            }
-            public boolean addAll(Collection<? extends String> c) {
-                throw new UnsupportedOperationException();
-            }
-            public boolean removeAll(Collection<?> c) {
-                throw new UnsupportedOperationException();
-            }
-            public boolean retainAll(Collection<?> c) {
-                throw new UnsupportedOperationException();
-            }
-            public void clear() {
-                throw new UnsupportedOperationException();
-            }
-            public boolean equals(Object o) {
-                throw new UnsupportedOperationException();
-            }
-            public int hashCode() {
-                throw new UnsupportedOperationException();
-            }
-        }
-
-        /** Is this the name of a zip file? */
-        private static boolean isZip(String name) {
-            return new File(name).isFile();
-        }
-
-        private boolean expandJarClassPaths = false;
-
-        public Path expandJarClassPaths(boolean x) {
-            expandJarClassPaths = x;
-            return this;
-        }
-
-        /** What to use when path element is the empty string */
-        private String emptyPathDefault = null;
-
-        public Path emptyPathDefault(String x) {
-            emptyPathDefault = x;
-            return this;
-        }
-
-        public Path() { super(); }
-
-        public Path addDirectories(String dirs, boolean warn) {
-            if (dirs != null)
-                for (String dir : new PathIterator(dirs))
-                    addDirectory(dir, warn);
-            return this;
-        }
-
-        public Path addDirectories(String dirs) {
-            return addDirectories(dirs, warn);
-        }
-
-        private void addDirectory(String dir, boolean warn) {
-            if (! new File(dir).isDirectory()) {
-//              if (warn)
-//                  log.warning(Position.NOPOS,
-//                              "dir.path.element.not.found", dir);
-                return;
-            }
-
-            for (String direntry : new File(dir).list()) {
-                String canonicalized = direntry.toLowerCase();
-                if (canonicalized.endsWith(".jar") ||
-                    canonicalized.endsWith(".zip"))
-                    addFile(dir + File.separator + direntry, warn);
-            }
-        }
-
-        public Path addFiles(String files, boolean warn) {
-            if (files != null)
-                for (String file : new PathIterator(files, emptyPathDefault))
-                    addFile(file, warn);
-            return this;
-        }
-
-        public Path addFiles(String files) {
-            return addFiles(files, warn);
-        }
-
-        private void addFile(String file, boolean warn) {
-            if (contains(file)) {
-                /* Discard duplicates and avoid infinite recursion */
-                return;
-            }
-
-            File ele = new File(file);
-            if (! ele.exists()) {
-                /* No such file or directory exist */
-                if (warn)
-//                      log.warning(Position.NOPOS,
-//                          "path.element.not.found", file);
-                    return;
-            }
-
-            if (ele.isFile()) {
-                /* File is an ordinay file  */
-                String arcname = file.toLowerCase();
-                if (! (arcname.endsWith(".zip") ||
-                       arcname.endsWith(".jar"))) {
-                    /* File name don't have right extension */
-//                      if (warn)
-//                          log.warning(Position.NOPOS,
-//                              "invalid.archive.file", file);
-                    return;
-                }
-            }
-
-            /* Now what we have left is either a directory or a file name
-               confirming to archive naming convention */
-
-            super.add(file);
-            if (expandJarClassPaths && isZip(file))
-                addJarClassPath(file, warn);
-        }
-
-        // Adds referenced classpath elements from a jar's Class-Path
-        // Manifest entry.  In some future release, we may want to
-        // update this code to recognize URLs rather than simple
-        // filenames, but if we do, we should redo all path-related code.
-        private void addJarClassPath(String jarFileName, boolean warn) {
-            try {
-                String jarParent = new File(jarFileName).getParent();
-                JarFile jar = new JarFile(jarFileName);
-
-                try {
-                    Manifest man = jar.getManifest();
-                    if (man == null) return;
-
-                    Attributes attr = man.getMainAttributes();
-                    if (attr == null) return;
-
-                    String path = attr.getValue(Attributes.Name.CLASS_PATH);
-                    if (path == null) return;
-
-                    for (StringTokenizer st = new StringTokenizer(path);
-                        st.hasMoreTokens();) {
-                        String elt = st.nextToken();
-                        if (jarParent != null)
-                            elt = new File(jarParent, elt).getCanonicalPath();
-                        addFile(elt, warn);
-                    }
-                } finally {
-                    jar.close();
-                }
-            } catch (IOException e) {
-//              log.error(Position.NOPOS,
-//                        "error.reading.file", jarFileName,
-//                        e.getLocalizedMessage());
-            }
-        }
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/Constants.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.rmi.rmic;
-
-import sun.tools.java.Identifier;
-
-/**
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public interface Constants extends sun.tools.java.Constants {
-
-    /*
-     * Identifiers potentially useful for all Generators
-     */
-    public static final Identifier idRemote =
-        Identifier.lookup("java.rmi.Remote");
-    public static final Identifier idRemoteException =
-        Identifier.lookup("java.rmi.RemoteException");
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/Generator.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 1998, 2007, 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.
- */
-
-/*
- * Licensed Materials - Property of IBM
- * RMI-IIOP v1.0
- * Copyright IBM Corp. 1998 1999  All Rights Reserved
- *
- */
-
-package sun.rmi.rmic;
-
-import java.io.File;
-import sun.tools.java.ClassDefinition;
-
-/**
- * Generator defines the protocol for back-end implementations to be added
- * to rmic.  See the rmic.properties file for a description of the format for
- * adding new Generators to rmic.
- * <p>
- * Classes implementing this interface must have a public default constructor
- * which should set any required arguments to their defaults.  When Main
- * encounters a command line argument which maps to a specific Generator
- * subclass, it will instantiate one and call parseArgs(...).  At some later
- * point, Main will invoke the generate(...) method once for _each_ class passed
- * on the command line.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- *
- * @author      Bryan Atsatt
- */
-public interface Generator {
-
-    /**
-     * Examine and consume command line arguments.
-     * @param argv The command line arguments. Ignore null
-     * and unknown arguments. Set each consumed argument to null.
-     * @param main Report any errors using the main.error() methods.
-     * @return true if no errors, false otherwise.
-     */
-    public boolean parseArgs(String argv[], Main main);
-
-    /**
-     * Generate output. Any source files created which need compilation should
-     * be added to the compiler environment using the addGeneratedFile(File)
-     * method.
-     *
-     * @param env       The compiler environment
-     * @param cdef      The definition for the implementation class or interface from
-     *              which to generate output
-     * @param destDir   The directory for the root of the package hierarchy
-     *                          for generated files. May be null.
-     */
-    public void generate(BatchEnvironment env, ClassDefinition cdef, File destDir);
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/IndentingWriter.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,299 +0,0 @@
-/*
- * Copyright (c) 1997, 2007, 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.
- */
-
-/*****************************************************************************/
-/*                    Copyright (c) IBM Corporation 1998                     */
-/*                                                                           */
-/* (C) Copyright IBM Corp. 1998                                              */
-/*                                                                           */
-/*****************************************************************************/
-
-package sun.rmi.rmic;
-
-import java.io.Writer;
-import java.io.BufferedWriter;
-import java.io.IOException;
-
-/**
- * IndentingWriter is a BufferedWriter subclass that supports automatic
- * indentation of lines of text written to the underlying Writer.
- *
- * Methods are provided for compact, convenient indenting, writing text,
- * and writing lines in various combinations.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public class IndentingWriter extends BufferedWriter {
-
-    /** true if the next character written is the first on a line */
-    private boolean beginningOfLine = true;
-
-    /** current number of spaces to prepend to lines */
-    private int currentIndent = 0;
-
-    /** number of spaces to change indent when indenting in or out */
-    private int indentStep = 4;
-
-    /** number of spaces to convert into tabs. Use MAX_VALUE to disable */
-    private int tabSize = 8;
-
-    /**
-     * Create a new IndentingWriter that writes indented text to the
-     * given Writer.  Use the default indent step of four spaces.
-     */
-    public IndentingWriter(Writer out) {
-        super(out);
-    }
-
-    /**
-     * Create a new IndentingWriter that writes indented text to the
-     * given Writer and uses the supplied indent step.
-     */
-    public IndentingWriter(Writer out, int step) {
-        this(out);
-
-        if (indentStep < 0)
-            throw new IllegalArgumentException("negative indent step");
-
-        indentStep = step;
-    }
-
-    /**
-     * Create a new IndentingWriter that writes indented text to the
-     * given Writer and uses the supplied indent step and tab size.
-     */
-    public IndentingWriter(Writer out, int step, int tabSize) {
-        this(out);
-
-        if (indentStep < 0)
-            throw new IllegalArgumentException("negative indent step");
-
-        indentStep = step;
-        this.tabSize = tabSize;
-    }
-
-    /**
-     * Write a single character.
-     */
-    public void write(int c) throws IOException {
-        checkWrite();
-        super.write(c);
-    }
-
-    /**
-     * Write a portion of an array of characters.
-     */
-    public void write(char[] cbuf, int off, int len) throws IOException {
-        if (len > 0) {
-            checkWrite();
-        }
-        super.write(cbuf, off, len);
-    }
-
-    /**
-     * Write a portion of a String.
-     */
-    public void write(String s, int off, int len) throws IOException {
-        if (len > 0) {
-            checkWrite();
-        }
-        super.write(s, off, len);
-    }
-
-    /**
-     * Write a line separator.  The next character written will be
-     * preceded by an indent.
-     */
-    public void newLine() throws IOException {
-        super.newLine();
-        beginningOfLine = true;
-    }
-
-    /**
-     * Check if an indent needs to be written before writing the next
-     * character.
-     *
-     * The indent generation is optimized (and made consistent with
-     * certain coding conventions) by condensing groups of eight spaces
-     * into tab characters.
-     */
-    protected void checkWrite() throws IOException {
-        if (beginningOfLine) {
-            beginningOfLine = false;
-            int i = currentIndent;
-            while (i >= tabSize) {
-                super.write('\t');
-                i -= tabSize;
-            }
-            while (i > 0) {
-                super.write(' ');
-                -- i;
-            }
-        }
-    }
-
-    /**
-     * Increase the current indent by the indent step.
-     */
-    protected void indentIn() {
-        currentIndent += indentStep;
-    }
-
-    /**
-     * Decrease the current indent by the indent step.
-     */
-    protected void indentOut() {
-        currentIndent -= indentStep;
-        if (currentIndent < 0)
-            currentIndent = 0;
-    }
-
-    /**
-     * Indent in.
-     */
-    public void pI() {
-        indentIn();
-    }
-
-    /**
-     * Indent out.
-     */
-    public void pO() {
-        indentOut();
-    }
-
-    /**
-     * Write string.
-     */
-    public void p(String s) throws IOException {
-        write(s);
-    }
-
-    /**
-     * End current line.
-     */
-    public void pln() throws IOException {
-        newLine();
-    }
-
-    /**
-     * Write string; end current line.
-     */
-    public void pln(String s) throws IOException {
-        p(s);
-        pln();
-    }
-
-    /**
-     * Write string; end current line; indent in.
-     */
-    public void plnI(String s) throws IOException {
-        p(s);
-        pln();
-        pI();
-    }
-
-    /**
-     * Indent out; write string.
-     */
-    public void pO(String s) throws IOException {
-        pO();
-        p(s);
-    }
-
-    /**
-     * Indent out; write string; end current line.
-     */
-    public void pOln(String s) throws IOException {
-        pO(s);
-        pln();
-    }
-
-    /**
-     * Indent out; write string; end current line; indent in.
-     *
-     * This method is useful for generating lines of code that both
-     * end and begin nested blocks, like "} else {".
-     */
-    public void pOlnI(String s) throws IOException {
-        pO(s);
-        pln();
-        pI();
-    }
-
-    /**
-     * Write Object.
-     */
-    public void p(Object o) throws IOException {
-        write(o.toString());
-    }
-    /**
-     * Write Object; end current line.
-     */
-    public void pln(Object o) throws IOException {
-        p(o.toString());
-        pln();
-    }
-
-    /**
-     * Write Object; end current line; indent in.
-     */
-    public void plnI(Object o) throws IOException {
-        p(o.toString());
-        pln();
-        pI();
-    }
-
-    /**
-     * Indent out; write Object.
-     */
-    public void pO(Object o) throws IOException {
-        pO();
-        p(o.toString());
-    }
-
-    /**
-     * Indent out; write Object; end current line.
-     */
-    public void pOln(Object o) throws IOException {
-        pO(o.toString());
-        pln();
-    }
-
-    /**
-     * Indent out; write Object; end current line; indent in.
-     *
-     * This method is useful for generating lines of code that both
-     * end and begin nested blocks, like "} else {".
-     */
-    public void pOlnI(Object o) throws IOException {
-        pO(o.toString());
-        pln();
-        pI();
-    }
-
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/Main.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,857 +0,0 @@
-/*
- * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  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.
- */
-
-/*
- * Licensed Materials - Property of IBM
- * RMI-IIOP v1.0
- * Copyright IBM Corp. 1998 1999  All Rights Reserved
- *
- */
-
-package sun.rmi.rmic;
-
-import java.util.Vector;
-import java.util.Enumeration;
-import java.util.ResourceBundle;
-import java.util.StringTokenizer;
-import java.util.MissingResourceException;
-
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.IOException;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.ByteArrayOutputStream;
-
-import sun.tools.java.ClassFile;
-import sun.tools.java.ClassDefinition;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.ClassNotFound;
-import sun.tools.java.Identifier;
-import sun.tools.java.ClassPath;
-
-import sun.tools.javac.SourceClass;
-import sun.tools.util.CommandLine;
-import java.lang.reflect.Constructor;
-import java.util.Properties;
-
-/**
- * Main "rmic" program.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public class Main implements sun.rmi.rmic.Constants {
-    String sourcePathArg;
-    String sysClassPathArg;
-    String classPathString;
-    File destDir;
-    int flags;
-    long tm;
-    Vector<String> classes;
-    boolean nowrite;
-    boolean nocompile;
-    boolean keepGenerated;
-    boolean status;
-    String[] generatorArgs;
-    Vector<Generator> generators;
-    Class<? extends BatchEnvironment> environmentClass =
-        BatchEnvironment.class;
-    /**
-     * Name of the program.
-     */
-    String program;
-
-    /**
-     * The stream where error message are printed.
-     */
-    OutputStream out;
-
-    /**
-     * Constructor.
-     */
-    public Main(OutputStream out, String program) {
-        this.out = out;
-        this.program = program;
-    }
-
-    /**
-     * Output a message.
-     */
-    public void output(String msg) {
-        PrintStream out =
-            this.out instanceof PrintStream ? (PrintStream)this.out
-            : new PrintStream(this.out, true);
-        out.println(msg);
-    }
-
-    /**
-     * Top level error message.  This method is called when the
-     * environment could not be set up yet.
-     */
-    public void error(String msg) {
-        output(getText(msg));
-    }
-
-    public void error(String msg, String arg1) {
-        output(getText(msg, arg1));
-    }
-
-    public void error(String msg, String arg1, String arg2) {
-        output(getText(msg, arg1, arg2));
-    }
-
-    /**
-     * Usage
-     */
-    public void usage() {
-        error("rmic.usage", program);
-    }
-
-    /**
-     * Run the compiler
-     */
-    public synchronized boolean compile(String argv[]) {
-
-        if (!parseArgs(argv)) {
-            return false;
-        }
-
-        if (classes.size() == 0) {
-            usage();
-            return false;
-        }
-
-        if ((flags & F_WARNINGS) != 0) {
-            for (Generator g : generators) {
-                if (g instanceof RMIGenerator) {
-                    output(getText("rmic.jrmp.stubs.deprecated", program));
-                    break;
-                }
-            }
-        }
-
-        return doCompile();
-    }
-
-    /**
-     * Get the destination directory.
-     */
-    public File getDestinationDir() {
-        return destDir;
-    }
-
-    /**
-     * Parse the arguments for compile.
-     */
-    public boolean parseArgs(String argv[]) {
-        sourcePathArg = null;
-        sysClassPathArg = null;
-
-        classPathString = null;
-        destDir = null;
-        flags = F_WARNINGS;
-        tm = System.currentTimeMillis();
-        classes = new Vector<>();
-        nowrite = false;
-        nocompile = false;
-        keepGenerated = false;
-        generatorArgs = getArray("generator.args",true);
-        if (generatorArgs == null) {
-            return false;
-        }
-        generators = new Vector<>();
-
-        // Pre-process command line for @file arguments
-        try {
-            argv = CommandLine.parse(argv);
-        } catch (FileNotFoundException e) {
-            error("rmic.cant.read", e.getMessage());
-            return false;
-        } catch (IOException e) {
-            e.printStackTrace(out instanceof PrintStream ?
-                              (PrintStream) out :
-                              new PrintStream(out, true));
-            return false;
-        }
-
-        // Parse arguments
-        for (int i = 0 ; i < argv.length ; i++) {
-            if (argv[i] != null) {
-                if (argv[i].equals("-g")) {
-                    flags &= ~F_OPT;
-                    flags |= F_DEBUG_LINES | F_DEBUG_VARS;
-                    argv[i] = null;
-                } else if (argv[i].equals("-O")) {
-                    flags &= ~F_DEBUG_LINES;
-                    flags &= ~F_DEBUG_VARS;
-                    flags |= F_OPT | F_DEPENDENCIES;
-                    argv[i] = null;
-                } else if (argv[i].equals("-nowarn")) {
-                    flags &= ~F_WARNINGS;
-                    argv[i] = null;
-                } else if (argv[i].equals("-debug")) {
-                    flags |= F_DUMP;
-                    argv[i] = null;
-                } else if (argv[i].equals("-depend")) {
-                    flags |= F_DEPENDENCIES;
-                    argv[i] = null;
-                } else if (argv[i].equals("-verbose")) {
-                    flags |= F_VERBOSE;
-                    argv[i] = null;
-                } else if (argv[i].equals("-nowrite")) {
-                    nowrite = true;
-                    argv[i] = null;
-                } else if (argv[i].equals("-Xnocompile")) {
-                    nocompile = true;
-                    keepGenerated = true;
-                    argv[i] = null;
-                } else if (argv[i].equals("-keep") ||
-                           argv[i].equals("-keepgenerated")) {
-                    keepGenerated = true;
-                    argv[i] = null;
-                } else if (argv[i].equals("-show")) {
-                    error("rmic.option.unsupported", "-show");
-                    usage();
-                    return false;
-                } else if (argv[i].equals("-classpath")) {
-                    if ((i + 1) < argv.length) {
-                        if (classPathString != null) {
-                            error("rmic.option.already.seen", "-classpath");
-                            usage();
-                            return false;
-                        }
-                        argv[i] = null;
-                        classPathString = argv[++i];
-                        argv[i] = null;
-                    } else {
-                        error("rmic.option.requires.argument", "-classpath");
-                        usage();
-                        return false;
-                    }
-                } else if (argv[i].equals("-sourcepath")) {
-                    if ((i + 1) < argv.length) {
-                        if (sourcePathArg != null) {
-                            error("rmic.option.already.seen", "-sourcepath");
-                            usage();
-                            return false;
-                        }
-                        argv[i] = null;
-                        sourcePathArg = argv[++i];
-                        argv[i] = null;
-                    } else {
-                        error("rmic.option.requires.argument", "-sourcepath");
-                        usage();
-                        return false;
-                    }
-                } else if (argv[i].equals("-bootclasspath")) {
-                    if ((i + 1) < argv.length) {
-                        if (sysClassPathArg != null) {
-                            error("rmic.option.already.seen", "-bootclasspath");
-                            usage();
-                            return false;
-                        }
-                        argv[i] = null;
-                        sysClassPathArg = argv[++i];
-                        argv[i] = null;
-                    } else {
-                        error("rmic.option.requires.argument", "-bootclasspath");
-                        usage();
-                        return false;
-                    }
-                } else if (argv[i].equals("-d")) {
-                    if ((i + 1) < argv.length) {
-                        if (destDir != null) {
-                            error("rmic.option.already.seen", "-d");
-                            usage();
-                            return false;
-                        }
-                        argv[i] = null;
-                        destDir = new File(argv[++i]);
-                        argv[i] = null;
-                        if (!destDir.exists()) {
-                            error("rmic.no.such.directory", destDir.getPath());
-                            usage();
-                            return false;
-                        }
-                    } else {
-                        error("rmic.option.requires.argument", "-d");
-                        usage();
-                        return false;
-                    }
-                } else {
-                    if (!checkGeneratorArg(argv,i)) {
-                        usage();
-                        return false;
-                    }
-                }
-            }
-        }
-
-
-        // Now that all generators have had a chance at the args,
-        // scan what's left for classes and illegal args...
-
-        for (int i = 0; i < argv.length; i++) {
-            if (argv[i] != null) {
-                if (argv[i].startsWith("-")) {
-                    error("rmic.no.such.option", argv[i]);
-                    usage();
-                    return false;
-                } else {
-                    classes.addElement(argv[i]);
-                }
-            }
-        }
-
-
-        // If the generators vector is empty, add the default generator...
-
-        if (generators.size() == 0) {
-            addGenerator("default");
-        }
-
-        return true;
-    }
-
-    /**
-     * If this argument is for a generator, instantiate it, call
-     * parseArgs(...) and add generator to generators vector.
-     * Returns false on error.
-     */
-    protected boolean checkGeneratorArg(String[] argv, int currentIndex) {
-        boolean result = true;
-        if (argv[currentIndex].startsWith("-")) {
-            String arg = argv[currentIndex].substring(1).toLowerCase(); // Remove '-'
-            for (int i = 0; i < generatorArgs.length; i++) {
-                if (arg.equalsIgnoreCase(generatorArgs[i])) {
-                    // Got a match, add Generator and call parseArgs...
-                    Generator gen = addGenerator(arg);
-                    if (gen == null) {
-                        return false;
-                    }
-                    result = gen.parseArgs(argv,this);
-                    break;
-                }
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Instantiate and add a generator to the generators array.
-     */
-    protected Generator addGenerator(String arg) {
-
-        Generator gen;
-
-        // Create an instance of the generator and add it to
-        // the array...
-
-        String className = getString("generator.class." + arg);
-        if (className == null) {
-            error("rmic.missing.property",arg);
-            return null;
-        }
-
-        try {
-            gen = (Generator) Class.forName(className).newInstance();
-        } catch (Exception e) {
-            error("rmic.cannot.instantiate",className);
-            return null;
-        }
-
-        generators.addElement(gen);
-
-        // Get the environment required by this generator...
-
-        Class<?> envClass = BatchEnvironment.class;
-        String env = getString("generator.env." + arg);
-        if (env != null) {
-            try {
-                envClass = Class.forName(env);
-
-                // Is the new class a subclass of the current one?
-
-                if (environmentClass.isAssignableFrom(envClass)) {
-
-                    // Yes, so switch to the new one...
-
-                    environmentClass = envClass.asSubclass(BatchEnvironment.class);
-
-                } else {
-
-                    // No. Is the current class a subclass of the
-                    // new one?
-
-                    if (!envClass.isAssignableFrom(environmentClass)) {
-
-                        // No, so it's a conflict...
-
-                        error("rmic.cannot.use.both",environmentClass.getName(),envClass.getName());
-                        return null;
-                    }
-                }
-            } catch (ClassNotFoundException e) {
-                error("rmic.class.not.found",env);
-                return null;
-            }
-        }
-
-        return gen;
-    }
-
-    /**
-     * Grab a resource string and parse it into an array of strings. Assumes
-     * comma separated list.
-     * @param name The resource name.
-     * @param mustExist If true, throws error if resource does not exist. If
-     * false and resource does not exist, returns zero element array.
-     */
-    protected String[] getArray(String name, boolean mustExist) {
-        String[] result = null;
-        String value = getString(name);
-        if (value == null) {
-            if (mustExist) {
-                error("rmic.resource.not.found",name);
-                return null;
-            } else {
-                return new String[0];
-            }
-        }
-
-        StringTokenizer parser = new StringTokenizer(value,", \t\n\r", false);
-        int count = parser.countTokens();
-        result = new String[count];
-        for (int i = 0; i < count; i++) {
-            result[i] = parser.nextToken();
-        }
-
-        return result;
-    }
-
-    /**
-     * Get the correct type of BatchEnvironment
-     */
-    public BatchEnvironment getEnv() {
-
-        ClassPath classPath =
-            BatchEnvironment.createClassPath(classPathString,
-                                             sysClassPathArg);
-        BatchEnvironment result = null;
-        try {
-            Class<?>[] ctorArgTypes = {OutputStream.class,ClassPath.class,Main.class};
-            Object[] ctorArgs = {out,classPath,this};
-            Constructor<? extends BatchEnvironment> constructor =
-                environmentClass.getConstructor(ctorArgTypes);
-            result =  constructor.newInstance(ctorArgs);
-            result.reset();
-        }
-        catch (Exception e) {
-            error("rmic.cannot.instantiate",environmentClass.getName());
-        }
-        return result;
-    }
-
-
-    /**
-     * Do the compile with the switches and files already supplied
-     */
-    public boolean doCompile() {
-        // Create batch environment
-        BatchEnvironment env = getEnv();
-        env.flags |= flags;
-
-        // Set the classfile version numbers
-        // Compat and 1.1 stubs must retain the old version number.
-        env.majorVersion = 45;
-        env.minorVersion = 3;
-
-        // Preload the "out of memory" error string just in case we run
-        // out of memory during the compile.
-        String noMemoryErrorString = getText("rmic.no.memory");
-        String stackOverflowErrorString = getText("rmic.stack.overflow");
-
-        try {
-            /** Load the classes on the command line
-             * Replace the entries in classes with the ClassDefinition for the class
-             */
-            for (int i = classes.size()-1; i >= 0; i-- ) {
-                Identifier implClassName =
-                    Identifier.lookup(classes.elementAt(i));
-
-                /*
-                 * Fix bugid 4049354: support using '.' as an inner class
-                 * qualifier on the command line (previously, only mangled
-                 * inner class names were understood, like "pkg.Outer$Inner").
-                 *
-                 * The following method, also used by "javap", resolves the
-                 * given unmangled inner class name to the appropriate
-                 * internal identifier.  For example, it translates
-                 * "pkg.Outer.Inner" to "pkg.Outer. Inner".
-                 */
-                implClassName = env.resolvePackageQualifiedName(implClassName);
-                /*
-                 * But if we use such an internal inner class name identifier
-                 * to load the class definition, the Java compiler will notice
-                 * if the impl class is a "private" inner class and then deny
-                 * skeletons (needed unless "-v1.2" is used) the ability to
-                 * cast to it.  To work around this problem, we mangle inner
-                 * class name identifiers to their binary "outer" class name:
-                 * "pkg.Outer. Inner" becomes "pkg.Outer$Inner".
-                 */
-                implClassName = Names.mangleClass(implClassName);
-
-                ClassDeclaration decl = env.getClassDeclaration(implClassName);
-                try {
-                    ClassDefinition def = decl.getClassDefinition(env);
-                    for (int j = 0; j < generators.size(); j++) {
-                        Generator gen = generators.elementAt(j);
-                        gen.generate(env, def, destDir);
-                    }
-                } catch (ClassNotFound ex) {
-                    env.error(0, "rmic.class.not.found", implClassName);
-                }
-
-            }
-
-            // compile all classes that need compilation
-            if (!nocompile) {
-                compileAllClasses(env);
-            }
-        } catch (OutOfMemoryError ee) {
-            // The compiler has run out of memory.  Use the error string
-            // which we preloaded.
-            env.output(noMemoryErrorString);
-            return false;
-        } catch (StackOverflowError ee) {
-            env.output(stackOverflowErrorString);
-            return false;
-        } catch (Error ee) {
-            // We allow the compiler to take an exception silently if a program
-            // error has previously been detected.  Presumably, this makes the
-            // compiler more robust in the face of bad error recovery.
-            if (env.nerrors == 0 || env.dump()) {
-                env.error(0, "fatal.error");
-                ee.printStackTrace(out instanceof PrintStream ?
-                                   (PrintStream) out :
-                                   new PrintStream(out, true));
-            }
-        } catch (Exception ee) {
-            if (env.nerrors == 0 || env.dump()) {
-                env.error(0, "fatal.exception");
-                ee.printStackTrace(out instanceof PrintStream ?
-                                   (PrintStream) out :
-                                   new PrintStream(out, true));
-            }
-        }
-
-        env.flushErrors();
-
-        boolean status = true;
-        if (env.nerrors > 0) {
-            String msg = "";
-            if (env.nerrors > 1) {
-                msg = getText("rmic.errors", env.nerrors);
-            } else {
-                msg = getText("rmic.1error");
-            }
-            if (env.nwarnings > 0) {
-                if (env.nwarnings > 1) {
-                    msg += ", " + getText("rmic.warnings", env.nwarnings);
-                } else {
-                    msg += ", " + getText("rmic.1warning");
-                }
-            }
-            output(msg);
-            status = false;
-        } else {
-            if (env.nwarnings > 0) {
-                if (env.nwarnings > 1) {
-                    output(getText("rmic.warnings", env.nwarnings));
-                } else {
-                    output(getText("rmic.1warning"));
-                }
-            }
-        }
-
-        // last step is to delete generated source files
-        if (!keepGenerated) {
-            env.deleteGeneratedFiles();
-        }
-
-        // We're done
-        if (env.verbose()) {
-            tm = System.currentTimeMillis() - tm;
-            output(getText("rmic.done_in", Long.toString(tm)));
-        }
-
-        // Shutdown the environment object and release our resources.
-        // Note that while this is unneccessary when rmic is invoked
-        // the command line, there are environments in which rmic
-        // from is invoked within a server process, so resource
-        // reclamation is important...
-
-        env.shutdown();
-
-        sourcePathArg = null;
-        sysClassPathArg = null;
-        classPathString = null;
-        destDir = null;
-        classes = null;
-        generatorArgs = null;
-        generators = null;
-        environmentClass = null;
-        program = null;
-        out = null;
-
-        return status;
-    }
-
-    /*
-     * Compile all classes that need to be compiled.
-     */
-    public void compileAllClasses (BatchEnvironment env)
-        throws ClassNotFound,
-               IOException,
-               InterruptedException {
-        ByteArrayOutputStream buf = new ByteArrayOutputStream(4096);
-        boolean done;
-
-        do {
-            done = true;
-            for (Enumeration<?> e = env.getClasses() ; e.hasMoreElements() ; ) {
-                ClassDeclaration c = (ClassDeclaration)e.nextElement();
-                done = compileClass(c,buf,env);
-            }
-        } while (!done);
-    }
-
-    /*
-     * Compile a single class.
-     * Fallthrough is intentional
-     */
-    @SuppressWarnings({"fallthrough", "deprecation"})
-    public boolean compileClass (ClassDeclaration c,
-                                 ByteArrayOutputStream buf,
-                                 BatchEnvironment env)
-        throws ClassNotFound,
-               IOException,
-               InterruptedException {
-        boolean done = true;
-        env.flushErrors();
-        SourceClass src;
-
-        switch (c.getStatus()) {
-        case CS_UNDEFINED:
-            {
-                if (!env.dependencies()) {
-                    break;
-                }
-                // fall through
-            }
-
-        case CS_SOURCE:
-            {
-                done = false;
-                env.loadDefinition(c);
-                if (c.getStatus() != CS_PARSED) {
-                    break;
-                }
-                // fall through
-            }
-
-        case CS_PARSED:
-            {
-                if (c.getClassDefinition().isInsideLocal()) {
-                    break;
-                }
-                // If we get to here, then compilation is going
-                // to occur. If the -Xnocompile switch is set
-                // then fail. Note that this check is required
-                // here because this method is called from
-                // generators, not just from within this class...
-
-                if (nocompile) {
-                    throw new IOException("Compilation required, but -Xnocompile option in effect");
-                }
-
-                done = false;
-
-                src = (SourceClass)c.getClassDefinition(env);
-                src.check(env);
-                c.setDefinition(src, CS_CHECKED);
-                // fall through
-            }
-
-        case CS_CHECKED:
-            {
-                src = (SourceClass)c.getClassDefinition(env);
-                // bail out if there were any errors
-                if (src.getError()) {
-                    c.setDefinition(src, CS_COMPILED);
-                    break;
-                }
-                done = false;
-                buf.reset();
-                src.compile(buf);
-                c.setDefinition(src, CS_COMPILED);
-                src.cleanup(env);
-
-                if (src.getError() || nowrite) {
-                    break;
-                }
-
-                String pkgName = c.getName().getQualifier().toString().replace('.', File.separatorChar);
-                String className = c.getName().getFlatName().toString().replace('.', SIGC_INNERCLASS) + ".class";
-
-                File file;
-                if (destDir != null) {
-                    if (pkgName.length() > 0) {
-                        file = new File(destDir, pkgName);
-                        if (!file.exists()) {
-                            file.mkdirs();
-                        }
-                        file = new File(file, className);
-                    } else {
-                        file = new File(destDir, className);
-                    }
-                } else {
-                    ClassFile classfile = (ClassFile)src.getSource();
-                    if (classfile.isZipped()) {
-                        env.error(0, "cant.write", classfile.getPath());
-                        break;
-                    }
-                    file = new File(classfile.getPath());
-                    file = new File(file.getParent(), className);
-                }
-
-                // Create the file
-                try {
-                    FileOutputStream out = new FileOutputStream(file.getPath());
-                    buf.writeTo(out);
-                    out.close();
-                    if (env.verbose()) {
-                        output(getText("rmic.wrote", file.getPath()));
-                    }
-                } catch (IOException ee) {
-                    env.error(0, "cant.write", file.getPath());
-                }
-            }
-        }
-        return done;
-    }
-
-    /**
-     * Main program
-     */
-    public static void main(String argv[]) {
-        Main compiler = new Main(System.out, "rmic");
-        System.exit(compiler.compile(argv) ? 0 : 1);
-    }
-
-    /**
-     * Return the string value of a named resource in the rmic.properties
-     * resource bundle.  If the resource is not found, null is returned.
-     */
-    public static String getString(String key) {
-        if (!resourcesInitialized) {
-            initResources();
-        }
-
-        // To enable extensions, search the 'resourcesExt'
-        // bundle first, followed by the 'resources' bundle...
-
-        if (resourcesExt != null) {
-            try {
-                return resourcesExt.getString(key);
-            } catch (MissingResourceException e) {}
-        }
-
-        try {
-            return resources.getString(key);
-        } catch (MissingResourceException ignore) {
-        }
-        return null;
-    }
-
-    private static boolean resourcesInitialized = false;
-    private static ResourceBundle resources;
-    private static ResourceBundle resourcesExt = null;
-
-    private static void initResources() {
-        try {
-            resources =
-                ResourceBundle.getBundle("sun.rmi.rmic.resources.rmic");
-            resourcesInitialized = true;
-            try {
-                resourcesExt =
-                    ResourceBundle.getBundle("sun.rmi.rmic.resources.rmicext");
-            } catch (MissingResourceException e) {}
-        } catch (MissingResourceException e) {
-            throw new Error("fatal: missing resource bundle: " +
-                            e.getClassName());
-        }
-    }
-
-    public static String getText(String key) {
-        String message = getString(key);
-        if (message == null) {
-            message = "no text found: \"" + key + "\"";
-        }
-        return message;
-    }
-
-    public static String getText(String key, int num) {
-        return getText(key, Integer.toString(num), null, null);
-    }
-
-    public static String getText(String key, String arg0) {
-        return getText(key, arg0, null, null);
-    }
-
-    public static String getText(String key, String arg0, String arg1) {
-        return getText(key, arg0, arg1, null);
-    }
-
-    public static String getText(String key,
-                                 String arg0, String arg1, String arg2)
-    {
-        String format = getString(key);
-        if (format == null) {
-            format = "no text found: key = \"" + key + "\", " +
-                "arguments = \"{0}\", \"{1}\", \"{2}\"";
-        }
-
-        String[] args = new String[3];
-        args[0] = (arg0 != null ? arg0 : "null");
-        args[1] = (arg1 != null ? arg1 : "null");
-        args[2] = (arg2 != null ? arg2 : "null");
-
-        return java.text.MessageFormat.format(format, (Object[]) args);
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/Names.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.rmi.rmic;
-
-import sun.tools.java.Identifier;
-
-/**
- * Names provides static utility methods used by other rmic classes
- * for dealing with identifiers.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public class Names {
-
-    /**
-     * Return stub class name for impl class name.
-     */
-    static final public Identifier stubFor(Identifier name) {
-        return Identifier.lookup(name + "_Stub");
-    }
-
-    /**
-     * Return skeleton class name for impl class name.
-     */
-    static final public Identifier skeletonFor(Identifier name) {
-        return Identifier.lookup(name + "_Skel");
-    }
-
-    /**
-     * If necessary, convert a class name to its mangled form, i.e. the
-     * non-inner class name used in the binary representation of
-     * inner classes.  This is necessary to be able to name inner
-     * classes in the generated source code in places where the language
-     * does not permit it, such as when synthetically defining an inner
-     * class outside of its outer class, and for generating file names
-     * corresponding to inner classes.
-     *
-     * Currently this mangling involves modifying the internal names of
-     * inner classes by converting occurrences of ". " into "$".
-     *
-     * This code is taken from the "mangleInnerType" method of
-     * the "sun.tools.java.Type" class; this method cannot be accessed
-     * itself because it is package protected.
-     */
-    static final public Identifier mangleClass(Identifier className) {
-        if (!className.isInner())
-            return className;
-
-        /*
-         * Get '.' qualified inner class name (with outer class
-         * qualification and no package qualification) and replace
-         * each '.' with '$'.
-         */
-        Identifier mangled = Identifier.lookup(
-                                               className.getFlatName().toString()
-                                               .replace('.', sun.tools.java.Constants.SIGC_INNERCLASS));
-        if (mangled.isInner())
-            throw new Error("failed to mangle inner class name");
-
-        // prepend package qualifier back for returned identifier
-        return Identifier.lookup(className.getQualifier(), mangled);
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIConstants.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 1998, 2007, 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.
- */
-
-/*
- * Licensed Materials - Property of IBM
- * RMI-IIOP v1.0
- * Copyright IBM Corp. 1998 1999  All Rights Reserved
- *
- */
-
-package sun.rmi.rmic;
-
-import sun.tools.java.Identifier;
-
-/**
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public interface RMIConstants extends sun.rmi.rmic.Constants {
-
-    /*
-     * identifiers for RMI classes referenced by rmic
-     */
-    public static final Identifier idRemoteObject =
-        Identifier.lookup("java.rmi.server.RemoteObject");
-    public static final Identifier idRemoteStub =
-        Identifier.lookup("java.rmi.server.RemoteStub");
-    public static final Identifier idRemoteRef =
-        Identifier.lookup("java.rmi.server.RemoteRef");
-    public static final Identifier idOperation =
-        Identifier.lookup("java.rmi.server.Operation");
-    public static final Identifier idSkeleton =
-        Identifier.lookup("java.rmi.server.Skeleton");
-    public static final Identifier idSkeletonMismatchException =
-        Identifier.lookup("java.rmi.server.SkeletonMismatchException");
-    public static final Identifier idRemoteCall =
-        Identifier.lookup("java.rmi.server.RemoteCall");
-    public static final Identifier idMarshalException =
-        Identifier.lookup("java.rmi.MarshalException");
-    public static final Identifier idUnmarshalException =
-        Identifier.lookup("java.rmi.UnmarshalException");
-    public static final Identifier idUnexpectedException =
-        Identifier.lookup("java.rmi.UnexpectedException");
-
-    /*
-     * stub protocol versions
-     */
-    public static final int STUB_VERSION_1_1  = 1;
-    public static final int STUB_VERSION_FAT  = 2;
-    public static final int STUB_VERSION_1_2  = 3;
-
-    /** serialVersionUID for all stubs that can use 1.2 protocol */
-    public static final long STUB_SERIAL_VERSION_UID = 2;
-
-    /** version number used to seed interface hash computation */
-    public static final int INTERFACE_HASH_STUB_VERSION = 1;
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1279 +0,0 @@
-/*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  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.
- */
-
-/*****************************************************************************/
-/*                    Copyright (c) IBM Corporation 1998                     */
-/*                                                                           */
-/* (C) Copyright IBM Corp. 1998                                              */
-/*                                                                           */
-/*****************************************************************************/
-
-package sun.rmi.rmic;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-import sun.tools.java.Type;
-import sun.tools.java.Identifier;
-import sun.tools.java.ClassDefinition;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.ClassNotFound;
-import sun.tools.java.ClassFile;
-import sun.tools.java.MemberDefinition;
-
-/**
- * A Generator object will generate the Java source code of the stub
- * and skeleton classes for an RMI remote implementation class, using
- * a particular stub protocol version.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- *
- * @author      Peter Jones,  Bryan Atsatt
- */
-public class RMIGenerator implements RMIConstants, Generator {
-
-    private static final Hashtable<String, Integer> versionOptions = new Hashtable<>();
-    static {
-        versionOptions.put("-v1.1", STUB_VERSION_1_1);
-        versionOptions.put("-vcompat", STUB_VERSION_FAT);
-        versionOptions.put("-v1.2", STUB_VERSION_1_2);
-    }
-
-    /**
-     * Default constructor for Main to use.
-     */
-    public RMIGenerator() {
-        version = STUB_VERSION_1_2;     // default is -v1.2 (see 4638155)
-    }
-
-    /**
-     * Examine and consume command line arguments.
-     * @param argv The command line arguments. Ignore null
-     * and unknown arguments. Set each consumed argument to null.
-     * @param main Report any errors using the main.error() methods.
-     * @return true if no errors, false otherwise.
-     */
-    public boolean parseArgs(String argv[], Main main) {
-        String explicitVersion = null;
-        for (int i = 0; i < argv.length; i++) {
-            if (argv[i] != null) {
-                String arg = argv[i].toLowerCase();
-                if (versionOptions.containsKey(arg)) {
-                    if (explicitVersion != null &&
-                        !explicitVersion.equals(arg))
-                    {
-                        main.error("rmic.cannot.use.both",
-                                   explicitVersion, arg);
-                        return false;
-                    }
-                    explicitVersion = arg;
-                    version = versionOptions.get(arg);
-                    argv[i] = null;
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Generate the source files for the stub and/or skeleton classes
-     * needed by RMI for the given remote implementation class.
-     *
-     * @param env       compiler environment
-     * @param cdef      definition of remote implementation class
-     *                  to generate stubs and/or skeletons for
-     * @param destDir   directory for the root of the package hierarchy
-     *                  for generated files
-     */
-    public void generate(BatchEnvironment env, ClassDefinition cdef, File destDir) {
-        RemoteClass remoteClass = RemoteClass.forClass(env, cdef);
-        if (remoteClass == null)        // exit if an error occurred
-            return;
-
-        RMIGenerator gen;
-        try {
-            gen = new RMIGenerator(env, cdef, destDir, remoteClass, version);
-        } catch (ClassNotFound e) {
-            env.error(0, "rmic.class.not.found", e.name);
-            return;
-        }
-        gen.generate();
-    }
-
-    private void generate() {
-        env.addGeneratedFile(stubFile);
-
-        try {
-            IndentingWriter out = new IndentingWriter(
-                new OutputStreamWriter(new FileOutputStream(stubFile)));
-            writeStub(out);
-            out.close();
-            if (env.verbose()) {
-                env.output(Main.getText("rmic.wrote", stubFile.getPath()));
-            }
-            env.parseFile(ClassFile.newClassFile(stubFile));
-        } catch (IOException e) {
-            env.error(0, "cant.write", stubFile.toString());
-            return;
-        }
-
-        if (version == STUB_VERSION_1_1 ||
-            version == STUB_VERSION_FAT)
-        {
-            env.addGeneratedFile(skeletonFile);
-
-            try {
-                IndentingWriter out = new IndentingWriter(
-                    new OutputStreamWriter(
-                        new FileOutputStream(skeletonFile)));
-                writeSkeleton(out);
-                out.close();
-                if (env.verbose()) {
-                    env.output(Main.getText("rmic.wrote",
-                        skeletonFile.getPath()));
-                }
-                env.parseFile(ClassFile.newClassFile(skeletonFile));
-            } catch (IOException e) {
-                env.error(0, "cant.write", stubFile.toString());
-                return;
-            }
-        } else {
-            /*
-             * For bugid 4135136: if skeleton files are not being generated
-             * for this compilation run, delete old skeleton source or class
-             * files for this remote implementation class that were
-             * (presumably) left over from previous runs, to avoid user
-             * confusion from extraneous or inconsistent generated files.
-             */
-
-            File outputDir = Util.getOutputDirectoryFor(remoteClassName,destDir,env);
-            File skeletonClassFile = new File(outputDir,skeletonClassName.getName().toString() + ".class");
-
-            skeletonFile.delete();      // ignore failures (no big deal)
-            skeletonClassFile.delete();
-        }
-    }
-
-    /**
-     * Return the File object that should be used as the source file
-     * for the given Java class, using the supplied destination
-     * directory for the top of the package hierarchy.
-     */
-    protected static File sourceFileForClass(Identifier className,
-                                             Identifier outputClassName,
-                                             File destDir,
-                                             BatchEnvironment env)
-    {
-        File packageDir = Util.getOutputDirectoryFor(className,destDir,env);
-        String outputName = Names.mangleClass(outputClassName).getName().toString();
-
-        String outputFileName = outputName + ".java";
-        return new File(packageDir, outputFileName);
-    }
-
-
-    /** rmic environment for this object */
-    private BatchEnvironment env;
-
-    /** the remote class that this instance is generating code for */
-    private RemoteClass remoteClass;
-
-    /** version of the stub protocol to use in code generation */
-    private int version;
-
-    /** remote methods for remote class, indexed by operation number */
-    private RemoteClass.Method[] remoteMethods;
-
-    /**
-     * Names for the remote class and the stub and skeleton classes
-     * to be generated for it.
-     */
-    private Identifier remoteClassName;
-    private Identifier stubClassName;
-    private Identifier skeletonClassName;
-
-    private ClassDefinition cdef;
-    private File destDir;
-    private File stubFile;
-    private File skeletonFile;
-
-    /**
-     * Names to use for the java.lang.reflect.Method static fields
-     * corresponding to each remote method.
-     */
-    private String[] methodFieldNames;
-
-    /** cached definition for certain exception classes in this environment */
-    private ClassDefinition defException;
-    private ClassDefinition defRemoteException;
-    private ClassDefinition defRuntimeException;
-
-    /**
-     * Create a new stub/skeleton Generator object for the given
-     * remote implementation class to generate code according to
-     * the given stub protocol version.
-     */
-    private RMIGenerator(BatchEnvironment env, ClassDefinition cdef,
-                           File destDir, RemoteClass remoteClass, int version)
-        throws ClassNotFound
-    {
-        this.destDir     = destDir;
-        this.cdef        = cdef;
-        this.env         = env;
-        this.remoteClass = remoteClass;
-        this.version     = version;
-
-        remoteMethods = remoteClass.getRemoteMethods();
-
-        remoteClassName = remoteClass.getName();
-        stubClassName = Names.stubFor(remoteClassName);
-        skeletonClassName = Names.skeletonFor(remoteClassName);
-
-        methodFieldNames = nameMethodFields(remoteMethods);
-
-        stubFile = sourceFileForClass(remoteClassName,stubClassName, destDir , env);
-        skeletonFile = sourceFileForClass(remoteClassName,skeletonClassName, destDir, env);
-
-        /*
-         * Initialize cached definitions for exception classes used
-         * in the generation process.
-         */
-        defException =
-            env.getClassDeclaration(idJavaLangException).
-                getClassDefinition(env);
-        defRemoteException =
-            env.getClassDeclaration(idRemoteException).
-                getClassDefinition(env);
-        defRuntimeException =
-            env.getClassDeclaration(idJavaLangRuntimeException).
-                getClassDefinition(env);
-    }
-
-    /**
-     * Write the stub for the remote class to a stream.
-     */
-    private void writeStub(IndentingWriter p) throws IOException {
-
-        /*
-         * Write boiler plate comment.
-         */
-        p.pln("// Stub class generated by rmic, do not edit.");
-        p.pln("// Contents subject to change without notice.");
-        p.pln();
-
-        /*
-         * If remote implementation class was in a particular package,
-         * declare the stub class to be in the same package.
-         */
-        if (remoteClassName.isQualified()) {
-            p.pln("package " + remoteClassName.getQualifier() + ";");
-            p.pln();
-        }
-
-        /*
-         * Declare the stub class; implement all remote interfaces.
-         */
-        p.plnI("public final class " +
-            Names.mangleClass(stubClassName.getName()));
-        p.pln("extends " + idRemoteStub);
-        ClassDefinition[] remoteInterfaces = remoteClass.getRemoteInterfaces();
-        if (remoteInterfaces.length > 0) {
-            p.p("implements ");
-            for (int i = 0; i < remoteInterfaces.length; i++) {
-                if (i > 0)
-                    p.p(", ");
-                p.p(remoteInterfaces[i].getName().toString());
-            }
-            p.pln();
-        }
-        p.pOlnI("{");
-
-        if (version == STUB_VERSION_1_1 ||
-            version == STUB_VERSION_FAT)
-        {
-            writeOperationsArray(p);
-            p.pln();
-            writeInterfaceHash(p);
-            p.pln();
-        }
-
-        if (version == STUB_VERSION_FAT ||
-            version == STUB_VERSION_1_2)
-        {
-            p.pln("private static final long serialVersionUID = " +
-                STUB_SERIAL_VERSION_UID + ";");
-            p.pln();
-
-            /*
-             * We only need to declare and initialize the static fields of
-             * Method objects for each remote method if there are any remote
-             * methods; otherwise, skip this code entirely, to avoid generating
-             * a try/catch block for a checked exception that cannot occur
-             * (see bugid 4125181).
-             */
-            if (methodFieldNames.length > 0) {
-                if (version == STUB_VERSION_FAT) {
-                    p.pln("private static boolean useNewInvoke;");
-                }
-                writeMethodFieldDeclarations(p);
-                p.pln();
-
-                /*
-                 * Initialize java.lang.reflect.Method fields for each remote
-                 * method in a static initializer.
-                 */
-                p.plnI("static {");
-                p.plnI("try {");
-                if (version == STUB_VERSION_FAT) {
-                    /*
-                     * Fat stubs must determine whether the API required for
-                     * the JDK 1.2 stub protocol is supported in the current
-                     * runtime, so that it can use it if supported.  This is
-                     * determined by using the Reflection API to test if the
-                     * new invoke method on RemoteRef exists, and setting the
-                     * static boolean "useNewInvoke" to true if it does, or
-                     * to false if a NoSuchMethodException is thrown.
-                     */
-                    p.plnI(idRemoteRef + ".class.getMethod(\"invoke\",");
-                    p.plnI("new java.lang.Class[] {");
-                    p.pln(idRemote + ".class,");
-                    p.pln("java.lang.reflect.Method.class,");
-                    p.pln("java.lang.Object[].class,");
-                    p.pln("long.class");
-                    p.pOln("});");
-                    p.pO();
-                    p.pln("useNewInvoke = true;");
-                }
-                writeMethodFieldInitializers(p);
-                p.pOlnI("} catch (java.lang.NoSuchMethodException e) {");
-                if (version == STUB_VERSION_FAT) {
-                    p.pln("useNewInvoke = false;");
-                } else {
-                    /*
-                     * REMIND: By throwing an Error here, the application will
-                     * get the NoSuchMethodError directly when the stub class
-                     * is initialized.  If we throw a RuntimeException
-                     * instead, the application would get an
-                     * ExceptionInInitializerError.  Would that be more
-                     * appropriate, and if so, which RuntimeException should
-                     * be thrown?
-                     */
-                    p.plnI("throw new java.lang.NoSuchMethodError(");
-                    p.pln("\"stub class initialization failed\");");
-                    p.pO();
-                }
-                p.pOln("}");            // end try/catch block
-                p.pOln("}");            // end static initializer
-                p.pln();
-            }
-        }
-
-        writeStubConstructors(p);
-        p.pln();
-
-        /*
-         * Write each stub method.
-         */
-        if (remoteMethods.length > 0) {
-            p.pln("// methods from remote interfaces");
-            for (int i = 0; i < remoteMethods.length; ++i) {
-                p.pln();
-                writeStubMethod(p, i);
-            }
-        }
-
-        p.pOln("}");                    // end stub class
-    }
-
-    /**
-     * Write the constructors for the stub class.
-     */
-    private void writeStubConstructors(IndentingWriter p)
-        throws IOException
-    {
-        p.pln("// constructors");
-
-        /*
-         * Only stubs compatible with the JDK 1.1 stub protocol need
-         * a no-arg constructor; later versions use reflection to find
-         * the constructor that directly takes a RemoteRef argument.
-         */
-        if (version == STUB_VERSION_1_1 ||
-            version == STUB_VERSION_FAT)
-        {
-            p.plnI("public " + Names.mangleClass(stubClassName.getName()) +
-                "() {");
-            p.pln("super();");
-            p.pOln("}");
-        }
-
-        p.plnI("public " + Names.mangleClass(stubClassName.getName()) +
-            "(" + idRemoteRef + " ref) {");
-        p.pln("super(ref);");
-        p.pOln("}");
-    }
-
-    /**
-     * Write the stub method for the remote method with the given "opnum".
-     */
-    private void writeStubMethod(IndentingWriter p, int opnum)
-        throws IOException
-    {
-        RemoteClass.Method method = remoteMethods[opnum];
-        Identifier methodName = method.getName();
-        Type methodType = method.getType();
-        Type paramTypes[] = methodType.getArgumentTypes();
-        String paramNames[] = nameParameters(paramTypes);
-        Type returnType = methodType.getReturnType();
-        ClassDeclaration[] exceptions = method.getExceptions();
-
-        /*
-         * Declare stub method; throw exceptions declared in remote
-         * interface(s).
-         */
-        p.pln("// implementation of " +
-            methodType.typeString(methodName.toString(), true, false));
-        p.p("public " + returnType + " " + methodName + "(");
-        for (int i = 0; i < paramTypes.length; i++) {
-            if (i > 0)
-                p.p(", ");
-            p.p(paramTypes[i] + " " + paramNames[i]);
-        }
-        p.plnI(")");
-        if (exceptions.length > 0) {
-            p.p("throws ");
-            for (int i = 0; i < exceptions.length; i++) {
-                if (i > 0)
-                    p.p(", ");
-                p.p(exceptions[i].getName().toString());
-            }
-            p.pln();
-        }
-        p.pOlnI("{");
-
-        /*
-         * The RemoteRef.invoke methods throw Exception, but unless this
-         * stub method throws Exception as well, we must catch Exceptions
-         * thrown from the invocation.  So we must catch Exception and
-         * rethrow something we can throw: UnexpectedException, which is a
-         * subclass of RemoteException.  But for any subclasses of Exception
-         * that we can throw, like RemoteException, RuntimeException, and
-         * any of the exceptions declared by this stub method, we want them
-         * to pass through unharmed, so first we must catch any such
-         * exceptions and rethrow it directly.
-         *
-         * We have to be careful generating the rethrowing catch blocks
-         * here, because javac will flag an error if there are any
-         * unreachable catch blocks, i.e. if the catch of an exception class
-         * follows a previous catch of it or of one of its superclasses.
-         * The following method invocation takes care of these details.
-         */
-        Vector<ClassDefinition> catchList = computeUniqueCatchList(exceptions);
-
-        /*
-         * If we need to catch any particular exceptions (i.e. this method
-         * does not declare java.lang.Exception), put the entire stub
-         * method in a try block.
-         */
-        if (catchList.size() > 0) {
-            p.plnI("try {");
-        }
-
-        if (version == STUB_VERSION_FAT) {
-            p.plnI("if (useNewInvoke) {");
-        }
-        if (version == STUB_VERSION_FAT ||
-            version == STUB_VERSION_1_2)
-        {
-            if (!returnType.isType(TC_VOID)) {
-                p.p("Object $result = ");               // REMIND: why $?
-            }
-            p.p("ref.invoke(this, " + methodFieldNames[opnum] + ", ");
-            if (paramTypes.length > 0) {
-                p.p("new java.lang.Object[] {");
-                for (int i = 0; i < paramTypes.length; i++) {
-                    if (i > 0)
-                        p.p(", ");
-                    p.p(wrapArgumentCode(paramTypes[i], paramNames[i]));
-                }
-                p.p("}");
-            } else {
-                p.p("null");
-            }
-            p.pln(", " + method.getMethodHash() + "L);");
-            if (!returnType.isType(TC_VOID)) {
-                p.pln("return " +
-                    unwrapArgumentCode(returnType, "$result") + ";");
-            }
-        }
-        if (version == STUB_VERSION_FAT) {
-            p.pOlnI("} else {");
-        }
-        if (version == STUB_VERSION_1_1 ||
-            version == STUB_VERSION_FAT)
-        {
-            p.pln(idRemoteCall + " call = ref.newCall((" + idRemoteObject +
-                ") this, operations, " + opnum + ", interfaceHash);");
-
-            if (paramTypes.length > 0) {
-                p.plnI("try {");
-                p.pln("java.io.ObjectOutput out = call.getOutputStream();");
-                writeMarshalArguments(p, "out", paramTypes, paramNames);
-                p.pOlnI("} catch (java.io.IOException e) {");
-                p.pln("throw new " + idMarshalException +
-                    "(\"error marshalling arguments\", e);");
-                p.pOln("}");
-            }
-
-            p.pln("ref.invoke(call);");
-
-            if (returnType.isType(TC_VOID)) {
-                p.pln("ref.done(call);");
-            } else {
-                p.pln(returnType + " $result;");        // REMIND: why $?
-                p.plnI("try {");
-                p.pln("java.io.ObjectInput in = call.getInputStream();");
-                boolean objectRead =
-                    writeUnmarshalArgument(p, "in", returnType, "$result");
-                p.pln(";");
-                p.pOlnI("} catch (java.io.IOException e) {");
-                p.pln("throw new " + idUnmarshalException +
-                    "(\"error unmarshalling return\", e);");
-                /*
-                 * If any only if readObject has been invoked, we must catch
-                 * ClassNotFoundException as well as IOException.
-                 */
-                if (objectRead) {
-                    p.pOlnI("} catch (java.lang.ClassNotFoundException e) {");
-                    p.pln("throw new " + idUnmarshalException +
-                        "(\"error unmarshalling return\", e);");
-                }
-                p.pOlnI("} finally {");
-                p.pln("ref.done(call);");
-                p.pOln("}");
-                p.pln("return $result;");
-            }
-        }
-        if (version == STUB_VERSION_FAT) {
-            p.pOln("}");                // end if/else (useNewInvoke) block
-        }
-
-        /*
-         * If we need to catch any particular exceptions, finally write
-         * the catch blocks for them, rethrow any other Exceptions with an
-         * UnexpectedException, and end the try block.
-         */
-        if (catchList.size() > 0) {
-            for (Enumeration<ClassDefinition> enumeration = catchList.elements();
-                 enumeration.hasMoreElements();)
-            {
-                ClassDefinition def = enumeration.nextElement();
-                p.pOlnI("} catch (" + def.getName() + " e) {");
-                p.pln("throw e;");
-            }
-            p.pOlnI("} catch (java.lang.Exception e) {");
-            p.pln("throw new " + idUnexpectedException +
-                "(\"undeclared checked exception\", e);");
-            p.pOln("}");                // end try/catch block
-        }
-
-        p.pOln("}");                    // end stub method
-    }
-
-    /**
-     * Compute the exceptions which need to be caught and rethrown in a
-     * stub method before wrapping Exceptions in UnexpectedExceptions,
-     * given the exceptions declared in the throws clause of the method.
-     * Returns a Vector containing ClassDefinition objects for each
-     * exception to catch.  Each exception is guaranteed to be unique,
-     * i.e. not a subclass of any of the other exceptions in the Vector,
-     * so the catch blocks for these exceptions may be generated in any
-     * order relative to each other.
-     *
-     * RemoteException and RuntimeException are each automatically placed
-     * in the returned Vector (if none of their superclasses are already
-     * present), since those exceptions should always be directly rethrown
-     * by a stub method.
-     *
-     * The returned Vector will be empty if java.lang.Exception or one
-     * of its superclasses is in the throws clause of the method, indicating
-     * that no exceptions need to be caught.
-     */
-    private Vector<ClassDefinition> computeUniqueCatchList(ClassDeclaration[] exceptions) {
-        Vector<ClassDefinition> uniqueList = new Vector<>();       // unique exceptions to catch
-
-        uniqueList.addElement(defRuntimeException);
-        uniqueList.addElement(defRemoteException);
-
-        /* For each exception declared by the stub method's throws clause: */
-    nextException:
-        for (int i = 0; i < exceptions.length; i++) {
-            ClassDeclaration decl = exceptions[i];
-            try {
-                if (defException.subClassOf(env, decl)) {
-                    /*
-                     * (If java.lang.Exception (or a superclass) was declared
-                     * in the throws clause of this stub method, then we don't
-                     * have to bother catching anything; clear the list and
-                     * return.)
-                     */
-                    uniqueList.clear();
-                    break;
-                } else if (!defException.superClassOf(env, decl)) {
-                    /*
-                     * Ignore other Throwables that do not extend Exception,
-                     * since they do not need to be caught anyway.
-                     */
-                    continue;
-                }
-                /*
-                 * Compare this exception against the current list of
-                 * exceptions that need to be caught:
-                 */
-                for (int j = 0; j < uniqueList.size();) {
-                    ClassDefinition def = uniqueList.elementAt(j);
-                    if (def.superClassOf(env, decl)) {
-                        /*
-                         * If a superclass of this exception is already on
-                         * the list to catch, then ignore and continue;
-                         */
-                        continue nextException;
-                    } else if (def.subClassOf(env, decl)) {
-                        /*
-                         * If a subclass of this exception is on the list
-                         * to catch, then remove it.
-                         */
-                        uniqueList.removeElementAt(j);
-                    } else {
-                        j++;    // else continue comparing
-                    }
-                }
-                /* This exception is unique: add it to the list to catch. */
-                uniqueList.addElement(decl.getClassDefinition(env));
-            } catch (ClassNotFound e) {
-                env.error(0, "class.not.found", e.name, decl.getName());
-                /*
-                 * REMIND: We do not exit from this exceptional condition,
-                 * generating questionable code and likely letting the
-                 * compiler report a resulting error later.
-                 */
-            }
-        }
-        return uniqueList;
-    }
-
-    /**
-     * Write the skeleton for the remote class to a stream.
-     */
-    private void writeSkeleton(IndentingWriter p) throws IOException {
-        if (version == STUB_VERSION_1_2) {
-            throw new Error("should not generate skeleton for version");
-        }
-
-        /*
-         * Write boiler plate comment.
-         */
-        p.pln("// Skeleton class generated by rmic, do not edit.");
-        p.pln("// Contents subject to change without notice.");
-        p.pln();
-
-        /*
-         * If remote implementation class was in a particular package,
-         * declare the skeleton class to be in the same package.
-         */
-        if (remoteClassName.isQualified()) {
-            p.pln("package " + remoteClassName.getQualifier() + ";");
-            p.pln();
-        }
-
-        /*
-         * Declare the skeleton class.
-         */
-        p.plnI("public final class " +
-            Names.mangleClass(skeletonClassName.getName()));
-        p.pln("implements " + idSkeleton);
-        p.pOlnI("{");
-
-        writeOperationsArray(p);
-        p.pln();
-
-        writeInterfaceHash(p);
-        p.pln();
-
-        /*
-         * Define the getOperations() method.
-         */
-        p.plnI("public " + idOperation + "[] getOperations() {");
-        p.pln("return (" + idOperation + "[]) operations.clone();");
-        p.pOln("}");
-        p.pln();
-
-        /*
-         * Define the dispatch() method.
-         */
-        p.plnI("public void dispatch(" + idRemote + " obj, " +
-            idRemoteCall + " call, int opnum, long hash)");
-        p.pln("throws java.lang.Exception");
-        p.pOlnI("{");
-
-        if (version == STUB_VERSION_FAT) {
-            p.plnI("if (opnum < 0) {");
-            if (remoteMethods.length > 0) {
-                for (int opnum = 0; opnum < remoteMethods.length; opnum++) {
-                    if (opnum > 0)
-                        p.pO("} else ");
-                    p.plnI("if (hash == " +
-                        remoteMethods[opnum].getMethodHash() + "L) {");
-                    p.pln("opnum = " + opnum + ";");
-                }
-                p.pOlnI("} else {");
-            }
-            /*
-             * Skeleton throws UnmarshalException if it does not recognize
-             * the method hash; this is what UnicastServerRef.dispatch()
-             * would do.
-             */
-            p.pln("throw new " +
-                idUnmarshalException + "(\"invalid method hash\");");
-            if (remoteMethods.length > 0) {
-                p.pOln("}");
-            }
-            /*
-             * Ignore the validation of the interface hash if the
-             * operation number was negative, since it is really a
-             * method hash instead.
-             */
-            p.pOlnI("} else {");
-        }
-
-        p.plnI("if (hash != interfaceHash)");
-        p.pln("throw new " +
-            idSkeletonMismatchException + "(\"interface hash mismatch\");");
-        p.pO();
-
-        if (version == STUB_VERSION_FAT) {
-            p.pOln("}");                // end if/else (opnum < 0) block
-        }
-        p.pln();
-
-        /*
-         * Cast remote object instance to our specific implementation class.
-         */
-        p.pln(remoteClassName + " server = (" + remoteClassName + ") obj;");
-
-        /*
-         * Process call according to the operation number.
-         */
-        p.plnI("switch (opnum) {");
-        for (int opnum = 0; opnum < remoteMethods.length; opnum++) {
-            writeSkeletonDispatchCase(p, opnum);
-        }
-        p.pOlnI("default:");
-        /*
-         * Skeleton throws UnmarshalException if it does not recognize
-         * the operation number; this is consistent with the case of an
-         * unrecognized method hash.
-         */
-        p.pln("throw new " + idUnmarshalException +
-            "(\"invalid method number\");");
-        p.pOln("}");                    // end switch statement
-
-        p.pOln("}");                    // end dispatch() method
-
-        p.pOln("}");                    // end skeleton class
-    }
-
-    /**
-     * Write the case block for the skeleton's dispatch method for
-     * the remote method with the given "opnum".
-     */
-    private void writeSkeletonDispatchCase(IndentingWriter p, int opnum)
-        throws IOException
-    {
-        RemoteClass.Method method = remoteMethods[opnum];
-        Identifier methodName = method.getName();
-        Type methodType = method.getType();
-        Type paramTypes[] = methodType.getArgumentTypes();
-        String paramNames[] = nameParameters(paramTypes);
-        Type returnType = methodType.getReturnType();
-
-        p.pOlnI("case " + opnum + ": // " +
-            methodType.typeString(methodName.toString(), true, false));
-        /*
-         * Use nested block statement inside case to provide an independent
-         * namespace for local variables used to unmarshal parameters for
-         * this remote method.
-         */
-        p.pOlnI("{");
-
-        if (paramTypes.length > 0) {
-            /*
-             * Declare local variables to hold arguments.
-             */
-            for (int i = 0; i < paramTypes.length; i++) {
-                p.pln(paramTypes[i] + " " + paramNames[i] + ";");
-            }
-
-            /*
-             * Unmarshal arguments from call stream.
-             */
-            p.plnI("try {");
-            p.pln("java.io.ObjectInput in = call.getInputStream();");
-            boolean objectsRead = writeUnmarshalArguments(p, "in",
-                paramTypes, paramNames);
-            p.pOlnI("} catch (java.io.IOException e) {");
-            p.pln("throw new " + idUnmarshalException +
-                "(\"error unmarshalling arguments\", e);");
-            /*
-             * If any only if readObject has been invoked, we must catch
-             * ClassNotFoundException as well as IOException.
-             */
-            if (objectsRead) {
-                p.pOlnI("} catch (java.lang.ClassNotFoundException e) {");
-                p.pln("throw new " + idUnmarshalException +
-                    "(\"error unmarshalling arguments\", e);");
-            }
-            p.pOlnI("} finally {");
-            p.pln("call.releaseInputStream();");
-            p.pOln("}");
-        } else {
-            p.pln("call.releaseInputStream();");
-        }
-
-        if (!returnType.isType(TC_VOID)) {
-            /*
-             * Declare variable to hold return type, if not void.
-             */
-            p.p(returnType + " $result = ");            // REMIND: why $?
-        }
-
-        /*
-         * Invoke the method on the server object.
-         */
-        p.p("server." + methodName + "(");
-        for (int i = 0; i < paramNames.length; i++) {
-            if (i > 0)
-                p.p(", ");
-            p.p(paramNames[i]);
-        }
-        p.pln(");");
-
-        /*
-         * Always invoke getResultStream(true) on the call object to send
-         * the indication of a successful invocation to the caller.  If
-         * the return type is not void, keep the result stream and marshal
-         * the return value.
-         */
-        p.plnI("try {");
-        if (!returnType.isType(TC_VOID)) {
-            p.p("java.io.ObjectOutput out = ");
-        }
-        p.pln("call.getResultStream(true);");
-        if (!returnType.isType(TC_VOID)) {
-            writeMarshalArgument(p, "out", returnType, "$result");
-            p.pln(";");
-        }
-        p.pOlnI("} catch (java.io.IOException e) {");
-        p.pln("throw new " +
-            idMarshalException + "(\"error marshalling return\", e);");
-        p.pOln("}");
-
-        p.pln("break;");                // break from switch statement
-
-        p.pOlnI("}");                   // end nested block statement
-        p.pln();
-    }
-
-    /**
-     * Write declaration and initializer for "operations" static array.
-     */
-    private void writeOperationsArray(IndentingWriter p)
-        throws IOException
-    {
-        p.plnI("private static final " + idOperation + "[] operations = {");
-        for (int i = 0; i < remoteMethods.length; i++) {
-            if (i > 0)
-                p.pln(",");
-            p.p("new " + idOperation + "(\"" +
-                remoteMethods[i].getOperationString() + "\")");
-        }
-        p.pln();
-        p.pOln("};");
-    }
-
-    /**
-     * Write declaration and initializer for "interfaceHash" static field.
-     */
-    private void writeInterfaceHash(IndentingWriter p)
-        throws IOException
-    {
-        p.pln("private static final long interfaceHash = " +
-            remoteClass.getInterfaceHash() + "L;");
-    }
-
-    /**
-     * Write declaration for java.lang.reflect.Method static fields
-     * corresponding to each remote method in a stub.
-     */
-    private void writeMethodFieldDeclarations(IndentingWriter p)
-        throws IOException
-    {
-        for (int i = 0; i < methodFieldNames.length; i++) {
-            p.pln("private static java.lang.reflect.Method " +
-                methodFieldNames[i] + ";");
-        }
-    }
-
-    /**
-     * Write code to initialize the static fields for each method
-     * using the Java Reflection API.
-     */
-    private void writeMethodFieldInitializers(IndentingWriter p)
-        throws IOException
-    {
-        for (int i = 0; i < methodFieldNames.length; i++) {
-            p.p(methodFieldNames[i] + " = ");
-            /*
-             * Here we look up the Method object in the arbitrary interface
-             * that we find in the RemoteClass.Method object.
-             * REMIND: Is this arbitrary choice OK?
-             * REMIND: Should this access be part of RemoteClass.Method's
-             * abstraction?
-             */
-            RemoteClass.Method method = remoteMethods[i];
-            MemberDefinition def = method.getMemberDefinition();
-            Identifier methodName = method.getName();
-            Type methodType = method.getType();
-            Type paramTypes[] = methodType.getArgumentTypes();
-
-            p.p(def.getClassDefinition().getName() + ".class.getMethod(\"" +
-                methodName + "\", new java.lang.Class[] {");
-            for (int j = 0; j < paramTypes.length; j++) {
-                if (j > 0)
-                    p.p(", ");
-                p.p(paramTypes[j] + ".class");
-            }
-            p.pln("});");
-        }
-    }
-
-
-    /*
-     * Following are a series of static utility methods useful during
-     * the code generation process:
-     */
-
-    /**
-     * Generate an array of names for fields that correspond to the given
-     * array of remote methods.  Each name in the returned array is
-     * guaranteed to be unique.
-     *
-     * The name of a method is included in its corresponding field name
-     * to enhance readability of the generated code.
-     */
-    private static String[] nameMethodFields(RemoteClass.Method[] methods) {
-        String[] names = new String[methods.length];
-        for (int i = 0; i < names.length; i++) {
-            names[i] = "$method_" + methods[i].getName() + "_" + i;
-        }
-        return names;
-    }
-
-    /**
-     * Generate an array of names for parameters corresponding to the
-     * given array of types for the parameters.  Each name in the returned
-     * array is guaranteed to be unique.
-     *
-     * A representation of the type of a parameter is included in its
-     * corresponding field name to enhance the readability of the generated
-     * code.
-     */
-    private static String[] nameParameters(Type[] types) {
-        String[] names = new String[types.length];
-        for (int i = 0; i < names.length; i++) {
-            names[i] = "$param_" +
-                generateNameFromType(types[i]) + "_" + (i + 1);
-        }
-        return names;
-    }
-
-    /**
-     * Generate a readable string representing the given type suitable
-     * for embedding within a Java identifier.
-     */
-    private static String generateNameFromType(Type type) {
-        int typeCode = type.getTypeCode();
-        switch (typeCode) {
-        case TC_BOOLEAN:
-        case TC_BYTE:
-        case TC_CHAR:
-        case TC_SHORT:
-        case TC_INT:
-        case TC_LONG:
-        case TC_FLOAT:
-        case TC_DOUBLE:
-            return type.toString();
-        case TC_ARRAY:
-            return "arrayOf_" + generateNameFromType(type.getElementType());
-        case TC_CLASS:
-            return Names.mangleClass(type.getClassName().getName()).toString();
-        default:
-            throw new Error("unexpected type code: " + typeCode);
-        }
-    }
-
-    /**
-     * Write a snippet of Java code to marshal a value named "name" of
-     * type "type" to the java.io.ObjectOutput stream named "stream".
-     *
-     * Primitive types are marshalled with their corresponding methods
-     * in the java.io.DataOutput interface, and objects (including arrays)
-     * are marshalled using the writeObject method.
-     */
-    private static void writeMarshalArgument(IndentingWriter p,
-                                             String streamName,
-                                             Type type, String name)
-        throws IOException
-    {
-        int typeCode = type.getTypeCode();
-        switch (typeCode) {
-        case TC_BOOLEAN:
-            p.p(streamName + ".writeBoolean(" + name + ")");
-            break;
-        case TC_BYTE:
-            p.p(streamName + ".writeByte(" + name + ")");
-            break;
-        case TC_CHAR:
-            p.p(streamName + ".writeChar(" + name + ")");
-            break;
-        case TC_SHORT:
-            p.p(streamName + ".writeShort(" + name + ")");
-            break;
-        case TC_INT:
-            p.p(streamName + ".writeInt(" + name + ")");
-            break;
-        case TC_LONG:
-            p.p(streamName + ".writeLong(" + name + ")");
-            break;
-        case TC_FLOAT:
-            p.p(streamName + ".writeFloat(" + name + ")");
-            break;
-        case TC_DOUBLE:
-            p.p(streamName + ".writeDouble(" + name + ")");
-            break;
-        case TC_ARRAY:
-        case TC_CLASS:
-            p.p(streamName + ".writeObject(" + name + ")");
-            break;
-        default:
-            throw new Error("unexpected type code: " + typeCode);
-        }
-    }
-
-    /**
-     * Write Java statements to marshal a series of values in order as
-     * named in the "names" array, with types as specified in the "types"
-     * array", to the java.io.ObjectOutput stream named "stream".
-     */
-    private static void writeMarshalArguments(IndentingWriter p,
-                                              String streamName,
-                                              Type[] types, String[] names)
-        throws IOException
-    {
-        if (types.length != names.length) {
-            throw new Error("parameter type and name arrays different sizes");
-        }
-
-        for (int i = 0; i < types.length; i++) {
-            writeMarshalArgument(p, streamName, types[i], names[i]);
-            p.pln(";");
-        }
-    }
-
-    /**
-     * Write a snippet of Java code to unmarshal a value of type "type"
-     * from the java.io.ObjectInput stream named "stream" into a variable
-     * named "name" (if "name" is null, the value in unmarshalled and
-     * discarded).
-     *
-     * Primitive types are unmarshalled with their corresponding methods
-     * in the java.io.DataInput interface, and objects (including arrays)
-     * are unmarshalled using the readObject method.
-     */
-    private static boolean writeUnmarshalArgument(IndentingWriter p,
-                                                  String streamName,
-                                                  Type type, String name)
-        throws IOException
-    {
-        boolean readObject = false;
-
-        if (name != null) {
-            p.p(name + " = ");
-        }
-
-        int typeCode = type.getTypeCode();
-        switch (type.getTypeCode()) {
-        case TC_BOOLEAN:
-            p.p(streamName + ".readBoolean()");
-            break;
-        case TC_BYTE:
-            p.p(streamName + ".readByte()");
-            break;
-        case TC_CHAR:
-            p.p(streamName + ".readChar()");
-            break;
-        case TC_SHORT:
-            p.p(streamName + ".readShort()");
-            break;
-        case TC_INT:
-            p.p(streamName + ".readInt()");
-            break;
-        case TC_LONG:
-            p.p(streamName + ".readLong()");
-            break;
-        case TC_FLOAT:
-            p.p(streamName + ".readFloat()");
-            break;
-        case TC_DOUBLE:
-            p.p(streamName + ".readDouble()");
-            break;
-        case TC_ARRAY:
-        case TC_CLASS:
-            p.p("(" + type + ") " + streamName + ".readObject()");
-            readObject = true;
-            break;
-        default:
-            throw new Error("unexpected type code: " + typeCode);
-        }
-        return readObject;
-    }
-
-    /**
-     * Write Java statements to unmarshal a series of values in order of
-     * types as in the "types" array from the java.io.ObjectInput stream
-     * named "stream" into variables as named in "names" (for any element
-     * of "names" that is null, the corresponding value is unmarshalled
-     * and discarded).
-     */
-    private static boolean writeUnmarshalArguments(IndentingWriter p,
-                                                   String streamName,
-                                                   Type[] types,
-                                                   String[] names)
-        throws IOException
-    {
-        if (types.length != names.length) {
-            throw new Error("parameter type and name arrays different sizes");
-        }
-
-        boolean readObject = false;
-        for (int i = 0; i < types.length; i++) {
-            if (writeUnmarshalArgument(p, streamName, types[i], names[i])) {
-                readObject = true;
-            }
-            p.pln(";");
-        }
-        return readObject;
-    }
-
-    /**
-     * Return a snippet of Java code to wrap a value named "name" of
-     * type "type" into an object as appropriate for use by the
-     * Java Reflection API.
-     *
-     * For primitive types, an appropriate wrapper class instantiated
-     * with the primitive value.  For object types (including arrays),
-     * no wrapping is necessary, so the value is named directly.
-     */
-    private static String wrapArgumentCode(Type type, String name) {
-        int typeCode = type.getTypeCode();
-        switch (typeCode) {
-        case TC_BOOLEAN:
-            return ("(" + name +
-                    " ? java.lang.Boolean.TRUE : java.lang.Boolean.FALSE)");
-        case TC_BYTE:
-            return "new java.lang.Byte(" + name + ")";
-        case TC_CHAR:
-            return "new java.lang.Character(" + name + ")";
-        case TC_SHORT:
-            return "new java.lang.Short(" + name + ")";
-        case TC_INT:
-            return "new java.lang.Integer(" + name + ")";
-        case TC_LONG:
-            return "new java.lang.Long(" + name + ")";
-        case TC_FLOAT:
-            return "new java.lang.Float(" + name + ")";
-        case TC_DOUBLE:
-            return "new java.lang.Double(" + name + ")";
-        case TC_ARRAY:
-        case TC_CLASS:
-            return name;
-        default:
-            throw new Error("unexpected type code: " + typeCode);
-        }
-    }
-
-    /**
-     * Return a snippet of Java code to unwrap a value named "name" into
-     * a value of type "type", as appropriate for the Java Reflection API.
-     *
-     * For primitive types, the value is assumed to be of the corresponding
-     * wrapper type, and a method is called on the wrapper type to retrieve
-     * the primitive value.  For object types (include arrays), no
-     * unwrapping is necessary; the value is simply cast to the expected
-     * real object type.
-     */
-    private static String unwrapArgumentCode(Type type, String name) {
-        int typeCode = type.getTypeCode();
-        switch (typeCode) {
-        case TC_BOOLEAN:
-            return "((java.lang.Boolean) " + name + ").booleanValue()";
-        case TC_BYTE:
-            return "((java.lang.Byte) " + name + ").byteValue()";
-        case TC_CHAR:
-            return "((java.lang.Character) " + name + ").charValue()";
-        case TC_SHORT:
-            return "((java.lang.Short) " + name + ").shortValue()";
-        case TC_INT:
-            return "((java.lang.Integer) " + name + ").intValue()";
-        case TC_LONG:
-            return "((java.lang.Long) " + name + ").longValue()";
-        case TC_FLOAT:
-            return "((java.lang.Float) " + name + ").floatValue()";
-        case TC_DOUBLE:
-            return "((java.lang.Double) " + name + ").doubleValue()";
-        case TC_ARRAY:
-        case TC_CLASS:
-            return "((" + type + ") " + name + ")";
-        default:
-            throw new Error("unexpected type code: " + typeCode);
-        }
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,876 +0,0 @@
-/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.rmi.rmic;
-
-import java.util.Vector;
-import java.util.Hashtable;
-import java.util.Enumeration;
-import java.io.IOException;
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
-import java.security.MessageDigest;
-import java.security.DigestOutputStream;
-import java.security.NoSuchAlgorithmException;
-import sun.tools.java.Type;
-import sun.tools.java.ClassDefinition;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.Identifier;
-import sun.tools.java.ClassNotFound;
-
-/**
- * A RemoteClass object encapsulates RMI-specific information about
- * a remote implementation class, i.e. a class that implements
- * one or more remote interfaces.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- *
- * @author      Peter Jones
- */
-public class RemoteClass implements sun.rmi.rmic.RMIConstants {
-
-    /**
-     * Create a RemoteClass object representing the remote meta-information
-     * of the given class.
-     *
-     * Returns true if successful.  If the class is not a properly formed
-     * remote implementation class or if some other error occurs, the
-     * return value will be null, and errors will have been reported to
-     * the supplied BatchEnvironment.
-     */
-    public static RemoteClass forClass(BatchEnvironment env,
-                                       ClassDefinition implClassDef)
-    {
-        RemoteClass rc = new RemoteClass(env, implClassDef);
-        if (rc.initialize()) {
-            return rc;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Return the ClassDefinition for this class.
-     */
-    public ClassDefinition getClassDefinition() {
-        return implClassDef;
-    }
-
-    /**
-     * Return the name of the class represented by this object.
-     */
-    public Identifier getName() {
-        return implClassDef.getName();
-    }
-
-    /**
-     * Return an array of ClassDefinitions representing all of the remote
-     * interfaces implemented by this class.
-     *
-     * A remote interface is any interface that extends Remote,
-     * directly or indirectly.  The remote interfaces of a class
-     * are the interfaces directly listed in either the class's
-     * "implements" clause, or the "implements" clause of any
-     * of its superclasses, that are remote interfaces.
-     *
-     * The order of the array returned is arbitrary, and some elements
-     * may be superfluous (i.e., superinterfaces of other interfaces
-     * in the array).
-     */
-    public ClassDefinition[] getRemoteInterfaces() {
-        return remoteInterfaces.clone();
-    }
-
-    /**
-     * Return an array of RemoteClass.Method objects representing all of
-     * the remote methods implemented by this class, i.e. all of the
-     * methods in the class's remote interfaces.
-     *
-     * The methods in the array are ordered according to the comparison
-     * of the strings consisting of their method name followed by their
-     * type signature, so each method's index in the array corresponds
-     * to its "operation number" in the JDK 1.1 version of the
-     * stub/skeleton protocol.
-     */
-    public Method[] getRemoteMethods() {
-        return remoteMethods.clone();
-    }
-
-    /**
-     * Return the "interface hash" used to match a stub/skeleton pair for
-     * this class in the JDK 1.1 version of the stub/skeleton protocol.
-     */
-    public long getInterfaceHash() {
-        return interfaceHash;
-    }
-
-    /**
-     * Return string representation of this object, consisting of
-     * the string "remote class " followed by the class name.
-     */
-    public String toString() {
-        return "remote class " + implClassDef.getName().toString();
-    }
-
-    /** rmic environment for this object */
-    private BatchEnvironment env;
-
-    /** the remote implementation class this object corresponds to */
-    private ClassDefinition implClassDef;
-
-    /** remote interfaces implemented by this class */
-    private ClassDefinition[] remoteInterfaces;
-
-    /** all the remote methods of this class */
-    private Method[] remoteMethods;
-
-    /** stub/skeleton "interface hash" for this class */
-    private long interfaceHash;
-
-    /** cached definition for certain classes used in this environment */
-    private ClassDefinition defRemote;
-    private ClassDefinition defException;
-    private ClassDefinition defRemoteException;
-
-    /**
-     * Create a RemoteClass instance for the given class.  The resulting
-     * object is not yet initialized.
-     */
-    private RemoteClass(BatchEnvironment env, ClassDefinition implClassDef) {
-        this.env = env;
-        this.implClassDef = implClassDef;
-    }
-
-    /**
-     * Validate that the remote implementation class is properly formed
-     * and fill in the data structures required by the public interface.
-     */
-    private boolean initialize() {
-        /*
-         * Verify that the "impl" is really a class, not an interface.
-         */
-        if (implClassDef.isInterface()) {
-            env.error(0, "rmic.cant.make.stubs.for.interface",
-                      implClassDef.getName());
-            return false;
-        }
-
-        /*
-         * Initialize cached definitions for the Remote interface and
-         * the RemoteException class.
-         */
-        try {
-            defRemote =
-                env.getClassDeclaration(idRemote).getClassDefinition(env);
-            defException =
-                env.getClassDeclaration(idJavaLangException).
-                getClassDefinition(env);
-            defRemoteException =
-                env.getClassDeclaration(idRemoteException).
-                getClassDefinition(env);
-        } catch (ClassNotFound e) {
-            env.error(0, "rmic.class.not.found", e.name);
-            return false;
-        }
-
-        /*
-         * Here we find all of the remote interfaces of our remote
-         * implementation class.  For each class up the superclass
-         * chain, add each directly-implemented interface that
-         * somehow extends Remote to a list.
-         */
-        Vector<ClassDefinition> remotesImplemented = // list of remote interfaces found
-            new Vector<ClassDefinition>();
-        for (ClassDefinition classDef = implClassDef;
-             classDef != null;)
-            {
-                try {
-                    ClassDeclaration[] interfaces = classDef.getInterfaces();
-                    for (int i = 0; i < interfaces.length; i++) {
-                        ClassDefinition interfaceDef =
-                            interfaces[i].getClassDefinition(env);
-                        /*
-                         * Add interface to the list if it extends Remote and
-                         * it is not already there.
-                         */
-                        if (!remotesImplemented.contains(interfaceDef) &&
-                            defRemote.implementedBy(env, interfaces[i]))
-                            {
-                                remotesImplemented.addElement(interfaceDef);
-                                /***** <DEBUG> */
-                                if (env.verbose()) {
-                                    System.out.println("[found remote interface: " +
-                                                       interfaceDef.getName() + "]");
-                                    /***** </DEBUG> */
-                                }
-                            }
-                    }
-
-                    /*
-                     * Verify that the candidate remote implementation class
-                     * implements at least one remote interface directly.
-                     */
-                    if (classDef == implClassDef && remotesImplemented.isEmpty()) {
-                        if (defRemote.implementedBy(env,
-                                                    implClassDef.getClassDeclaration()))
-                            {
-                                /*
-                                 * This error message is used if the class does
-                                 * implement a remote interface through one of
-                                 * its superclasses, but not directly.
-                                 */
-                                env.error(0, "rmic.must.implement.remote.directly",
-                                          implClassDef.getName());
-                            } else {
-                                /*
-                                 * This error message is used if the class never
-                                 * implements a remote interface.
-                                 */
-                                env.error(0, "rmic.must.implement.remote",
-                                          implClassDef.getName());
-                            }
-                        return false;
-                    }
-
-                    /*
-                     * Get definition for next superclass.
-                     */
-                    classDef = (classDef.getSuperClass() != null ?
-                                classDef.getSuperClass().getClassDefinition(env) :
-                                null);
-
-                } catch (ClassNotFound e) {
-                    env.error(0, "class.not.found", e.name, classDef.getName());
-                    return false;
-                }
-            }
-
-        /*
-         * The "remotesImplemented" vector now contains all of the remote
-         * interfaces directly implemented by the remote class or by any
-         * of its superclasses.
-         *
-         * At this point, we could optimize the list by removing superfluous
-         * entries, i.e. any interfaces that are implemented by some other
-         * interface in the list anyway.
-         *
-         * This should be correct; would it be worthwhile?
-         *
-         *      for (int i = 0; i < remotesImplemented.size();) {
-         *          ClassDefinition interfaceDef =
-         *              (ClassDefinition) remotesImplemented.elementAt(i);
-         *          boolean isOtherwiseImplemented = false;
-         *          for (int j = 0; j < remotesImplemented.size; j++) {
-         *              if (j != i &&
-         *                  interfaceDef.implementedBy(env, (ClassDefinition)
-         *                  remotesImplemented.elementAt(j).
-         *                      getClassDeclaration()))
-         *              {
-         *                  isOtherwiseImplemented = true;
-         *                  break;
-         *              }
-         *          }
-         *          if (isOtherwiseImplemented) {
-         *              remotesImplemented.removeElementAt(i);
-         *          } else {
-         *              ++i;
-         *          }
-         *      }
-         */
-
-        /*
-         * Now we collect the methods from all of the remote interfaces
-         * into a hashtable.
-         */
-        Hashtable<String, Method> methods = new Hashtable<String, Method>();
-        boolean errors = false;
-        for (Enumeration<ClassDefinition> enumeration
-                 = remotesImplemented.elements();
-             enumeration.hasMoreElements();)
-            {
-                ClassDefinition interfaceDef = enumeration.nextElement();
-                if (!collectRemoteMethods(interfaceDef, methods))
-                    errors = true;
-            }
-        if (errors)
-            return false;
-
-        /*
-         * Convert vector of remote interfaces to an array
-         * (order is not important for this array).
-         */
-        remoteInterfaces = new ClassDefinition[remotesImplemented.size()];
-        remotesImplemented.copyInto(remoteInterfaces);
-
-        /*
-         * Sort table of remote methods into an array.  The elements are
-         * sorted in ascending order of the string of the method's name
-         * and type signature, so that each elements index is equal to
-         * its operation number of the JDK 1.1 version of the stub/skeleton
-         * protocol.
-         */
-        String[] orderedKeys = new String[methods.size()];
-        int count = 0;
-        for (Enumeration<Method> enumeration = methods.elements();
-             enumeration.hasMoreElements();)
-            {
-                Method m = enumeration.nextElement();
-                String key = m.getNameAndDescriptor();
-                int i;
-                for (i = count; i > 0; --i) {
-                    if (key.compareTo(orderedKeys[i - 1]) >= 0) {
-                        break;
-                    }
-                    orderedKeys[i] = orderedKeys[i - 1];
-                }
-                orderedKeys[i] = key;
-                ++count;
-            }
-        remoteMethods = new Method[methods.size()];
-        for (int i = 0; i < remoteMethods.length; i++) {
-            remoteMethods[i] = methods.get(orderedKeys[i]);
-            /***** <DEBUG> */
-            if (env.verbose()) {
-                System.out.print("[found remote method <" + i + ">: " +
-                                 remoteMethods[i].getOperationString());
-                ClassDeclaration[] exceptions =
-                    remoteMethods[i].getExceptions();
-                if (exceptions.length > 0)
-                    System.out.print(" throws ");
-                for (int j = 0; j < exceptions.length; j++) {
-                    if (j > 0)
-                        System.out.print(", ");
-                    System.out.print(exceptions[j].getName());
-                }
-                System.out.println("]");
-            }
-            /***** </DEBUG> */
-        }
-
-        /**
-         * Finally, pre-compute the interface hash to be used by
-         * stubs/skeletons for this remote class.
-         */
-        interfaceHash = computeInterfaceHash();
-
-        return true;
-    }
-
-    /**
-     * Collect and validate all methods from given interface and all of
-     * its superinterfaces as remote methods.  Remote methods are added
-     * to the supplied hashtable.  Returns true if successful,
-     * or false if an error occurred.
-     */
-    private boolean collectRemoteMethods(ClassDefinition interfaceDef,
-                                         Hashtable<String, Method> table)
-    {
-        if (!interfaceDef.isInterface()) {
-            throw new Error(
-                            "expected interface, not class: " + interfaceDef.getName());
-        }
-
-        /*
-         * rmic used to enforce that a remote interface could not extend
-         * a non-remote interface, i.e. an interface that did not itself
-         * extend from Remote.  The current version of rmic does not have
-         * this restriction, so the following code is now commented out.
-         *
-         * Verify that this interface extends Remote, since all interfaces
-         * extended by a remote interface must implement Remote.
-         *
-         *      try {
-         *          if (!defRemote.implementedBy(env,
-         *              interfaceDef.getClassDeclaration()))
-         *          {
-         *              env.error(0, "rmic.can.mix.remote.nonremote",
-         *                  interfaceDef.getName());
-         *              return false;
-         *          }
-         *      } catch (ClassNotFound e) {
-         *          env.error(0, "class.not.found", e.name,
-         *              interfaceDef.getName());
-         *          return false;
-         *      }
-         */
-
-        boolean errors = false;
-
-        /*
-         * Search interface's members for methods.
-         */
-    nextMember:
-        for (MemberDefinition member = interfaceDef.getFirstMember();
-             member != null;
-             member = member.getNextMember())
-            {
-                if (member.isMethod() &&
-                    !member.isConstructor() && !member.isInitializer())
-                    {
-                        /*
-                         * Verify that each method throws RemoteException.
-                         */
-                        ClassDeclaration[] exceptions = member.getExceptions(env);
-                        boolean hasRemoteException = false;
-                        for (int i = 0; i < exceptions.length; i++) {
-                            /*
-                             * rmic used to enforce that a remote method had to
-                             * explicitly list RemoteException in its "throws"
-                             * clause; i.e., just throwing Exception was not
-                             * acceptable.  The current version of rmic does not
-                             * have this restriction, so the following code is
-                             * now commented out.  Instead, the method is
-                             * considered valid if RemoteException is a subclass
-                             * of any of the methods declared exceptions.
-                             *
-                             *  if (exceptions[i].getName().equals(
-                             *      idRemoteException))
-                             *  {
-                             *      hasRemoteException = true;
-                             *      break;
-                             *  }
-                             */
-                            try {
-                                if (defRemoteException.subClassOf(
-                                                                  env, exceptions[i]))
-                                    {
-                                        hasRemoteException = true;
-                                        break;
-                                    }
-                            } catch (ClassNotFound e) {
-                                env.error(0, "class.not.found", e.name,
-                                          interfaceDef.getName());
-                                continue nextMember;
-                            }
-                        }
-                        /*
-                         * If this method did not throw RemoteException as required,
-                         * generate the error but continue, so that multiple such
-                         * errors can be reported.
-                         */
-                        if (!hasRemoteException) {
-                            env.error(0, "rmic.must.throw.remoteexception",
-                                      interfaceDef.getName(), member.toString());
-                            errors = true;
-                            continue nextMember;
-                        }
-
-                        /*
-                         * Verify that the implementation of this method throws only
-                         * java.lang.Exception or its subclasses (fix bugid 4092486).
-                         * JRMP does not support remote methods throwing
-                         * java.lang.Throwable or other subclasses.
-                         */
-                        try {
-                            MemberDefinition implMethod = implClassDef.findMethod(
-                                                                                  env, member.getName(), member.getType());
-                            if (implMethod != null) {           // should not be null
-                                exceptions = implMethod.getExceptions(env);
-                                for (int i = 0; i < exceptions.length; i++) {
-                                    if (!defException.superClassOf(
-                                                                   env, exceptions[i]))
-                                        {
-                                            env.error(0, "rmic.must.only.throw.exception",
-                                                      implMethod.toString(),
-                                                      exceptions[i].getName());
-                                            errors = true;
-                                            continue nextMember;
-                                        }
-                                }
-                            }
-                        } catch (ClassNotFound e) {
-                            env.error(0, "class.not.found", e.name,
-                                      implClassDef.getName());
-                            continue nextMember;
-                        }
-
-                        /*
-                         * Create RemoteClass.Method object to represent this method
-                         * found in a remote interface.
-                         */
-                        Method newMethod = new Method(member);
-                        /*
-                         * Store remote method's representation in the table of
-                         * remote methods found, keyed by its name and parameter
-                         * signature.
-                         *
-                         * If the table already contains an entry with the same
-                         * method name and parameter signature, then we must
-                         * replace the old entry with a Method object that
-                         * represents a legal combination of the old and the new
-                         * methods; specifically, the combined method must have
-                         * a throws list that contains (only) all of the checked
-                         * exceptions that can be thrown by both the old or
-                         * the new method (see bugid 4070653).
-                         */
-                        String key = newMethod.getNameAndDescriptor();
-                        Method oldMethod = table.get(key);
-                        if (oldMethod != null) {
-                            newMethod = newMethod.mergeWith(oldMethod);
-                            if (newMethod == null) {
-                                errors = true;
-                                continue nextMember;
-                            }
-                        }
-                        table.put(key, newMethod);
-                    }
-            }
-
-        /*
-         * Recursively collect methods for all superinterfaces.
-         */
-        try {
-            ClassDeclaration[] superDefs = interfaceDef.getInterfaces();
-            for (int i = 0; i < superDefs.length; i++) {
-                ClassDefinition superDef =
-                    superDefs[i].getClassDefinition(env);
-                if (!collectRemoteMethods(superDef, table))
-                    errors = true;
-            }
-        } catch (ClassNotFound e) {
-            env.error(0, "class.not.found", e.name, interfaceDef.getName());
-            return false;
-        }
-
-        return !errors;
-    }
-
-    /**
-     * Compute the "interface hash" of the stub/skeleton pair for this
-     * remote implementation class.  This is the 64-bit value used to
-     * enforce compatibility between a stub and a skeleton using the
-     * JDK 1.1 version of the stub/skeleton protocol.
-     *
-     * It is calculated using the first 64 bits of a SHA digest.  The
-     * digest is from a stream consisting of the following data:
-     *     (int) stub version number, always 1
-     *     for each remote method, in order of operation number:
-     *         (UTF) method name
-     *         (UTF) method type signature
-     *         for each declared exception, in alphabetical name order:
-     *             (UTF) name of exception class
-     *
-     */
-    private long computeInterfaceHash() {
-        long hash = 0;
-        ByteArrayOutputStream sink = new ByteArrayOutputStream(512);
-        try {
-            MessageDigest md = MessageDigest.getInstance("SHA");
-            DataOutputStream out = new DataOutputStream(
-                                                        new DigestOutputStream(sink, md));
-
-            out.writeInt(INTERFACE_HASH_STUB_VERSION);
-            for (int i = 0; i < remoteMethods.length; i++) {
-                MemberDefinition m = remoteMethods[i].getMemberDefinition();
-                Identifier name = m.getName();
-                Type type = m.getType();
-
-                out.writeUTF(name.toString());
-                // type signatures already use mangled class names
-                out.writeUTF(type.getTypeSignature());
-
-                ClassDeclaration exceptions[] = m.getExceptions(env);
-                sortClassDeclarations(exceptions);
-                for (int j = 0; j < exceptions.length; j++) {
-                    out.writeUTF(Names.mangleClass(
-                                                   exceptions[j].getName()).toString());
-                }
-            }
-            out.flush();
-
-            // use only the first 64 bits of the digest for the hash
-            byte hashArray[] = md.digest();
-            for (int i = 0; i < Math.min(8, hashArray.length); i++) {
-                hash += ((long) (hashArray[i] & 0xFF)) << (i * 8);
-            }
-        } catch (IOException e) {
-            throw new Error(
-                            "unexpected exception computing intetrface hash: " + e);
-        } catch (NoSuchAlgorithmException e) {
-            throw new Error(
-                            "unexpected exception computing intetrface hash: " + e);
-        }
-
-        return hash;
-    }
-
-    /**
-     * Sort array of class declarations alphabetically by their mangled
-     * fully-qualified class name.  This is used to feed a method's exceptions
-     * in a canonical order into the digest stream for the interface hash
-     * computation.
-     */
-    private void sortClassDeclarations(ClassDeclaration[] decl) {
-        for (int i = 1; i < decl.length; i++) {
-            ClassDeclaration curr = decl[i];
-            String name = Names.mangleClass(curr.getName()).toString();
-            int j;
-            for (j = i; j > 0; j--) {
-                if (name.compareTo(
-                                   Names.mangleClass(decl[j - 1].getName()).toString()) >= 0)
-                    {
-                        break;
-                    }
-                decl[j] = decl[j - 1];
-            }
-            decl[j] = curr;
-        }
-    }
-
-
-    /**
-     * A RemoteClass.Method object encapsulates RMI-specific information
-     * about a particular remote method in the remote implementation class
-     * represented by the outer instance.
-     */
-    public class Method implements Cloneable {
-
-        /**
-         * Return the definition of the actual class member corresponing
-         * to this method of a remote interface.
-         *
-         * REMIND: Can this method be removed?
-         */
-        public MemberDefinition getMemberDefinition() {
-            return memberDef;
-        }
-
-        /**
-         * Return the name of this method.
-         */
-        public Identifier getName() {
-            return memberDef.getName();
-        }
-
-        /**
-         * Return the type of this method.
-         */
-        public Type getType() {
-            return memberDef.getType();
-        }
-
-        /**
-         * Return an array of the exception classes declared to be
-         * thrown by this remote method.
-         *
-         * For methods with the same name and type signature inherited
-         * from multiple remote interfaces, the array will contain
-         * the set of exceptions declared in all of the interfaces'
-         * methods that can be legally thrown in each of them.
-         */
-        public ClassDeclaration[] getExceptions() {
-            return exceptions.clone();
-        }
-
-        /**
-         * Return the "method hash" used to identify this remote method
-         * in the JDK 1.2 version of the stub protocol.
-         */
-        public long getMethodHash() {
-            return methodHash;
-        }
-
-        /**
-         * Return the string representation of this method.
-         */
-        public String toString() {
-            return memberDef.toString();
-        }
-
-        /**
-         * Return the string representation of this method appropriate
-         * for the construction of a java.rmi.server.Operation object.
-         */
-        public String getOperationString() {
-            return memberDef.toString();
-        }
-
-        /**
-         * Return a string consisting of this method's name followed by
-         * its method descriptor, using the Java VM's notation for
-         * method descriptors (see section 4.3.3 of The Java Virtual
-         * Machine Specification).
-         */
-        public String getNameAndDescriptor() {
-            return memberDef.getName().toString() +
-                memberDef.getType().getTypeSignature();
-        }
-
-        /**
-         * Member definition for this method, from one of the remote
-         * interfaces that this method was found in.
-         *
-         * Note that this member definition may be only one of several
-         * member defintions that correspond to this remote method object,
-         * if several of this class's remote interfaces contain methods
-         * with the same name and type signature.  Therefore, this member
-         * definition may declare more exceptions thrown that this remote
-         * method does.
-         */
-        private MemberDefinition memberDef;
-
-        /** stub "method hash" to identify this method */
-        private long methodHash;
-
-        /**
-         * Exceptions declared to be thrown by this remote method.
-         *
-         * This list can include superfluous entries, such as
-         * unchecked exceptions and subclasses of other entries.
-         */
-        private ClassDeclaration[] exceptions;
-
-        /**
-         * Create a new Method object corresponding to the given
-         * method definition.
-         */
-        /*
-         * Temporarily comment out the private modifier until
-         * the VM allows outer class to access inner class's
-         * private constructor
-         */
-        /* private */ Method(MemberDefinition memberDef) {
-            this.memberDef = memberDef;
-            exceptions = memberDef.getExceptions(env);
-            methodHash = computeMethodHash();
-        }
-
-        /**
-         * Cloning is supported by returning a shallow copy of this object.
-         */
-        protected Object clone() {
-            try {
-                return super.clone();
-            } catch (CloneNotSupportedException e) {
-                throw new Error("clone failed");
-            }
-        }
-
-        /**
-         * Return a new Method object that is a legal combination of
-         * this method object and another one.
-         *
-         * This requires determining the exceptions declared by the
-         * combined method, which must be (only) all of the exceptions
-         * declared in both old Methods that may thrown in either of
-         * them.
-         */
-        private Method mergeWith(Method other) {
-            if (!getName().equals(other.getName()) ||
-                !getType().equals(other.getType()))
-                {
-                    throw new Error("attempt to merge method \"" +
-                                    other.getNameAndDescriptor() + "\" with \"" +
-                                    getNameAndDescriptor());
-                }
-
-            Vector<ClassDeclaration> legalExceptions
-                = new Vector<ClassDeclaration>();
-            try {
-                collectCompatibleExceptions(
-                                            other.exceptions, exceptions, legalExceptions);
-                collectCompatibleExceptions(
-                                            exceptions, other.exceptions, legalExceptions);
-            } catch (ClassNotFound e) {
-                env.error(0, "class.not.found", e.name,
-                          getClassDefinition().getName());
-                return null;
-            }
-
-            Method merged = (Method) clone();
-            merged.exceptions = new ClassDeclaration[legalExceptions.size()];
-            legalExceptions.copyInto(merged.exceptions);
-
-            return merged;
-        }
-
-        /**
-         * Add to the supplied list all exceptions in the "from" array
-         * that are subclasses of an exception in the "with" array.
-         */
-        private void collectCompatibleExceptions(ClassDeclaration[] from,
-                                                 ClassDeclaration[] with,
-                                                 Vector<ClassDeclaration> list)
-            throws ClassNotFound
-        {
-            for (int i = 0; i < from.length; i++) {
-                ClassDefinition exceptionDef = from[i].getClassDefinition(env);
-                if (!list.contains(from[i])) {
-                    for (int j = 0; j < with.length; j++) {
-                        if (exceptionDef.subClassOf(env, with[j])) {
-                            list.addElement(from[i]);
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-
-        /**
-         * Compute the "method hash" of this remote method.  The method
-         * hash is a long containing the first 64 bits of the SHA digest
-         * from the UTF encoded string of the method name and descriptor.
-         *
-         * REMIND: Should this method share implementation code with
-         * the outer class's computeInterfaceHash() method?
-         */
-        private long computeMethodHash() {
-            long hash = 0;
-            ByteArrayOutputStream sink = new ByteArrayOutputStream(512);
-            try {
-                MessageDigest md = MessageDigest.getInstance("SHA");
-                DataOutputStream out = new DataOutputStream(
-                                                            new DigestOutputStream(sink, md));
-
-                String methodString = getNameAndDescriptor();
-                /***** <DEBUG> */
-                if (env.verbose()) {
-                    System.out.println("[string used for method hash: \"" +
-                                       methodString + "\"]");
-                }
-                /***** </DEBUG> */
-                out.writeUTF(methodString);
-
-                // use only the first 64 bits of the digest for the hash
-                out.flush();
-                byte hashArray[] = md.digest();
-                for (int i = 0; i < Math.min(8, hashArray.length); i++) {
-                    hash += ((long) (hashArray[i] & 0xFF)) << (i * 8);
-                }
-            } catch (IOException e) {
-                throw new Error(
-                                "unexpected exception computing intetrface hash: " + e);
-            } catch (NoSuchAlgorithmException e) {
-                throw new Error(
-                                "unexpected exception computing intetrface hash: " + e);
-            }
-
-            return hash;
-        }
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/Util.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 1999, 2013, 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.
- */
-
-/*
- * Licensed Materials - Property of IBM
- * RMI-IIOP v1.0
- * Copyright IBM Corp. 1998 1999  All Rights Reserved
- *
- */
-
-package sun.rmi.rmic;
-
-import java.io.File;
-import sun.tools.java.Identifier;
-
-/**
- * Util provides static utility methods used by other rmic classes.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- *
- * @author Bryan Atsatt
- */
-
-public class Util implements sun.rmi.rmic.Constants {
-
-    /**
-     * Return the directory that should be used for output for a given
-     * class.
-     * @param theClass The fully qualified name of the class.
-     * @param rootDir The directory to use as the root of the
-     * package hierarchy.  May be null, in which case the current
-     * working directory is used as the root.
-     */
-    public static File getOutputDirectoryFor(Identifier theClass,
-                                             File rootDir,
-                                             BatchEnvironment env) {
-
-        File outputDir = null;
-        String className = theClass.getFlatName().toString().replace('.', SIGC_INNERCLASS);
-        String qualifiedClassName = className;
-        String packagePath = null;
-        String packageName = theClass.getQualifier().toString();
-
-        if (packageName.length() > 0) {
-            qualifiedClassName = packageName + "." + className;
-            packagePath = packageName.replace('.', File.separatorChar);
-        }
-
-        // Do we have a root directory?
-
-        if (rootDir != null) {
-
-            // Yes, do we have a package name?
-
-            if (packagePath != null) {
-
-                // Yes, so use it as the root. Open the directory...
-
-                outputDir = new File(rootDir, packagePath);
-
-                // Make sure the directory exists...
-
-                ensureDirectory(outputDir,env);
-
-            } else {
-
-                // Default package, so use root as output dir...
-
-                outputDir = rootDir;
-            }
-        } else {
-
-            // No root directory. Get the current working directory...
-
-            String workingDirPath = System.getProperty("user.dir");
-            File workingDir = new File(workingDirPath);
-
-            // Do we have a package name?
-
-            if (packagePath == null) {
-
-                // No, so use working directory...
-
-                outputDir = workingDir;
-
-            } else {
-
-                // Yes, so use working directory as the root...
-
-                outputDir = new File(workingDir, packagePath);
-
-                // Make sure the directory exists...
-
-                ensureDirectory(outputDir,env);
-            }
-        }
-
-        // Finally, return the directory...
-
-        return outputDir;
-    }
-
-    private static void ensureDirectory (File dir, BatchEnvironment env) {
-        if (!dir.exists()) {
-            dir.mkdirs();
-            if (!dir.exists()) {
-                env.error(0,"rmic.cannot.create.dir",dir.getAbsolutePath());
-                throw new InternalError();
-            }
-        }
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/resources/rmic.properties	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-#
-#
-# Copyright (c) 1996, 2019, 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.
-#
-
-
-#*****************************************************************************
-#*                    Copyright (c) IBM Corporation 1998                     *
-#*                                                                           *
-#* (C) Copyright IBM Corp. 1998                                              *
-#*                                                                           *
-#*****************************************************************************
-
-# To add a generator sun.rmi.rmic.Foo which is invoked via the -foo option:
-#
-#   1. Add "foo" to generator.args list.
-#   2. Add line: generator.class.foo=sun.rmi.rmic.Foo
-#   3. Update rmic.usage string to include new arguments.
-
-# For each available generator, list the command line argument used
-# to invoke it.  The value can be a single item or a comma separated
-# list.
-
-generator.args=v1.1,vcompat,v1.2,xprint
-
-# For each generator, specify the class to invoke, using the following
-# syntax:
-#
-#     generator.class.{arg}=fullClassName
-#
-# The 'default' entry is required and will be used if none of the args
-# specified in generator.args is passed. Note that {arg} is compared
-# using String.equalsIgnoreCase().
-
-generator.class.default=sun.rmi.rmic.RMIGenerator
-
-generator.class.v1.1=sun.rmi.rmic.RMIGenerator
-generator.class.vcompat=sun.rmi.rmic.RMIGenerator
-generator.class.v1.2=sun.rmi.rmic.RMIGenerator
-generator.class.xprint=sun.rmi.rmic.iiop.PrintGenerator
-
-# If a generator needs a BatchEnvironment other than
-# sun.rmi.rmic.BatchEnvironment, specify it as follows:
-#
-#     generator.env.{arg}=fullClassName
-
-generator.env.iiop=sun.rmi.rmic.iiop.BatchEnvironment
-generator.env.idl=sun.rmi.rmic.iiop.BatchEnvironment
-generator.env.xprint=sun.rmi.rmic.iiop.BatchEnvironment
-
-rmic.usage=Usage: {0} <options> <class names>\
-\n\
-\nwhere <options> includes:\
-\n  -keep          Do not delete intermediate generated source files\
-\n  -keepgenerated (same as "-keep")\
-\n  -v1.1          Create stubs/skeletons for 1.1 stub protocol version (deprecated)\
-\n  -vcompat       Create stubs/skeletons compatible with both\
-\n                           1.1 and 1.2 stub protocol versions (deprecated)\
-\n  -v1.2          (default) Create stubs for 1.2 stub protocol version only (deprecated)\
-\n  -g             Generate debugging info\
-\n  -nowarn        Generate no warnings\
-\n  -nowrite       Do not write compiled classes to the file system\
-\n  -verbose       Output messages about what the compiler is doing\
-\n  -classpath <path>      Specify where to find input class files\
-\n  -bootclasspath <path>  Override location of bootstrap class files\
-\n  -d <directory>         Specify where to place generated class files\
-\n  -J<runtime flag>       Pass argument to the java interpreter\
-\n
-
-#
-# Generic Messages
-#
-
-rmic.cant.read=Can''t read: {0}
-rmic.cant.write=Can''t write: {0}
-rmic.option.unsupported=The {0} option is no longer supported.
-rmic.option.unimplemented=The {0} option is not yet implemented.
-rmic.option.already.seen=The {0} option may be specified no more than once.
-rmic.option.requires.argument=The {0} option requires an argument.
-rmic.no.such.directory=The {0} directory does not exist.
-rmic.no.such.option={0} is an invalid option or argument.
-rmic.wrote=[wrote {0}]
-rmic.errors={0} errors
-rmic.1error=1 error
-rmic.warnings={0} warnings
-rmic.1warning=1 warning
-rmic.done_in=[done in {0} ms]
-rmic.no.memory=\
-	The compiler has run out of memory.  Consider using the "-J-Xmx<size>" command line option to increase the maximum heap size.
-rmic.stack.overflow=\
-	The compiler has run out of stack space.  Consider using the "-J-Xss<size>" command line option to increase the memory allocated for the Java stack.
-rmic.class.not.found=\
-	Class {0} not found.
-rmic.missing.property=Missing property generator.class.{0}
-rmic.cannot.instantiate=Cannot instantiate class {0}
-rmic.cannot.use.both=Cannot use both {0} and {1}
-rmic.resource.not.found={0} not found.
-rmic.no.output.dir=\
-	Cannot find suitable output directory for {0}. Use the -d option to specify a root directory.
-rmic.cannot.create.dir=\
-	Cannot create output directory {0}.
-
-#
-# JRMP Messages
-#
-
-rmic.cant.make.stubs.for.interface=\
-	{0} is an interface; stubs are needed only for remote object classes.
-rmic.must.implement.remote=\
-	Class {0} does not implement an interface that extends java.rmi.Remote; only remote objects need stubs and skeletons.
-rmic.must.implement.remote.directly=\
-	Stubs are only needed for classes that directly implement an interface that extends java.rmi.Remote; class {0} does not directly implement a remote interface.
-rmic.must.throw.remoteexception=\
-	{0} is not a valid remote interface: method {1} must throw java.rmi.RemoteException.
-rmic.must.only.throw.exception=\
-	Method {0} is not a valid remote method implementation because it throws {1}; implementations of remote methods may only throw java.lang.Exception or its subclasses.
-rmic.jrmp.stubs.deprecated=\
-        Warning: {0} has been deprecated and is subject to removal in a future\
-        \nrelease. Generation and use of skeletons and static stubs for JRMP\
-	\nis deprecated. Skeletons are unnecessary, and static stubs have\
-	\nbeen superseded by dynamically generated stubs. Users are encouraged\
-	\nto migrate away from using this tool to generate skeletons and static\
-	\nstubs. See the documentation for java.rmi.server.UnicastRemoteObject.
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/resources/rmic_ja.properties	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-#
-#
-# Copyright (c) 1996, 2019, 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.
-#
-
-
-#*****************************************************************************
-#*                    Copyright (c) IBM Corporation 1998                     *
-#*                                                                           *
-#* (C) Copyright IBM Corp. 1998                                              *
-#*                                                                           *
-#*****************************************************************************
-
-# To add a generator sun.rmi.rmic.Foo which is invoked via the -foo option:
-#
-#   1. Add "foo" to generator.args list.
-#   2. Add line: generator.class.foo=sun.rmi.rmic.Foo
-#   3. Update rmic.usage string to include new arguments.
-
-# For each available generator, list the command line argument used
-# to invoke it.  The value can be a single item or a comma separated
-# list.
-
-generator.args=v1.1,vcompat,v1.2,xprint
-
-# For each generator, specify the class to invoke, using the following
-# syntax:
-#
-#     generator.class.{arg}=fullClassName
-#
-# The 'default' entry is required and will be used if none of the args
-# specified in generator.args is passed. Note that {arg} is compared
-# using String.equalsIgnoreCase().
-
-generator.class.default=sun.rmi.rmic.RMIGenerator
-
-generator.class.v1.1=sun.rmi.rmic.RMIGenerator
-generator.class.vcompat=sun.rmi.rmic.RMIGenerator
-generator.class.v1.2=sun.rmi.rmic.RMIGenerator
-generator.class.xprint=sun.rmi.rmic.iiop.PrintGenerator
-
-# If a generator needs a BatchEnvironment other than
-# sun.rmi.rmic.BatchEnvironment, specify it as follows:
-#
-#     generator.env.{arg}=fullClassName
-
-generator.env.iiop=sun.rmi.rmic.iiop.BatchEnvironment
-generator.env.idl=sun.rmi.rmic.iiop.BatchEnvironment
-generator.env.xprint=sun.rmi.rmic.iiop.BatchEnvironment
-
-rmic.usage=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <class names>\n\n<options>\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002\n -keep      \u4E2D\u9593\u751F\u6210\u3055\u308C\u305F\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u306A\u3044\n -keepgenerated("-keep"\u3068\u540C\u3058)\n -v1.1      1.1\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u7528\u306E\u30B9\u30BF\u30D6/\u30B9\u30B1\u30EB\u30C8\u30F3\u3092\u4F5C\u6210\u3059\u308B(\u975E\u63A8\u5968)\n -vcompat   1.1\u30681.2\u306E\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u3068\n                 \u4E92\u63DB\u6027\u306E\u3042\u308B\u30B9\u30BF\u30D6/\u30B9\u30B1\u30EB\u30C8\u30F3\u3092\u4F5C\u6210\u3059\u308B(\u975E\u63A8\u5968)\n -v1.2      (\u30C7\u30D5\u30A9\u30EB\u30C8)1.2\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u5C02\u7528\u306E\u30B9\u30BF\u30D6\u3092\u4F5C\u6210\u3059\u308B(\u975E\u63A8\u5968)\n -g        \u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u3092\u751F\u6210\u3059\u308B\n -nowarn     \u8B66\u544A\u3092\u751F\u6210\u3057\u306A\u3044\n -nowrite    \u30B3\u30F3\u30D1\u30A4\u30EB\u3057\u305F\u30AF\u30E9\u30B9\u3092\u30D5\u30A1\u30A4\u30EB\u30FB\u30B7\u30B9\u30C6\u30E0\u306B\u66F8\u304D\u8FBC\u307E\u306A\u3044\n -verbose    \u30B3\u30F3\u30D1\u30A4\u30E9\u306E\u52D5\u4F5C\u306B\u95A2\u3059\u308B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n -classpath <path>    \u5165\u529B\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -bootclasspath<path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -d <directory>      \u751F\u6210\u3055\u308C\u305F\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u683C\u7D0D\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -J<runtime flag>  java\u30A4\u30F3\u30BF\u30D7\u30EA\u30BF\u306B\u5F15\u6570\u3092\u6E21\u3059\n
-
-#
-# Generic Messages
-#
-
-rmic.cant.read={0}\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093
-rmic.cant.write={0}\u304C\u66F8\u304D\u8FBC\u3081\u307E\u305B\u3093
-rmic.option.unsupported=\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306F\u73FE\u5728\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
-rmic.option.unimplemented=\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306F\u307E\u3060\u5B9F\u88C5\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
-rmic.option.already.seen={0}\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u8907\u6570\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002
-rmic.option.requires.argument={0}\u30AA\u30D7\u30B7\u30E7\u30F3\u306B\u306F\u5F15\u6570\u304C\u5FC5\u8981\u3067\u3059\u3002
-rmic.no.such.directory=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA{0}\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002
-rmic.no.such.option={0}\u306F\u7121\u52B9\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u307E\u305F\u306F\u5F15\u6570\u3067\u3059\u3002
-rmic.wrote=[{0}\u3092\u66F8\u8FBC\u307F\u5B8C\u4E86]
-rmic.errors=\u30A8\u30E9\u30FC{0}\u500B
-rmic.1error=\u30A8\u30E9\u30FC1\u500B
-rmic.warnings=\u8B66\u544A{0}\u500B
-rmic.1warning=\u8B66\u544A1\u500B
-rmic.done_in=[{0}\u30DF\u30EA\u79D2\u3067\u5B8C\u4E86]
-rmic.no.memory=\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u30E1\u30E2\u30EA\u30FC\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002"-J-Xmx<size>"\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u3001\u6700\u5927\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u5897\u3084\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-rmic.stack.overflow=\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u30B9\u30BF\u30C3\u30AF\u7A7A\u9593\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002"-J-Xss<size>"\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u3001Java\u30B9\u30BF\u30C3\u30AF\u306B\u5272\u308A\u5F53\u3066\u308B\u30E1\u30E2\u30EA\u30FC\u3092\u5897\u3084\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-rmic.class.not.found=\u30AF\u30E9\u30B9{0}\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002
-rmic.missing.property=\u30D7\u30ED\u30D1\u30C6\u30A3generator.class.{0}\u304C\u3042\u308A\u307E\u305B\u3093
-rmic.cannot.instantiate=\u30AF\u30E9\u30B9{0}\u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u751F\u6210\u3067\u304D\u307E\u305B\u3093
-rmic.cannot.use.both={0}\u3068{1}\u306E\u4E21\u65B9\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002
-rmic.resource.not.found={0}\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002
-rmic.no.output.dir={0}\u306B\u9069\u5207\u306A\u51FA\u529B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002-d\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u30EB\u30FC\u30C8\u30FB\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-rmic.cannot.create.dir=\u51FA\u529B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA{0}\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002
-
-#
-# JRMP Messages
-#
-
-rmic.cant.make.stubs.for.interface={0}\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3067\u3059\u3002\u30B9\u30BF\u30D6\u306F\u30EA\u30E2\u30FC\u30C8\u30FB\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u30FB\u30AF\u30E9\u30B9\u306B\u306E\u307F\u5FC5\u8981\u3067\u3059\u3002
-rmic.must.implement.remote=\u30AF\u30E9\u30B9{0}\u306Fjava.rmi.Remote\u3092\u62E1\u5F35\u3059\u308B\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u5B9F\u88C5\u3057\u307E\u305B\u3093\u3002\u30B9\u30BF\u30D6\u3068\u30B9\u30B1\u30EB\u30C8\u30F3\u3092\u5FC5\u8981\u3068\u3059\u308B\u306E\u306F\u30EA\u30E2\u30FC\u30C8\u30FB\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u307F\u3067\u3059\u3002
-rmic.must.implement.remote.directly=\u30B9\u30BF\u30D6\u3092\u5FC5\u8981\u3068\u3059\u308B\u306E\u306Fjava.rmi.Remote\u3092\u62E1\u5F35\u3059\u308B\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u76F4\u63A5\u5B9F\u88C5\u3059\u308B\u30AF\u30E9\u30B9\u306E\u307F\u3067\u3059\u3002\u30AF\u30E9\u30B9{0}\u306F\u30EA\u30E2\u30FC\u30C8\u30FB\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u76F4\u63A5\u306B\u306F\u5B9F\u88C5\u3057\u307E\u305B\u3093\u3002
-rmic.must.throw.remoteexception={0}\u306F\u4E0D\u6B63\u306A\u30EA\u30E2\u30FC\u30C8\u30FB\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3067\u3059\u3002\u30E1\u30BD\u30C3\u30C9{1}\u306Fjava.rmi.RemoteException\u3092\u30B9\u30ED\u30FC\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002
-rmic.must.only.throw.exception=\u30E1\u30BD\u30C3\u30C9{0}\u306F{1}\u3092\u30B9\u30ED\u30FC\u3059\u308B\u306E\u3067\u4E0D\u6B63\u306A\u30EA\u30E2\u30FC\u30C8\u30FB\u30E1\u30BD\u30C3\u30C9\u5B9F\u88C5\u3067\u3059\u3002\u30EA\u30E2\u30FC\u30C8\u30FB\u30E1\u30BD\u30C3\u30C9\u306E\u5B9F\u88C5\u304C\u30B9\u30ED\u30FC\u3059\u308B\u306E\u306Fjava.lang.Exception\u304B\u305D\u306E\u30B5\u30D6\u30AF\u30E9\u30B9\u306E\u307F\u3067\u3059\u3002
-rmic.jrmp.stubs.deprecated=\u8B66\u544A: {0}\u306F\u975E\u63A8\u5968\u306B\u306A\u308A\u3001\u5C06\u6765\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u524A\u9664\u3055\u308C\u307E\u3059\u3002\nJRMP\u306E\u30B9\u30B1\u30EB\u30C8\u30F3\u3068static\u30B9\u30BF\u30D6\u306E\u751F\u6210\u3068\u4F7F\u7528\u306F\n\u975E\u63A8\u5968\u3067\u3059\u3002\u30B9\u30B1\u30EB\u30C8\u30F3\u306F\u4E0D\u8981\u3067\u3001static\u30B9\u30BF\u30D6\u306F\n\u52D5\u7684\u306B\u751F\u6210\u3055\u308C\u308B\u30B9\u30BF\u30D6\u306B\u5DEE\u3057\u66FF\u3048\u3089\u308C\u307E\u3057\u305F\u3002\u30E6\u30FC\u30B6\u30FC\u306F\n\u30B9\u30B1\u30EB\u30C8\u30F3\u3068static\u30B9\u30BF\u30D6\u3092\u751F\u6210\u3059\u308B\u305F\u3081\u306B\u3053\u306E\u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u305B\u305A\u306B\u79FB\u884C\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\njava.rmi.server.UnicastRemoteObject\u306B\u95A2\u3059\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
--- a/src/jdk.rmic/share/classes/sun/rmi/rmic/resources/rmic_zh_CN.properties	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-#
-#
-# Copyright (c) 1996, 2019, 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.
-#
-
-
-#*****************************************************************************
-#*                    Copyright (c) IBM Corporation 1998                     *
-#*                                                                           *
-#* (C) Copyright IBM Corp. 1998                                              *
-#*                                                                           *
-#*****************************************************************************
-
-# To add a generator sun.rmi.rmic.Foo which is invoked via the -foo option:
-#
-#   1. Add "foo" to generator.args list.
-#   2. Add line: generator.class.foo=sun.rmi.rmic.Foo
-#   3. Update rmic.usage string to include new arguments.
-
-# For each available generator, list the command line argument used
-# to invoke it.  The value can be a single item or a comma separated
-# list.
-
-generator.args=v1.1,vcompat,v1.2,xprint
-
-# For each generator, specify the class to invoke, using the following
-# syntax:
-#
-#     generator.class.{arg}=fullClassName
-#
-# The 'default' entry is required and will be used if none of the args
-# specified in generator.args is passed. Note that {arg} is compared
-# using String.equalsIgnoreCase().
-
-generator.class.default=sun.rmi.rmic.RMIGenerator
-
-generator.class.v1.1=sun.rmi.rmic.RMIGenerator
-generator.class.vcompat=sun.rmi.rmic.RMIGenerator
-generator.class.v1.2=sun.rmi.rmic.RMIGenerator
-generator.class.xprint=sun.rmi.rmic.iiop.PrintGenerator
-
-# If a generator needs a BatchEnvironment other than
-# sun.rmi.rmic.BatchEnvironment, specify it as follows:
-#
-#     generator.env.{arg}=fullClassName
-
-generator.env.iiop=sun.rmi.rmic.iiop.BatchEnvironment
-generator.env.idl=sun.rmi.rmic.iiop.BatchEnvironment
-generator.env.xprint=sun.rmi.rmic.iiop.BatchEnvironment
-
-rmic.usage=\u7528\u6CD5\uFF1A{0} <\u9009\u9879> <\u7C7B\u540D>\n\n\u5176\u4E2D <\u9009\u9879> \u5305\u62EC\uFF1A\n  -keep          \u4E0D\u5220\u9664\u4E34\u65F6\u751F\u6210\u7684\u6E90\u6587\u4EF6\n  -keepgenerated\uFF08\u4E0E "-keep" \u76F8\u540C\uFF09\n  -v1.1          \u521B\u5EFA 1.1 \u5B58\u6839\u534F\u8BAE\u7248\u672C\u7684\u5B58\u6839/\u9AA8\u67B6\uFF08\u5DF2\u8FC7\u65F6\uFF09\n  -vcompat       \u521B\u5EFA\u4E0E 1.1 \u548C 1.2 \u5B58\u6839\u534F\u8BAE\u7248\u672C\n                           \u90FD\u517C\u5BB9\u7684\u5B58\u6839/\u9AA8\u67B6\uFF08\u5DF2\u8FC7\u65F6\uFF09\n  -v1.2         \uFF08\u9ED8\u8BA4\u503C\uFF09\u4EC5\u521B\u5EFA 1.2 \u5B58\u6839\u534F\u8BAE\u7248\u672C\u7684\u5B58\u6839\uFF08\u5DF2\u8FC7\u65F6\uFF09\n  -g             \u751F\u6210\u8C03\u8BD5\u4FE1\u606F\n  -nowarn        \u4E0D\u751F\u6210\u4EFB\u4F55\u8B66\u544A\n  -nowrite       \u4E0D\u5C06\u7F16\u8BD1\u7684\u7C7B\u5199\u5165\u6587\u4EF6\u7CFB\u7EDF\n  -verbose       \u8F93\u51FA\u6709\u5173\u7F16\u8BD1\u5668\u6B63\u5728\u6267\u884C\u7684\u64CD\u4F5C\u7684\u6D88\u606F\n  -classpath <\u8DEF\u5F84>      \u6307\u5B9A\u67E5\u627E\u8F93\u5165\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n  -bootclasspath <\u8DEF\u5F84>  \u8986\u76D6\u5F15\u5BFC\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n  -d <\u76EE\u5F55>         \u6307\u5B9A\u653E\u7F6E\u751F\u6210\u7684\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n  -J<\u8FD0\u884C\u65F6\u6807\u8BB0>       \u5C06\u53C2\u6570\u4F20\u9012\u7ED9 java \u89E3\u91CA\u5668\n
-
-#
-# Generic Messages
-#
-
-rmic.cant.read=\u65E0\u6CD5\u8BFB\u53D6: {0}
-rmic.cant.write=\u65E0\u6CD5\u5199\u5165: {0}
-rmic.option.unsupported=\u4E0D\u518D\u652F\u6301{0}\u9009\u9879\u3002
-rmic.option.unimplemented=\u5C1A\u672A\u5B9E\u73B0{0}\u9009\u9879\u3002
-rmic.option.already.seen={0}\u9009\u9879\u53EA\u80FD\u6307\u5B9A\u4E00\u6B21\u3002
-rmic.option.requires.argument=\u9009\u9879{0}\u9700\u8981\u53C2\u6570\u3002
-rmic.no.such.directory={0} \u76EE\u5F55\u4E0D\u5B58\u5728\u3002
-rmic.no.such.option={0}\u662F\u65E0\u6548\u9009\u9879\u6216\u53C2\u6570\u3002
-rmic.wrote=[\u5DF2\u5199\u5165{0}]
-rmic.errors={0} \u4E2A\u9519\u8BEF
-rmic.1error=1 \u4E2A\u9519\u8BEF
-rmic.warnings={0} \u4E2A\u8B66\u544A
-rmic.1warning=1 \u4E2A\u8B66\u544A
-rmic.done_in=[\u5728 {0} \u6BEB\u79D2\u5185\u5B8C\u6210]
-rmic.no.memory=\u7F16\u8BD1\u5668\u6240\u7528\u5185\u5B58\u4E0D\u8DB3\u3002\u8BF7\u8003\u8651\u4F7F\u7528 "-J-Xmx<size>" \u547D\u4EE4\u884C\u9009\u9879\u6765\u589E\u52A0\u5806\u5927\u5C0F\u7684\u6700\u5927\u503C\u3002
-rmic.stack.overflow=\u7F16\u8BD1\u5668\u6240\u7528\u5806\u6808\u7A7A\u95F4\u4E0D\u8DB3\u3002\u8BF7\u8003\u8651\u4F7F\u7528 "-J-Xss<size>" \u547D\u4EE4\u884C\u9009\u9879\u6765\u589E\u52A0\u5206\u914D\u7ED9 Java \u5806\u6808\u7684\u5185\u5B58\u5927\u5C0F\u3002
-rmic.class.not.found=\u627E\u4E0D\u5230\u7C7B{0}\u3002
-rmic.missing.property=\u7F3A\u5C11\u5C5E\u6027 generator.class.{0}
-rmic.cannot.instantiate=\u65E0\u6CD5\u5B9E\u4F8B\u5316\u7C7B{0}
-rmic.cannot.use.both=\u4E0D\u80FD\u540C\u65F6\u4F7F\u7528{0}\u548C{1}
-rmic.resource.not.found=\u627E\u4E0D\u5230{0}\u3002
-rmic.no.output.dir=\u65E0\u6CD5\u627E\u5230\u9002\u7528\u4E8E{0}\u7684\u8F93\u51FA\u76EE\u5F55\u3002\u8BF7\u4F7F\u7528 -d \u9009\u9879\u6765\u6307\u5B9A\u6839\u76EE\u5F55\u3002
-rmic.cannot.create.dir=\u65E0\u6CD5\u521B\u5EFA\u8F93\u51FA\u76EE\u5F55 {0}\u3002
-
-#
-# JRMP Messages
-#
-
-rmic.cant.make.stubs.for.interface={0}\u662F\u63A5\u53E3; \u4EC5\u8FDC\u7A0B\u5BF9\u8C61\u7C7B\u9700\u8981\u5B58\u6839\u3002
-rmic.must.implement.remote=\u7C7B{0}\u4E0D\u5B9E\u73B0\u6269\u5C55 java.rmi.Remote \u7684\u63A5\u53E3; \u4EC5\u8FDC\u7A0B\u5BF9\u8C61\u9700\u8981\u5B58\u6839\u548C\u6846\u67B6\u3002
-rmic.must.implement.remote.directly=\u4EC5\u76F4\u63A5\u5B9E\u73B0\u6269\u5C55 java.rmi.Remote \u7684\u63A5\u53E3\u7684\u7C7B\u9700\u8981\u5B58\u6839; \u7C7B{0}\u4E0D\u76F4\u63A5\u5B9E\u73B0\u8FDC\u7A0B\u63A5\u53E3\u3002
-rmic.must.throw.remoteexception={0}\u4E0D\u662F\u6709\u6548\u8FDC\u7A0B\u63A5\u53E3: \u65B9\u6CD5{1}\u5FC5\u987B\u629B\u51FA java.rmi.RemoteException\u3002
-rmic.must.only.throw.exception=\u65B9\u6CD5{0}\u4E0D\u662F\u6709\u6548\u7684\u8FDC\u7A0B\u65B9\u6CD5\u5B9E\u73B0, \u56E0\u4E3A\u5B83\u629B\u51FA\u4E86{1}; \u8FDC\u7A0B\u65B9\u6CD5\u5B9E\u73B0\u53EA\u53EF\u80FD\u629B\u51FA java.lang.Exception \u6216\u5176\u5B50\u7C7B\u3002
-rmic.jrmp.stubs.deprecated=\u8B66\u544A\uFF1A{0} \u5DF2\u8FC7\u65F6\uFF0C\u5C06\u4ECE\u672A\u6765\u53D1\u884C\u7248\u4E2D\u5220\u9664\u3002\n\u4E3A JRMP \u751F\u6210\u548C\u4F7F\u7528\u9AA8\u67B6\u53CA\u9759\u6001\u5B58\u6839\u5DF2\u8FC7\u65F6\u3002\n\u9AA8\u67B6\u4E0D\u518D\u5FC5\u8981\uFF0C\u800C\u9759\u6001\u5B58\u6839\u5DF2\u7531\u52A8\u6001\u751F\u6210\u7684\u5B58\u6839\u53D6\u4EE3\u3002\n\u5EFA\u8BAE\u7528\u6237\u4E0D\u518D\u4F7F\u7528\u6B64\u5DE5\u5177\u6765\u751F\u6210\u9AA8\u67B6\u548C\u9759\u6001\u5B58\u6839\u3002\n\u8BF7\u53C2\u9605\u6709\u5173 java.rmi.server.UnicastRemoteObject \n\u7684\u6587\u6863\u3002
--- a/src/jdk.rmic/share/classes/sun/tools/asm/ArrayData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-
-/**
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public final
-class ArrayData {
-    Type type;
-    int nargs;
-
-    public ArrayData(Type type, int nargs) {
-        this.type = type;
-        this.nargs = nargs;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/Assembler.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,963 +0,0 @@
-/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.util.Enumeration;
-import java.io.IOException;
-import java.io.DataOutputStream;
-import java.io.PrintStream;
-import java.util.Vector;
-// JCOV
-import sun.tools.javac.*;
-import java.io.File;
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.lang.String;
-// end JCOV
-
-/**
- * This class is used to assemble the bytecode instructions for a method.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- *
- * @author Arthur van Hoff
- */
-public final
-class Assembler implements Constants {
-    static final int NOTREACHED         = 0;
-    static final int REACHED            = 1;
-    static final int NEEDED             = 2;
-
-    Label first = new Label();
-    Instruction last = first;
-    int maxdepth;
-    int maxvar;
-    int maxpc;
-
-    /**
-     * Add an instruction
-     */
-    public void add(Instruction inst) {
-        if (inst != null) {
-            last.next = inst;
-            last = inst;
-        }
-    }
-    public void add(long where, int opc) {
-        add(new Instruction(where, opc, null));
-    }
-    public void add(long where, int opc, Object obj) {
-        add(new Instruction(where, opc, obj));
-    }
-// JCOV
-    public void add(long where, int opc, Object obj, boolean flagCondInverted) {
-        add(new Instruction(where, opc, obj, flagCondInverted));
-    }
-
-    public void add(boolean flagNoCovered, long where, int opc, Object obj) {
-        add(new Instruction(flagNoCovered, where, opc, obj));
-    }
-
-    public void add(long where, int opc, boolean flagNoCovered) {
-        add(new Instruction(where, opc, flagNoCovered));
-    }
-
-    static Vector<String> SourceClassList = new Vector<>();
-
-    static Vector<String> TmpCovTable = new Vector<>();
-
-    static int[]  JcovClassCountArray = new int[CT_LAST_KIND + 1];
-
-    static String JcovMagicLine     = "JCOV-DATA-FILE-VERSION: 2.0";
-    static String JcovClassLine     = "CLASS: ";
-    static String JcovSrcfileLine   = "SRCFILE: ";
-    static String JcovTimestampLine = "TIMESTAMP: ";
-    static String JcovDataLine      = "DATA: ";
-    static String JcovHeadingLine   = "#kind\tcount";
-
-    static int[]  arrayModifiers    =
-                {M_PUBLIC, M_PRIVATE, M_PROTECTED, M_ABSTRACT, M_FINAL, M_INTERFACE};
-    static int[]  arrayModifiersOpc =
-                {PUBLIC, PRIVATE, PROTECTED, ABSTRACT, FINAL, INTERFACE};
-//end JCOV
-
-    /**
-     * Optimize instructions and mark those that can be reached
-     */
-    void optimize(Environment env, Label lbl) {
-        lbl.pc = REACHED;
-
-        for (Instruction inst = lbl.next ; inst != null ; inst = inst.next)  {
-            switch (inst.pc) {
-              case NOTREACHED:
-                inst.optimize(env);
-                inst.pc = REACHED;
-                break;
-              case REACHED:
-                return;
-              case NEEDED:
-                break;
-            }
-
-            switch (inst.opc) {
-              case opc_label:
-              case opc_dead:
-                if (inst.pc == REACHED) {
-                    inst.pc = NOTREACHED;
-                }
-                break;
-
-              case opc_ifeq:
-              case opc_ifne:
-              case opc_ifgt:
-              case opc_ifge:
-              case opc_iflt:
-              case opc_ifle:
-              case opc_if_icmpeq:
-              case opc_if_icmpne:
-              case opc_if_icmpgt:
-              case opc_if_icmpge:
-              case opc_if_icmplt:
-              case opc_if_icmple:
-              case opc_if_acmpeq:
-              case opc_if_acmpne:
-              case opc_ifnull:
-              case opc_ifnonnull:
-                optimize(env, (Label)inst.value);
-                break;
-
-              case opc_goto:
-                optimize(env, (Label)inst.value);
-                return;
-
-              case opc_jsr:
-                optimize(env, (Label)inst.value);
-                break;
-
-              case opc_ret:
-              case opc_return:
-              case opc_ireturn:
-              case opc_lreturn:
-              case opc_freturn:
-              case opc_dreturn:
-              case opc_areturn:
-              case opc_athrow:
-                return;
-
-              case opc_tableswitch:
-              case opc_lookupswitch: {
-                SwitchData sw = (SwitchData)inst.value;
-                optimize(env, sw.defaultLabel);
-                for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) {
-                    optimize(env, e.nextElement());
-                }
-                return;
-              }
-
-              case opc_try: {
-                TryData td = (TryData)inst.value;
-                td.getEndLabel().pc = NEEDED;
-                for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) {
-                    CatchData cd = e.nextElement();
-                    optimize(env, cd.getLabel());
-                }
-                break;
-              }
-            }
-        }
-    }
-
-    /**
-     * Eliminate instructions that are not reached
-     */
-    boolean eliminate() {
-        boolean change = false;
-        Instruction prev = first;
-
-        for (Instruction inst = first.next ; inst != null ; inst = inst.next) {
-            if (inst.pc != NOTREACHED) {
-                prev.next = inst;
-                prev = inst;
-                inst.pc = NOTREACHED;
-            } else {
-                change = true;
-            }
-        }
-        first.pc = NOTREACHED;
-        prev.next = null;
-        return change;
-    }
-
-    /**
-     * Optimize the byte codes
-     */
-    public void optimize(Environment env) {
-        //listing(System.out);
-        do {
-            // Figure out which instructions are reached
-            optimize(env, first);
-
-            // Eliminate instructions that are not reached
-        } while (eliminate() && env.opt());
-    }
-
-    /**
-     * Collect all constants into the constant table
-     */
-    public void collect(Environment env, MemberDefinition field, ConstantPool tab) {
-        // Collect constants for arguments only
-        // if a local variable table is generated
-        if ((field != null) && env.debug_vars()) {
-            @SuppressWarnings("unchecked")
-            Vector<MemberDefinition> v = field.getArguments();
-            if (v != null) {
-                for (Enumeration<MemberDefinition> e = v.elements() ; e.hasMoreElements() ;) {
-                    MemberDefinition f = e.nextElement();
-                    tab.put(f.getName().toString());
-                    tab.put(f.getType().getTypeSignature());
-                }
-            }
-        }
-
-        // Collect constants from the instructions
-        for (Instruction inst = first ; inst != null ; inst = inst.next) {
-            inst.collect(tab);
-        }
-    }
-
-    /**
-     * Determine stack size, count local variables
-     */
-    void balance(Label lbl, int depth) {
-        for (Instruction inst = lbl ; inst != null ; inst = inst.next)  {
-            //Environment.debugOutput(inst.toString() + ": " + depth + " => " +
-            //                                 (depth + inst.balance()));
-            depth += inst.balance();
-            if (depth < 0) {
-               throw new CompilerError("stack under flow: " + inst.toString() + " = " + depth);
-            }
-            if (depth > maxdepth) {
-                maxdepth = depth;
-            }
-            switch (inst.opc) {
-              case opc_label:
-                lbl = (Label)inst;
-                if (inst.pc == REACHED) {
-                    if (lbl.depth != depth) {
-                        throw new CompilerError("stack depth error " +
-                                                depth + "/" + lbl.depth +
-                                                ": " + inst.toString());
-                    }
-                    return;
-                }
-                lbl.pc = REACHED;
-                lbl.depth = depth;
-                break;
-
-              case opc_ifeq:
-              case opc_ifne:
-              case opc_ifgt:
-              case opc_ifge:
-              case opc_iflt:
-              case opc_ifle:
-              case opc_if_icmpeq:
-              case opc_if_icmpne:
-              case opc_if_icmpgt:
-              case opc_if_icmpge:
-              case opc_if_icmplt:
-              case opc_if_icmple:
-              case opc_if_acmpeq:
-              case opc_if_acmpne:
-              case opc_ifnull:
-              case opc_ifnonnull:
-                balance((Label)inst.value, depth);
-                break;
-
-              case opc_goto:
-                balance((Label)inst.value, depth);
-                return;
-
-              case opc_jsr:
-                balance((Label)inst.value, depth + 1);
-                break;
-
-              case opc_ret:
-              case opc_return:
-              case opc_ireturn:
-              case opc_lreturn:
-              case opc_freturn:
-              case opc_dreturn:
-              case opc_areturn:
-              case opc_athrow:
-                return;
-
-              case opc_iload:
-              case opc_fload:
-              case opc_aload:
-              case opc_istore:
-              case opc_fstore:
-              case opc_astore: {
-                int v = ((inst.value instanceof Number)
-                            ? ((Number)inst.value).intValue()
-                            : ((LocalVariable)inst.value).slot) + 1;
-                if (v > maxvar)
-                    maxvar = v;
-                break;
-              }
-
-              case opc_lload:
-              case opc_dload:
-              case opc_lstore:
-              case opc_dstore: {
-                int v = ((inst.value instanceof Number)
-                            ? ((Number)inst.value).intValue()
-                            : ((LocalVariable)inst.value).slot) + 2;
-                if (v  > maxvar)
-                    maxvar = v;
-                break;
-              }
-
-              case opc_iinc: {
-                  int v = ((int[])inst.value)[0] + 1;
-                  if (v  > maxvar)
-                      maxvar = v + 1;
-                  break;
-              }
-
-              case opc_tableswitch:
-              case opc_lookupswitch: {
-                SwitchData sw = (SwitchData)inst.value;
-                balance(sw.defaultLabel, depth);
-                for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) {
-                    balance(e.nextElement(), depth);
-                }
-                return;
-              }
-
-              case opc_try: {
-                TryData td = (TryData)inst.value;
-                for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) {
-                    CatchData cd = e.nextElement();
-                    balance(cd.getLabel(), depth + 1);
-                }
-                break;
-              }
-            }
-        }
-    }
-
-    /**
-     * Generate code
-     */
-    public void write(Environment env, DataOutputStream out,
-                      MemberDefinition field, ConstantPool tab)
-                 throws IOException {
-        //listing(System.out);
-
-        if ((field != null) && field.getArguments() != null) {
-              int sum = 0;
-              @SuppressWarnings("unchecked")
-              Vector<MemberDefinition> v = field.getArguments();
-              for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) {
-                  MemberDefinition f = e.nextElement();
-                  sum += f.getType().stackSize();
-              }
-              maxvar = sum;
-        }
-
-        // Make sure the stack balances.  Also calculate maxvar and maxstack
-        try {
-            balance(first, 0);
-        } catch (CompilerError e) {
-            System.out.println("ERROR: " + e);
-            listing(System.out);
-            throw e;
-        }
-
-        // Assign PCs
-        int pc = 0, nexceptions = 0;
-        for (Instruction inst = first ; inst != null ; inst = inst.next) {
-            inst.pc = pc;
-            int sz = inst.size(tab);
-            if (pc<65536 && (pc+sz)>=65536) {
-               env.error(inst.where, "warn.method.too.long");
-            }
-            pc += sz;
-
-            if (inst.opc == opc_try) {
-                nexceptions += ((TryData)inst.value).catches.size();
-            }
-        }
-
-        // Write header
-        out.writeShort(maxdepth);
-        out.writeShort(maxvar);
-        out.writeInt(maxpc = pc);
-
-        // Generate code
-        for (Instruction inst = first.next ; inst != null ; inst = inst.next) {
-            inst.write(out, tab);
-        }
-
-        // write exceptions
-        out.writeShort(nexceptions);
-        if (nexceptions > 0) {
-            //listing(System.out);
-            writeExceptions(env, out, tab, first, last);
-        }
-    }
-
-    /**
-     * Write the exceptions table
-     */
-    void writeExceptions(Environment env, DataOutputStream out, ConstantPool tab, Instruction first, Instruction last) throws IOException {
-        for (Instruction inst = first ; inst != last.next ; inst = inst.next) {
-            if (inst.opc == opc_try) {
-                TryData td = (TryData)inst.value;
-                writeExceptions(env, out, tab, inst.next, td.getEndLabel());
-                for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) {
-                    CatchData cd = e.nextElement();
-                    //System.out.println("EXCEPTION: " + env.getSource() + ", pc=" + inst.pc + ", end=" + td.getEndLabel().pc + ", hdl=" + cd.getLabel().pc + ", tp=" + cd.getType());
-                    out.writeShort(inst.pc);
-                    out.writeShort(td.getEndLabel().pc);
-                    out.writeShort(cd.getLabel().pc);
-                    if (cd.getType() != null) {
-                        out.writeShort(tab.index(cd.getType()));
-                    } else {
-                        out.writeShort(0);
-                    }
-                }
-                inst = td.getEndLabel();
-            }
-        }
-    }
-
-//JCOV
-    /**
-     * Write the coverage table
-     */
-    public void writeCoverageTable(Environment env, ClassDefinition c, DataOutputStream out, ConstantPool tab, long whereField) throws IOException {
-        Vector<Cover> TableLot = new Vector<>();         /* Coverage table */
-        boolean begseg = false;
-        boolean begmeth = false;
-        @SuppressWarnings("deprecation")
-        long whereClass = ((SourceClass)c).getWhere();
-        Vector<Long> whereTry = new Vector<>();
-        int numberTry = 0;
-        int count = 0;
-
-        for (Instruction inst = first ; inst != null ; inst = inst.next) {
-            long n = (inst.where >> WHEREOFFSETBITS);
-            if (n > 0 && inst.opc != opc_label) {
-                if (!begmeth) {
-                  if ( whereClass == inst.where)
-                        TableLot.addElement(new Cover(CT_FIKT_METHOD, whereField, inst.pc));
-                  else
-                        TableLot.addElement(new Cover(CT_METHOD, whereField, inst.pc));
-                  count++;
-                  begmeth = true;
-                }
-                if (!begseg && !inst.flagNoCovered ) {
-                  boolean findTry = false;
-                  for (Enumeration<Long> e = whereTry.elements(); e.hasMoreElements();) {
-                       if (e.nextElement().longValue() == inst.where) {
-                              findTry = true;
-                              break;
-                       }
-                  }
-                  if (!findTry) {
-                      TableLot.addElement(new Cover(CT_BLOCK, inst.where, inst.pc));
-                      count++;
-                      begseg = true;
-                  }
-                }
-            }
-            switch (inst.opc) {
-              case opc_label:
-                begseg = false;
-                break;
-              case opc_ifeq:
-              case opc_ifne:
-              case opc_ifnull:
-              case opc_ifnonnull:
-              case opc_ifgt:
-              case opc_ifge:
-              case opc_iflt:
-              case opc_ifle:
-              case opc_if_icmpeq:
-              case opc_if_icmpne:
-              case opc_if_icmpgt:
-              case opc_if_icmpge:
-              case opc_if_icmplt:
-              case opc_if_icmple:
-              case opc_if_acmpeq:
-              case opc_if_acmpne: {
-                if ( inst.flagCondInverted ) {
-                   TableLot.addElement(new Cover(CT_BRANCH_TRUE, inst.where, inst.pc));
-                   TableLot.addElement(new Cover(CT_BRANCH_FALSE, inst.where, inst.pc));
-                } else {
-                   TableLot.addElement(new Cover(CT_BRANCH_FALSE, inst.where, inst.pc));
-                   TableLot.addElement(new Cover(CT_BRANCH_TRUE, inst.where, inst.pc));
-                }
-                count += 2;
-                begseg = false;
-                break;
-              }
-
-              case opc_goto: {
-                begseg = false;
-                break;
-              }
-
-              case opc_ret:
-              case opc_return:
-              case opc_ireturn:
-              case opc_lreturn:
-              case opc_freturn:
-              case opc_dreturn:
-              case opc_areturn:
-              case opc_athrow: {
-                break;
-              }
-
-              case opc_try: {
-                whereTry.addElement(Long.valueOf(inst.where));
-                begseg = false;
-                break;
-              }
-
-              case opc_tableswitch: {
-                SwitchData sw = (SwitchData)inst.value;
-                for (int i = sw.minValue; i <= sw.maxValue; i++) {
-                     TableLot.addElement(new Cover(CT_CASE, sw.whereCase(i), inst.pc));
-                     count++;
-                }
-                if (!sw.getDefault()) {
-                     TableLot.addElement(new Cover(CT_SWITH_WO_DEF, inst.where, inst.pc));
-                     count++;
-                } else {
-                     TableLot.addElement(new Cover(CT_CASE, sw.whereCase("default"), inst.pc));
-                     count++;
-                }
-                begseg = false;
-                break;
-              }
-              case opc_lookupswitch: {
-                SwitchData sw = (SwitchData)inst.value;
-                for (Enumeration<Integer> e = sw.sortedKeys(); e.hasMoreElements() ; ) {
-                     Integer v = e.nextElement();
-                     TableLot.addElement(new Cover(CT_CASE, sw.whereCase(v), inst.pc));
-                     count++;
-                }
-                if (!sw.getDefault()) {
-                     TableLot.addElement(new Cover(CT_SWITH_WO_DEF, inst.where, inst.pc));
-                     count++;
-                } else {
-                     TableLot.addElement(new Cover(CT_CASE, sw.whereCase("default"), inst.pc));
-                     count++;
-                }
-                begseg = false;
-                break;
-              }
-            }
-        }
-        Cover Lot;
-        long ln, pos;
-
-        out.writeShort(count);
-        for (int i = 0; i < count; i++) {
-           Lot = TableLot.elementAt(i);
-           ln = (Lot.Addr >> WHEREOFFSETBITS);
-           pos = (Lot.Addr << (64 - WHEREOFFSETBITS)) >> (64 - WHEREOFFSETBITS);
-           out.writeShort(Lot.NumCommand);
-           out.writeShort(Lot.Type);
-           out.writeInt((int)ln);
-           out.writeInt((int)pos);
-
-           if ( !(Lot.Type == CT_CASE && Lot.Addr == 0) ) {
-                JcovClassCountArray[Lot.Type]++;
-           }
-        }
-
-    }
-
-/*
- *  Increase count of methods for native methods
- */
-
-public void addNativeToJcovTab(Environment env, ClassDefinition c) {
-        JcovClassCountArray[CT_METHOD]++;
-}
-
-/*
- *  Create class jcov element
- */
-
-private String createClassJcovElement(Environment env, ClassDefinition c) {
-        String SourceClass = (Type.mangleInnerType((c.getClassDeclaration()).getName())).toString();
-        String ConvSourceClass;
-        String classJcovLine;
-
-        SourceClassList.addElement(SourceClass);
-        ConvSourceClass = SourceClass.replace('.', '/');
-        classJcovLine = JcovClassLine + ConvSourceClass;
-
-        classJcovLine = classJcovLine + " [";
-        String blank = "";
-
-        for (int i = 0; i < arrayModifiers.length; i++ ) {
-            if ((c.getModifiers() & arrayModifiers[i]) != 0) {
-                classJcovLine = classJcovLine + blank + opNames[arrayModifiersOpc[i]];
-                blank = " ";
-            }
-        }
-        classJcovLine = classJcovLine + "]";
-
-        return classJcovLine;
-}
-
-/*
- *  generate coverage data
- */
-
-public void GenVecJCov(Environment env, ClassDefinition c, long Time) {
-        @SuppressWarnings("deprecation")
-        String SourceFile = ((SourceClass)c).getAbsoluteName();
-
-        TmpCovTable.addElement(createClassJcovElement(env, c));
-        TmpCovTable.addElement(JcovSrcfileLine + SourceFile);
-        TmpCovTable.addElement(JcovTimestampLine + Time);
-        TmpCovTable.addElement(JcovDataLine + "A");             // data format
-        TmpCovTable.addElement(JcovHeadingLine);
-
-        for (int i = CT_FIRST_KIND; i <= CT_LAST_KIND; i++) {
-            if (JcovClassCountArray[i] != 0) {
-                TmpCovTable.addElement(new String(i + "\t" + JcovClassCountArray[i]));
-                JcovClassCountArray[i] = 0;
-            }
-        }
-}
-
-
-/*
- * generate file of coverage data
- */
-
-@SuppressWarnings("deprecation") // for JCovd.readLine() calls
-public void GenJCov(Environment env) {
-
-     try {
-        File outFile = env.getcovFile();
-        if( outFile.exists()) {
-           DataInputStream JCovd = new DataInputStream(
-                                                       new BufferedInputStream(
-                                                                               new FileInputStream(outFile)));
-           String CurrLine = null;
-           boolean first = true;
-           String Class;
-
-           CurrLine = JCovd.readLine();
-           if ((CurrLine != null) && CurrLine.startsWith(JcovMagicLine)) {
-                // this is a good Jcov file
-
-                   while((CurrLine = JCovd.readLine()) != null ) {
-                      if ( CurrLine.startsWith(JcovClassLine) ) {
-                             first = true;
-                             for(Enumeration<String> e = SourceClassList.elements(); e.hasMoreElements();) {
-                                 String clsName = CurrLine.substring(JcovClassLine.length());
-                                 int idx = clsName.indexOf(' ');
-
-                                 if (idx != -1) {
-                                     clsName = clsName.substring(0, idx);
-                                 }
-                                 Class = e.nextElement();
-                                 if ( Class.compareTo(clsName) == 0) {
-                                     first = false;
-                                     break;
-                                 }
-                             }
-                      }
-                      if (first)        // re-write old class
-                          TmpCovTable.addElement(CurrLine);
-                   }
-           }
-           JCovd.close();
-        }
-        PrintStream CovFile = new PrintStream(new DataOutputStream(new FileOutputStream(outFile)));
-        CovFile.println(JcovMagicLine);
-        for(Enumeration<String> e = TmpCovTable.elements(); e.hasMoreElements();) {
-              CovFile.println(e.nextElement());
-        }
-        CovFile.close();
-    }
-    catch (FileNotFoundException e) {
-       System.out.println("ERROR: " + e);
-    }
-    catch (IOException e) {
-       System.out.println("ERROR: " + e);
-    }
-}
-// end JCOV
-
-
-    /**
-     * Write the linenumber table
-     */
-    public void writeLineNumberTable(Environment env, DataOutputStream out, ConstantPool tab) throws IOException {
-        long ln = -1;
-        int count = 0;
-
-        for (Instruction inst = first ; inst != null ; inst = inst.next) {
-            long n = (inst.where >> WHEREOFFSETBITS);
-            if ((n > 0) && (ln != n)) {
-                ln = n;
-                count++;
-            }
-        }
-
-        ln = -1;
-        out.writeShort(count);
-        for (Instruction inst = first ; inst != null ; inst = inst.next) {
-            long n = (inst.where >> WHEREOFFSETBITS);
-            if ((n > 0) && (ln != n)) {
-                ln = n;
-                out.writeShort(inst.pc);
-                out.writeShort((int)ln);
-                //System.out.println("pc = " + inst.pc + ", ln = " + ln);
-            }
-        }
-    }
-
-    /**
-     * Figure out when registers contain a legal value. This is done
-     * using a simple data flow algorithm. This information is later used
-     * to generate the local variable table.
-     */
-    void flowFields(Environment env, Label lbl, MemberDefinition locals[]) {
-        if (lbl.locals != null) {
-            // Been here before. Erase any conflicts.
-            MemberDefinition f[] = lbl.locals;
-            for (int i = 0 ; i < maxvar ; i++) {
-                if (f[i] != locals[i]) {
-                    f[i] = null;
-                }
-            }
-            return;
-        }
-
-        // Remember the set of active registers at this point
-        lbl.locals = new MemberDefinition[maxvar];
-        System.arraycopy(locals, 0, lbl.locals, 0, maxvar);
-
-        MemberDefinition newlocals[] = new MemberDefinition[maxvar];
-        System.arraycopy(locals, 0, newlocals, 0, maxvar);
-        locals = newlocals;
-
-        for (Instruction inst = lbl.next ; inst != null ; inst = inst.next)  {
-            switch (inst.opc) {
-              case opc_istore:   case opc_istore_0: case opc_istore_1:
-              case opc_istore_2: case opc_istore_3:
-              case opc_fstore:   case opc_fstore_0: case opc_fstore_1:
-              case opc_fstore_2: case opc_fstore_3:
-              case opc_astore:   case opc_astore_0: case opc_astore_1:
-              case opc_astore_2: case opc_astore_3:
-              case opc_lstore:   case opc_lstore_0: case opc_lstore_1:
-              case opc_lstore_2: case opc_lstore_3:
-              case opc_dstore:   case opc_dstore_0: case opc_dstore_1:
-              case opc_dstore_2: case opc_dstore_3:
-                if (inst.value instanceof LocalVariable) {
-                    LocalVariable v = (LocalVariable)inst.value;
-                    locals[v.slot] = v.field;
-                }
-                break;
-
-              case opc_label:
-                flowFields(env, (Label)inst, locals);
-                return;
-
-              case opc_ifeq: case opc_ifne: case opc_ifgt:
-              case opc_ifge: case opc_iflt: case opc_ifle:
-              case opc_if_icmpeq: case opc_if_icmpne: case opc_if_icmpgt:
-              case opc_if_icmpge: case opc_if_icmplt: case opc_if_icmple:
-              case opc_if_acmpeq: case opc_if_acmpne:
-              case opc_ifnull: case opc_ifnonnull:
-              case opc_jsr:
-                flowFields(env, (Label)inst.value, locals);
-                break;
-
-              case opc_goto:
-                flowFields(env, (Label)inst.value, locals);
-                return;
-
-              case opc_return:   case opc_ireturn:  case opc_lreturn:
-              case opc_freturn:  case opc_dreturn:  case opc_areturn:
-              case opc_athrow:   case opc_ret:
-                return;
-
-              case opc_tableswitch:
-              case opc_lookupswitch: {
-                SwitchData sw = (SwitchData)inst.value;
-                flowFields(env, sw.defaultLabel, locals);
-                for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) {
-                    flowFields(env, e.nextElement(), locals);
-                }
-                return;
-              }
-
-              case opc_try: {
-                Vector<CatchData> catches = ((TryData)inst.value).catches;
-                for (Enumeration<CatchData> e = catches.elements(); e.hasMoreElements();) {
-                    CatchData cd = e.nextElement();
-                    flowFields(env, cd.getLabel(), locals);
-                }
-                break;
-              }
-            }
-        }
-    }
-
-    /**
-     * Write the local variable table. The necessary constants have already been
-     * added to the constant table by the collect() method. The flowFields method
-     * is used to determine which variables are alive at each pc.
-     */
-    public void writeLocalVariableTable(Environment env, MemberDefinition field, DataOutputStream out, ConstantPool tab) throws IOException {
-        MemberDefinition locals[] = new MemberDefinition[maxvar];
-        int i = 0;
-
-        // Initialize arguments
-        if ((field != null) && (field.getArguments() != null)) {
-            int reg = 0;
-            @SuppressWarnings("unchecked")
-            Vector<MemberDefinition> v = field.getArguments();
-            for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) {
-                MemberDefinition f = e.nextElement();
-                locals[reg] = f;
-                reg += f.getType().stackSize();
-            }
-        }
-
-        flowFields(env, first, locals);
-        LocalVariableTable lvtab = new LocalVariableTable();
-
-        // Initialize arguments again
-        for (i = 0; i < maxvar; i++)
-            locals[i] = null;
-        if ((field != null) && (field.getArguments() != null)) {
-            int reg = 0;
-            @SuppressWarnings("unchecked")
-            Vector<MemberDefinition> v = field.getArguments();
-            for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) {
-                MemberDefinition f = e.nextElement();
-                locals[reg] = f;
-                lvtab.define(f, reg, 0, maxpc);
-                reg += f.getType().stackSize();
-            }
-        }
-
-        int pcs[] = new int[maxvar];
-
-        for (Instruction inst = first ; inst != null ; inst = inst.next)  {
-            switch (inst.opc) {
-              case opc_istore:   case opc_istore_0: case opc_istore_1:
-              case opc_istore_2: case opc_istore_3: case opc_fstore:
-              case opc_fstore_0: case opc_fstore_1: case opc_fstore_2:
-              case opc_fstore_3:
-              case opc_astore:   case opc_astore_0: case opc_astore_1:
-              case opc_astore_2: case opc_astore_3:
-              case opc_lstore:   case opc_lstore_0: case opc_lstore_1:
-              case opc_lstore_2: case opc_lstore_3:
-              case opc_dstore:   case opc_dstore_0: case opc_dstore_1:
-              case opc_dstore_2: case opc_dstore_3:
-                if (inst.value instanceof LocalVariable) {
-                    LocalVariable v = (LocalVariable)inst.value;
-                    int pc = (inst.next != null) ? inst.next.pc : inst.pc;
-                    if (locals[v.slot] != null) {
-                        lvtab.define(locals[v.slot], v.slot, pcs[v.slot], pc);
-                    }
-                    pcs[v.slot] = pc;
-                    locals[v.slot] = v.field;
-                }
-                break;
-
-              case opc_label: {
-                // flush  previous labels
-                for (i = 0 ; i < maxvar ; i++) {
-                    if (locals[i] != null) {
-                        lvtab.define(locals[i], i, pcs[i], inst.pc);
-                    }
-                }
-                // init new labels
-                int pc = inst.pc;
-                MemberDefinition[] labelLocals = ((Label)inst).locals;
-                if (labelLocals == null) { // unreachable code??
-                    for (i = 0; i < maxvar; i++)
-                        locals[i] = null;
-                } else {
-                    System.arraycopy(labelLocals, 0, locals, 0, maxvar);
-                }
-                for (i = 0 ; i < maxvar ; i++) {
-                    pcs[i] = pc;
-                }
-                break;
-              }
-            }
-        }
-
-        // flush  remaining labels
-        for (i = 0 ; i < maxvar ; i++) {
-            if (locals[i] != null) {
-                lvtab.define(locals[i], i, pcs[i], maxpc);
-            }
-        }
-
-        // write the local variable table
-        lvtab.write(env, out, tab);
-    }
-
-    /**
-     * Return true if empty
-     */
-    public boolean empty() {
-        return first == last;
-    }
-
-    /**
-     * Print the byte codes
-     */
-    public void listing(PrintStream out) {
-        out.println("-- listing --");
-        for (Instruction inst = first ; inst != null ; inst = inst.next) {
-            out.println(inst.toString());
-        }
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/CatchData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.util.Hashtable;
-
-/**
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public final
-class CatchData {
-     Object type;
-     Label label;
-
-     /**
-      * Constructor
-      */
-     CatchData(Object type) {
-         this.type = type;
-         this.label = new Label();
-     }
-
-     /**
-      * Get the label
-      */
-     public Label getLabel() {
-         return label;
-     }
-
-     /**
-      * Get the clazz
-      */
-     public Object getType() {
-         return type;
-     }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/ClassConstantData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * This is a class constant pool item.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-final
-class ClassConstantData extends ConstantPoolData {
-    String name;
-
-    /**
-     * Constructor
-     */
-
-    ClassConstantData(ConstantPool tab, ClassDeclaration clazz) {
-        String sig = clazz.getType().getTypeSignature();
-        // sig is like "Lfoo/bar;", name is like "foo/bar".
-        // We assume SIG_CLASS and SIG_ENDCLASS are 1 char each.
-        name = sig.substring(1, sig.length()-1);
-        tab.put(name);
-    }
-
-    // REMIND: this case should eventually go away.
-    ClassConstantData(ConstantPool tab, Type t) {
-        name = t.getTypeSignature();
-        tab.put(name);
-    }
-
-    /**
-     * Write the constant to the output stream
-     */
-    void write(Environment env, DataOutputStream out, ConstantPool tab) throws IOException {
-        out.writeByte(CONSTANT_CLASS);
-        out.writeShort(tab.index(name));
-    }
-
-    /**
-     * Return the order of the constant
-     */
-    int order() {
-        return 1;
-    }
-
-    public String toString() {
-        return "ClassConstantData[" + name + "]";
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/ConstantPool.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import sun.tools.tree.StringExpression;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * A table of constants
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public final
-class ConstantPool implements RuntimeConstants {
-    Hashtable<Object, ConstantPoolData> hash = new Hashtable<>(101);
-
-    /**
-     * Find an entry, may return 0
-     */
-    public int index(Object obj) {
-        return hash.get(obj).index;
-    }
-
-    /**
-     * Add an entry
-     */
-    public void put(Object obj) {
-        ConstantPoolData data = hash.get(obj);
-        if (data == null) {
-            if (obj instanceof String) {
-                data = new StringConstantData(this, (String)obj);
-            } else if (obj instanceof StringExpression) {
-                data = new StringExpressionConstantData(this, (StringExpression)obj);
-            } else if (obj instanceof ClassDeclaration) {
-                data = new ClassConstantData(this, (ClassDeclaration)obj);
-            } else if (obj instanceof Type) {
-                data = new ClassConstantData(this, (Type)obj);
-            } else if (obj instanceof MemberDefinition) {
-                data = new FieldConstantData(this, (MemberDefinition)obj);
-            } else if (obj instanceof NameAndTypeData) {
-                data = new NameAndTypeConstantData(this, (NameAndTypeData)obj);
-            } else if (obj instanceof Number) {
-                data = new NumberConstantData(this, (Number)obj);
-            }
-            hash.put(obj, data);
-        }
-    }
-
-    /**
-     * Write to output
-     */
-    public void write(Environment env, DataOutputStream out) throws IOException {
-        ConstantPoolData list[] = new ConstantPoolData[hash.size()];
-        String keys[] = new String[list.length];
-        int index = 1, count = 0;
-
-        // Make a list of all the constant pool items
-        for (int n = 0 ; n < 5 ; n++) {
-            int first = count;
-            for (Enumeration<ConstantPoolData> e = hash.elements() ; e.hasMoreElements() ;) {
-                ConstantPoolData data = e.nextElement();
-                if (data.order() == n) {
-                    keys[count] = sortKey(data);
-                    list[count++] = data;
-                }
-            }
-            xsort(list, keys, first, count-1);
-        }
-
-        // Assign an index to each constant pool item
-        for (int n = 0 ; n < list.length ; n++) {
-            ConstantPoolData data = list[n];
-            data.index = index;
-            index += data.width();
-        }
-
-        // Write length
-        out.writeShort(index);
-
-        // Write each constant pool item
-        for (int n = 0 ; n < count ; n++) {
-            list[n].write(env, out, this);
-        }
-    }
-
-    private
-    static String sortKey(ConstantPoolData f) {
-        if (f instanceof NumberConstantData) {
-            Number num = ((NumberConstantData)f).num;
-            String str = num.toString();
-            int key = 3;
-            if (num instanceof Integer)  key = 0;
-            else if (num instanceof Float)  key = 1;
-            else if (num instanceof Long)  key = 2;
-            return "\0" + (char)(str.length() + key<<8) + str;
-        }
-        if (f instanceof StringExpressionConstantData)
-            return (String)((StringExpressionConstantData)f).str.getValue();
-        if (f instanceof FieldConstantData) {
-            MemberDefinition fd = ((FieldConstantData)f).field;
-            return fd.getName()+" "+fd.getType().getTypeSignature()
-                +" "+fd.getClassDeclaration().getName();
-        }
-        if (f instanceof NameAndTypeConstantData)
-            return  ((NameAndTypeConstantData)f).name+
-                " "+((NameAndTypeConstantData)f).type;
-        if (f instanceof ClassConstantData)
-            return ((ClassConstantData)f).name;
-        return ((StringConstantData)f).str;
-    }
-
-    /**
-     * Quick sort an array of pool entries and a corresponding array of Strings
-     * that are the sort keys for the field.
-     */
-    private
-    static void xsort(ConstantPoolData ff[], String ss[], int left, int right) {
-        if (left >= right)
-            return;
-        String pivot = ss[left];
-        int l = left;
-        int r = right;
-        while (l < r) {
-            while (l <= right && ss[l].compareTo(pivot) <= 0)
-                l++;
-            while (r >= left && ss[r].compareTo(pivot) > 0)
-                r--;
-            if (l < r) {
-                // swap items at l and at r
-                ConstantPoolData def = ff[l];
-                String name = ss[l];
-                ff[l] = ff[r]; ff[r] = def;
-                ss[l] = ss[r]; ss[r] = name;
-            }
-        }
-        int middle = r;
-        // swap left and middle
-        ConstantPoolData def = ff[left];
-        String name = ss[left];
-        ff[left] = ff[middle]; ff[middle] = def;
-        ss[left] = ss[middle]; ss[middle] = name;
-        xsort(ff, ss, left, middle-1);
-        xsort(ff, ss, middle + 1, right);
-    }
-
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/ConstantPoolData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * Base constant data class. Every constant pool data item
- * is derived from this class.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-
-abstract class  ConstantPoolData implements RuntimeConstants {
-    int index;
-
-    /**
-     * Write the constant to the output stream
-     */
-    abstract void write(Environment env, DataOutputStream out, ConstantPool tab) throws IOException;
-
-    /**
-     * Return the order of the constant
-     */
-    int order() {
-        return 0;
-    }
-
-    /**
-     * Return the number of entries that it takes up in the constant pool
-     */
-    int width() {
-        return 1;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/Cover.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-/**
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public class Cover {
-public int Type;
-public long Addr;
-public int NumCommand;
-
-     /**
-      * Constructor
-      */
-     public Cover(int type, long addr, int command) {
-        Type=type;
-        Addr=addr;
-        NumCommand=command;
-     }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/FieldConstantData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * This is a field constant pool data item
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-final
-class FieldConstantData extends ConstantPoolData {
-    MemberDefinition field;
-    NameAndTypeData nt;
-
-    /**
-     * Constructor
-     */
-    FieldConstantData(ConstantPool tab, MemberDefinition field) {
-        this.field = field;
-        nt = new NameAndTypeData(field);
-        tab.put(field.getClassDeclaration());
-        tab.put(nt);
-    }
-
-    /**
-     * Write the constant to the output stream
-     */
-    void write(Environment env, DataOutputStream out, ConstantPool tab) throws IOException {
-        if (field.isMethod()) {
-            if (field.getClassDefinition().isInterface()) {
-                out.writeByte(CONSTANT_INTERFACEMETHOD);
-            } else {
-                out.writeByte(CONSTANT_METHOD);
-            }
-        } else {
-            out.writeByte(CONSTANT_FIELD);
-        }
-        out.writeShort(tab.index(field.getClassDeclaration()));
-        out.writeShort(tab.index(nt));
-    }
-
-    /**
-     * Return the order of the constant
-     */
-    int order() {
-        return 2;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/Instruction.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,832 +0,0 @@
-/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.util.Enumeration;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * An Java instruction
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public
-class Instruction implements Constants {
-    long where;
-    int pc;
-    int opc;
-    Object value;
-    Instruction next;
-//JCOV
-    boolean flagCondInverted;        /* if true, the condition  is reversed
-                                   relatively of source code */
-    boolean flagNoCovered = false; /* if true, the command will
-                                   ignored for coverage */
-
-
-    /**
-     * Constructor
-     */
-    public Instruction(long where, int opc, Object value, boolean flagCondInverted) {
-        this.where = where;
-        this.opc = opc;
-        this.value = value;
-        this.flagCondInverted = flagCondInverted;
-    }
-
-    /**
-     * Constructor
-     */
-    public Instruction(boolean flagNoCovered, long where, int opc, Object value) {
-        this.where = where;
-        this.opc = opc;
-        this.value = value;
-        this.flagNoCovered = flagNoCovered;
-    }
-
-    /**
-     * Constructor
-     */
-    public Instruction(long where, int opc, boolean flagNoCovered) {
-        this.where = where;
-        this.opc = opc;
-        this.flagNoCovered = flagNoCovered;
-    }
-//end JCOV
-
-    /**
-     * Constructor
-     */
-    public Instruction(long where, int opc, Object value) {
-        this.where = where;
-        this.opc = opc;
-        this.value = value;
-    }
-
-    /**
-     * When deciding between a lookupswitch and a tableswitch, this
-     * value is used in determining how much size increase is
-     * acceptable.
-     */
-    public static final double SWITCHRATIO;
-
-    static {
-        // Set SWITCHRATIO from the property javac.switchratio
-        // if it exists and is reasonable.  Otherwise, set
-        // SWITCHRATIO to 1.5, meaning that we will accept a 1.5x
-        // blowup (for the instruction) to use a tableswitch instead
-        // of a lookupswitch.
-        double ratio = 1.5;
-        String valStr = System.getProperty("javac.switchratio");
-        if (valStr != null) {
-            try {
-                double temp = Double.valueOf(valStr).doubleValue();
-                if (!(Double.isNaN(temp) || temp < 0.0)) {
-                    ratio = temp;
-                }
-            } catch (NumberFormatException ee) {}
-        }
-        SWITCHRATIO = ratio;
-    }
-
-    /**
-     * Accessor
-     */
-    public int getOpcode() {
-        return pc;
-     }
-
-    public Object getValue() {
-        return value;
-     }
-
-    public void setValue(Object value) {
-        this.value = value;
-     }
-
-
-    /**
-     * Optimize
-     */
-    void optimize(Environment env) {
-        switch (opc) {
-          case opc_istore: case opc_lstore: case opc_fstore:
-          case opc_dstore: case opc_astore:
-            // Don't keep the LocalVariable info around, unless we
-            // are actually going to generate a local variable table.
-            if ((value instanceof LocalVariable) && !env.debug_vars()) {
-                value = ((LocalVariable)value).slot;
-            }
-            break;
-
-          case opc_goto: {
-            Label lbl = (Label)value;
-            value = lbl = lbl.getDestination();
-            if (lbl == next) {
-                // goto to the next instruction, obsolete
-                opc = opc_dead;
-                break;
-            }
-
-            // We optimize
-            //
-            //          goto Tag
-            //          ...
-            //    Tag:
-            //          return
-            //
-            // except when we're generating debuggable code.  When
-            // we're generating debuggable code, we leave it alone,
-            // in order to provide better stepping behavior.  Consider
-            // a method the end of which looks like this:
-            //
-            //          ...
-            //          break;
-            //      }   // end of loop
-            //  }   // end of method
-            //
-            // If we optimize the goto away, we'll be left with a
-            // single instruction (return) and the need to ascribe that
-            // instruction to two source lines (the break statement and
-            // the method's right curly).  Can't get there from here.
-            // Depending on which line-number ascription we choose, the
-            // stepping user will step directly from the break statement
-            // back into the caller of the method (case 1) or from the
-            // statement that precedes the break statement to the method's
-            // right curly (case 2).  Similarly, he'll be able to set a
-            // breakpoint on the break statement (case 1) or the method's
-            // right curly (case 2), but not on both.  Neither case 1 nor
-            // case 2 is desirable.  .We want him to see both the break
-            // statement and the method's right curly when stepping,
-            // and we want him to be able to set a breakpoint on either or
-            // both.  So we suppress the optimization when generating
-            // debuggable code.
-            // (Above notes from brucek@eng in JDK1.0.2, copied here
-            //  by kelly.ohair@eng for JDK1.1)
-            //
-            // With the changes to allow -O and -g at the same time,
-            // I've changed the condition to be whether optimization is
-            // on instead of the debugging flag being off.
-            //     - david.stoutamire@eng for 1.2
-
-            if (lbl.next != null && env.opt()) {
-                switch (lbl.next.opc) {
-                  case opc_return:  case opc_ireturn: case opc_lreturn:
-                  case opc_freturn: case opc_dreturn: case opc_areturn:
-                    // goto to return
-                    opc = lbl.next.opc;
-                    value = lbl.next.value;
-                    break;
-                }
-            }
-            break;
-          }
-
-          case opc_ifeq:   case opc_ifne:   case opc_ifgt:
-          case opc_ifge:   case opc_iflt:   case opc_ifle:
-          case opc_ifnull: case opc_ifnonnull:
-            value = ((Label)value).getDestination();
-            if (value == next) {
-                // branch to next instruction, obsolete
-                opc = opc_pop;
-                break;
-            }
-            if ((next.opc == opc_goto) && (value == next.next)) {
-                // Conditional branch over goto, invert
-                // Note that you can't invert all conditions, condition
-                // results for float/double compares are not invertable.
-                switch (opc) {
-                  case opc_ifeq:      opc = opc_ifne; break;
-                  case opc_ifne:      opc = opc_ifeq; break;
-                  case opc_iflt:      opc = opc_ifge; break;
-                  case opc_ifle:      opc = opc_ifgt; break;
-                  case opc_ifgt:      opc = opc_ifle; break;
-                  case opc_ifge:      opc = opc_iflt; break;
-                  case opc_ifnull:    opc = opc_ifnonnull; break;
-                  case opc_ifnonnull: opc = opc_ifnull; break;
-                }
-//JCOV
-                flagCondInverted = !flagCondInverted;
-//end JCOV
-                value = next.value;
-                next.opc = opc_dead;
-            }
-            break;
-
-          case opc_if_acmpeq:   case opc_if_acmpne:
-          case opc_if_icmpeq:   case opc_if_icmpne:
-          case opc_if_icmpgt:   case opc_if_icmpge:
-          case opc_if_icmplt:   case opc_if_icmple:
-            value = ((Label)value).getDestination();
-            if (value == next) {
-                // branch to next instruction, obsolete
-                opc = opc_pop2;
-                break;
-            }
-            if ((next.opc == opc_goto) && (value == next.next)) {
-                // Conditional branch over goto, invert
-                switch (opc) {
-                  case opc_if_acmpeq: opc = opc_if_acmpne; break;
-                  case opc_if_acmpne: opc = opc_if_acmpeq; break;
-                  case opc_if_icmpeq: opc = opc_if_icmpne; break;
-                  case opc_if_icmpne: opc = opc_if_icmpeq; break;
-                  case opc_if_icmpgt: opc = opc_if_icmple; break;
-                  case opc_if_icmpge: opc = opc_if_icmplt; break;
-                  case opc_if_icmplt: opc = opc_if_icmpge; break;
-                  case opc_if_icmple: opc = opc_if_icmpgt; break;
-                }
-//JCOV
-                flagCondInverted = !flagCondInverted;
-//end JCOV
-                value = next.value;
-                next.opc = opc_dead;
-            }
-            break;
-
-          case opc_tableswitch:
-          case opc_lookupswitch: {
-            SwitchData sw = (SwitchData)value;
-            sw.defaultLabel = sw.defaultLabel.getDestination();
-            for (Enumeration<Integer> e = sw.tab.keys() ; e.hasMoreElements() ; ) {
-                Integer k = e.nextElement();
-                Label lbl = sw.tab.get(k);
-                sw.tab.put(k, lbl.getDestination());
-            }
-
-            // Compute the approximate sizes of a tableswitch and a
-            // lookupswitch.  Decide which one we want to generate.
-
-            long range = (long)sw.maxValue - (long)sw.minValue + 1;
-            long entries = sw.tab.size();
-
-            long tableSize = 4 + range;
-            long lookupSize = 3 + 2 * entries;
-
-            if (tableSize <= lookupSize * SWITCHRATIO) {
-                opc = opc_tableswitch;
-            } else {
-                opc = opc_lookupswitch;
-            }
-            break;
-          }
-
-        }
-    }
-
-    /**
-     * Collect constants into the constant table
-     */
-    void collect(ConstantPool tab) {
-        switch (opc) {
-          case opc_istore:      case opc_lstore:        case opc_fstore:
-          case opc_dstore:      case opc_astore:
-            if (value instanceof LocalVariable) {
-                MemberDefinition field = ((LocalVariable)value).field;
-                tab.put(field.getName().toString());
-                tab.put(field.getType().getTypeSignature());
-            }
-            return;
-
-          case opc_new:                 case opc_putfield:
-          case opc_putstatic:           case opc_getfield:
-          case opc_getstatic:           case opc_invokevirtual:
-          case opc_invokespecial:       case opc_invokestatic:
-          case opc_invokeinterface:     case opc_instanceof:
-          case opc_checkcast:
-            tab.put(value);
-            return;
-
-          case opc_anewarray:
-            tab.put(value);
-            return;
-
-          case opc_multianewarray:
-            tab.put(((ArrayData)value).type);
-            return;
-
-          case opc_ldc:
-          case opc_ldc_w:
-            if (value instanceof Integer) {
-                int v = ((Integer)value).intValue();
-                if ((v >= -1) && (v <= 5)) {
-                    opc = opc_iconst_0 + v;
-                    return;
-                } else if ((v >= -(1 << 7)) && (v < (1 << 7))) {
-                    opc = opc_bipush;
-                    return;
-                } else if ((v >= -(1 << 15)) && (v < (1 << 15))) {
-                    opc = opc_sipush;
-                    return;
-                }
-            } else if (value instanceof Float) {
-                float v = ((Float)value).floatValue();
-                if (v == 0) {
-                    if (Float.floatToIntBits(v) == 0) {
-                        opc = opc_fconst_0;
-                        return;
-                    }
-                } else if (v == 1) {
-                    opc = opc_fconst_1;
-                    return;
-                } else if (v == 2) {
-                    opc = opc_fconst_2;
-                    return;
-                }
-            }
-            tab.put(value);
-            return;
-
-          case opc_ldc2_w:
-            if (value instanceof Long) {
-                long v = ((Long)value).longValue();
-                if (v == 0) {
-                    opc = opc_lconst_0;
-                    return;
-                } else if (v == 1) {
-                    opc = opc_lconst_1;
-                    return;
-                }
-            } else if (value instanceof Double) {
-                double v = ((Double)value).doubleValue();
-                if (v == 0) {
-                    if (Double.doubleToLongBits(v) == 0) {
-                        opc = opc_dconst_0;
-                        return;
-                    }
-                } else if (v == 1) {
-                    opc = opc_dconst_1;
-                    return;
-                }
-            }
-            tab.put(value);
-            return;
-
-          case opc_try:
-            for (Enumeration<CatchData> e = ((TryData)value).catches.elements() ; e.hasMoreElements() ;) {
-                CatchData cd = e.nextElement();
-                if (cd.getType() != null) {
-                    tab.put(cd.getType());
-                }
-            }
-            return;
-
-          case opc_nop:
-            if ((value != null) && (value instanceof ClassDeclaration))
-                tab.put(value);
-                return;
-        }
-    }
-
-    /**
-     * Balance the stack
-     */
-    int balance() {
-        switch (opc) {
-          case opc_dead:        case opc_label:         case opc_iinc:
-          case opc_arraylength: case opc_laload:        case opc_daload:
-          case opc_nop:         case opc_ineg:          case opc_fneg:
-          case opc_lneg:        case opc_dneg:          case opc_i2f:
-          case opc_f2i:         case opc_l2d:           case opc_d2l:
-          case opc_i2b:         case opc_i2c:           case opc_i2s:
-          case opc_jsr:         case opc_goto:          case opc_jsr_w:
-          case opc_goto_w:      case opc_return:        case opc_ret:
-          case opc_instanceof:  case opc_checkcast:     case opc_newarray:
-          case opc_anewarray:   case opc_try:           case opc_swap:
-            return 0;
-
-          case opc_ldc:         case opc_ldc_w:         case opc_bipush:
-          case opc_sipush:      case opc_aconst_null:   case opc_iconst_m1:
-          case opc_iconst_0:    case opc_iconst_1:      case opc_iconst_2:
-          case opc_iconst_3:    case opc_iconst_4:      case opc_iconst_5:
-          case opc_fconst_0:    case opc_fconst_1:      case opc_fconst_2:
-          case opc_iload:       case opc_fload:         case opc_aload:
-          case opc_dup:         case opc_dup_x1:        case opc_dup_x2:
-          case opc_i2l:         case opc_i2d:           case opc_f2l:
-          case opc_f2d:         case opc_new:
-            return 1;
-
-          case opc_lload:       case opc_dload:         case opc_dup2:
-          case opc_dup2_x1:     case opc_dup2_x2:       case opc_ldc2_w:
-          case opc_lconst_0:    case opc_lconst_1:      case opc_dconst_0:
-          case opc_dconst_1:
-            return 2;
-
-          case opc_istore:      case opc_fstore:        case opc_astore:
-          case opc_iaload:      case opc_faload:        case opc_aaload:
-          case opc_baload:      case opc_caload:        case opc_saload:
-          case opc_pop:         case opc_iadd:          case opc_fadd:
-          case opc_isub:        case opc_fsub:          case opc_imul:
-          case opc_fmul:        case opc_idiv:          case opc_fdiv:
-          case opc_irem:        case opc_frem:          case opc_ishl:
-          case opc_ishr:        case opc_iushr:         case opc_lshl:
-          case opc_lshr:        case opc_lushr:         case opc_iand:
-          case opc_ior:         case opc_ixor:          case opc_l2i:
-          case opc_l2f:         case opc_d2i:           case opc_d2f:
-          case opc_ifeq:        case opc_ifne:          case opc_iflt:
-          case opc_ifle:        case opc_ifgt:          case opc_ifge:
-          case opc_ifnull:      case opc_ifnonnull:     case opc_fcmpl:
-          case opc_fcmpg:       case opc_ireturn:       case opc_freturn:
-          case opc_areturn:     case opc_tableswitch:   case opc_lookupswitch:
-          case opc_athrow:      case opc_monitorenter:  case opc_monitorexit:
-            return -1;
-
-          case opc_lstore:      case opc_dstore:        case opc_pop2:
-          case opc_ladd:        case opc_dadd:          case opc_lsub:
-          case opc_dsub:        case opc_lmul:          case opc_dmul:
-          case opc_ldiv:        case opc_ddiv:          case opc_lrem:
-          case opc_drem:        case opc_land:          case opc_lor:
-          case opc_lxor:        case opc_if_acmpeq:     case opc_if_acmpne:
-          case opc_if_icmpeq:   case opc_if_icmpne:     case opc_if_icmplt:
-          case opc_if_icmple:   case opc_if_icmpgt:     case opc_if_icmpge:
-          case opc_lreturn:     case opc_dreturn:
-            return -2;
-
-          case opc_iastore:     case opc_fastore:       case opc_aastore:
-          case opc_bastore:     case opc_castore:       case opc_sastore:
-          case opc_lcmp:        case opc_dcmpl:         case opc_dcmpg:
-            return -3;
-
-          case opc_lastore:     case opc_dastore:
-            return -4;
-
-          case opc_multianewarray:
-            return 1 - ((ArrayData)value).nargs;
-
-          case opc_getfield:
-            return ((MemberDefinition)value).getType().stackSize() - 1;
-
-          case opc_putfield:
-            return -1 - ((MemberDefinition)value).getType().stackSize();
-
-          case opc_getstatic:
-            return ((MemberDefinition)value).getType().stackSize();
-
-          case opc_putstatic:
-            return -((MemberDefinition)value).getType().stackSize();
-
-          case opc_invokevirtual:
-          case opc_invokespecial:
-          case opc_invokeinterface:
-            return ((MemberDefinition)value).getType().getReturnType().stackSize() -
-                   (((MemberDefinition)value).getType().stackSize() + 1);
-
-          case opc_invokestatic:
-            return ((MemberDefinition)value).getType().getReturnType().stackSize() -
-                   (((MemberDefinition)value).getType().stackSize());
-        }
-        throw new CompilerError("invalid opcode: " + toString());
-    }
-
-    /**
-     * Return the size of the instruction
-     */
-    int size(ConstantPool tab) {
-        switch (opc) {
-          case opc_try:         case opc_label:         case opc_dead:
-            return 0;
-
-          case opc_bipush:      case opc_newarray:
-            return 2;
-
-          case opc_sipush:      case opc_goto:          case opc_jsr:
-          case opc_ifeq:        case opc_ifne:          case opc_ifgt:
-          case opc_ifge:        case opc_iflt:          case opc_ifle:
-          case opc_ifnull:      case opc_ifnonnull:     case opc_if_acmpeq:
-          case opc_if_acmpne:   case opc_if_icmpeq:     case opc_if_icmpne:
-          case opc_if_icmpgt:   case opc_if_icmpge:     case opc_if_icmplt:
-          case opc_if_icmple:
-            return 3;
-
-          case opc_ldc:
-          case opc_ldc_w:
-            if (tab.index(value) < 256) {
-                opc = opc_ldc;
-                return 2;
-            } else {
-                opc = opc_ldc_w;
-                return 3;
-            }
-
-          case opc_iload:       case opc_lload:         case opc_fload:
-          case opc_dload:       case opc_aload: {
-            int v = ((Number)value).intValue();
-            if (v < 4) {
-                if (v < 0) {
-                    throw new CompilerError("invalid slot: " + toString()
-                        + "\nThis error possibly resulted from poorly constructed class paths.");
-                }
-                opc = opc_iload_0 + (opc - opc_iload) * 4 + v;
-                return 1;
-            } else if (v <= 255) {
-                return 2;
-            } else {
-                opc += 256;     // indicate wide variant
-                return 4;
-            }
-          }
-
-           case opc_iinc: {
-               int register = ((int[])value)[0];
-               int increment = ((int[])value)[1];
-               if (register < 0) {
-                   throw new CompilerError("invalid slot: " + toString());
-               }
-               if (register <= 255 && (((byte)increment) == increment)) {
-                   return 3;
-               } else {
-                   opc += 256;          // indicate wide variant
-                   return 6;
-               }
-           }
-
-          case opc_istore:      case opc_lstore:        case opc_fstore:
-          case opc_dstore:      case opc_astore: {
-            int v = (value instanceof Number) ?
-                ((Number)value).intValue() : ((LocalVariable)value).slot;
-            if (v < 4) {
-                if (v < 0) {
-                    throw new CompilerError("invalid slot: " + toString());
-                }
-                opc = opc_istore_0 + (opc - opc_istore) * 4 + v;
-                return 1;
-            } else if (v <= 255) {
-                return 2;
-            } else {
-                opc += 256;     // indicate wide variant
-                return 4;
-            }
-          }
-
-          case opc_ret: {
-              int v = ((Number)value).intValue();
-              if (v <= 255) {
-                  if (v < 0) {
-                      throw new CompilerError("invalid slot: " + toString());
-                  }
-                  return 2;
-              } else {
-                  opc += 256;   // indicate wide variant
-                  return 4;
-              }
-          }
-
-          case opc_ldc2_w:              case opc_new:
-          case opc_putstatic:           case opc_getstatic:
-          case opc_putfield:            case opc_getfield:
-          case opc_invokevirtual:       case opc_invokespecial:
-          case opc_invokestatic:        case opc_instanceof:
-          case opc_checkcast:           case opc_anewarray:
-            return 3;
-
-          case opc_multianewarray:
-            return 4;
-
-          case opc_invokeinterface:
-          case opc_goto_w:
-          case opc_jsr_w:
-            return 5;
-
-          case opc_tableswitch: {
-            SwitchData sw = (SwitchData)value;
-            int n = 1;
-            for(; ((pc + n) % 4) != 0 ; n++);
-            return n + 16 + (sw.maxValue - sw.minValue) * 4;
-          }
-
-          case opc_lookupswitch: {
-            SwitchData sw = (SwitchData)value;
-            int n = 1;
-            for(; ((pc + n) % 4) != 0 ; n++);
-            return n + 8 + sw.tab.size() * 8;
-          }
-
-          case opc_nop:
-            if ((value != null) && !(value instanceof Integer))
-                return 2;
-            else
-                return 1;
-        }
-
-        // most opcodes are only 1 byte long
-        return 1;
-    }
-
-    /**
-     * Generate code
-     */
-    @SuppressWarnings("fallthrough")
-    void write(DataOutputStream out, ConstantPool tab) throws IOException {
-        switch (opc) {
-          case opc_try:         case opc_label:         case opc_dead:
-            break;
-
-          case opc_bipush:      case opc_newarray:
-          case opc_iload:       case opc_lload:         case opc_fload:
-          case opc_dload:       case opc_aload:         case opc_ret:
-            out.writeByte(opc);
-            out.writeByte(((Number)value).intValue());
-            break;
-
-          case opc_iload + 256:         case opc_lload + 256:
-          case opc_fload + 256:         case opc_dload + 256:
-          case opc_aload + 256:         case opc_ret   + 256:
-            out.writeByte(opc_wide);
-            out.writeByte(opc - 256);
-            out.writeShort(((Number)value).intValue());
-            break;
-
-          case opc_istore:      case opc_lstore:        case opc_fstore:
-          case opc_dstore:      case opc_astore:
-            out.writeByte(opc);
-            out.writeByte((value instanceof Number) ?
-                          ((Number)value).intValue() : ((LocalVariable)value).slot);
-            break;
-
-          case opc_istore + 256:        case opc_lstore + 256:
-          case opc_fstore + 256:        case opc_dstore + 256:
-          case opc_astore + 256:
-            out.writeByte(opc_wide);
-            out.writeByte(opc - 256);
-            out.writeShort((value instanceof Number) ?
-                      ((Number)value).intValue() : ((LocalVariable)value).slot);
-            break;
-
-          case opc_sipush:
-            out.writeByte(opc);
-            out.writeShort(((Number)value).intValue());
-            break;
-
-          case opc_ldc:
-            out.writeByte(opc);
-            out.writeByte(tab.index(value));
-            break;
-
-          case opc_ldc_w:               case opc_ldc2_w:
-          case opc_new:                 case opc_putstatic:
-          case opc_getstatic:           case opc_putfield:
-          case opc_getfield:            case opc_invokevirtual:
-          case opc_invokespecial:       case opc_invokestatic:
-          case opc_instanceof:          case opc_checkcast:
-            out.writeByte(opc);
-            out.writeShort(tab.index(value));
-            break;
-
-          case opc_iinc:
-            out.writeByte(opc);
-            out.writeByte(((int[])value)[0]); // register
-            out.writeByte(((int[])value)[1]); // increment
-            break;
-
-          case opc_iinc + 256:
-            out.writeByte(opc_wide);
-            out.writeByte(opc - 256);
-            out.writeShort(((int[])value)[0]); // register
-            out.writeShort(((int[])value)[1]); // increment
-            break;
-
-          case opc_anewarray:
-            out.writeByte(opc);
-            out.writeShort(tab.index(value));
-            break;
-
-          case opc_multianewarray:
-            out.writeByte(opc);
-            out.writeShort(tab.index(((ArrayData)value).type));
-            out.writeByte(((ArrayData)value).nargs);
-            break;
-
-          case opc_invokeinterface:
-            out.writeByte(opc);
-            out.writeShort(tab.index(value));
-            out.writeByte(((MemberDefinition)value).getType().stackSize() + 1);
-            out.writeByte(0);
-            break;
-
-          case opc_goto:        case opc_jsr:           case opc_ifeq:
-          case opc_ifne:        case opc_ifgt:          case opc_ifge:
-          case opc_iflt:        case opc_ifle:          case opc_ifnull:
-          case opc_ifnonnull:   case opc_if_acmpeq:     case opc_if_acmpne:
-          case opc_if_icmpeq:   case opc_if_icmpne:     case opc_if_icmpgt:
-          case opc_if_icmpge:   case opc_if_icmplt:     case opc_if_icmple:
-            out.writeByte(opc);
-            out.writeShort(((Instruction)value).pc - pc);
-            break;
-
-          case opc_goto_w:
-          case opc_jsr_w:
-            out.writeByte(opc);
-            out.writeLong(((Instruction)value).pc - pc);
-            break;
-
-          case opc_tableswitch: {
-            SwitchData sw = (SwitchData)value;
-            out.writeByte(opc);
-            for(int n = 1 ; ((pc + n) % 4) != 0 ; n++) {
-                out.writeByte(0);
-            }
-            out.writeInt(sw.defaultLabel.pc - pc);
-            out.writeInt(sw.minValue);
-            out.writeInt(sw.maxValue);
-            for (int n = sw.minValue ; n <= sw.maxValue ; n++) {
-                Label lbl = sw.get(n);
-                int target_pc = (lbl != null) ? lbl.pc : sw.defaultLabel.pc;
-                out.writeInt(target_pc - pc);
-            }
-            break;
-          }
-
-          case opc_lookupswitch: {
-            SwitchData sw = (SwitchData)value;
-            out.writeByte(opc);
-            int n = pc + 1;
-            for(; (n % 4) != 0 ; n++) {
-                out.writeByte(0);
-            }
-            out.writeInt(sw.defaultLabel.pc - pc);
-            out.writeInt(sw.tab.size());
-            for (Enumeration<Integer> e = sw.sortedKeys(); e.hasMoreElements() ; ) {
-                Integer v = e.nextElement();
-                out.writeInt(v.intValue());
-                out.writeInt(sw.get(v).pc - pc);
-            }
-            break;
-          }
-
-          case opc_nop:
-            if (value != null) {
-                if (value instanceof Integer)
-                    out.writeByte(((Integer)value).intValue());
-                else
-                    out.writeShort(tab.index(value));
-                return;
-            }
-            // fall through
-
-          default:
-            out.writeByte(opc);
-            break;
-        }
-    }
-
-    /**
-     * toString
-     */
-    public String toString() {
-        String prefix = (where >> WHEREOFFSETBITS) + ":\t";
-        switch (opc) {
-          case opc_try:
-            return prefix + "try " + ((TryData)value).getEndLabel().hashCode();
-
-          case opc_dead:
-            return prefix + "dead";
-
-          case opc_iinc: {
-            int register = ((int[])value)[0];
-            int increment = ((int[])value)[1];
-            return prefix + opcNames[opc] + " " + register + ", " + increment;
-          }
-
-          default:
-            if (value != null) {
-                if (value instanceof Label) {
-                    return prefix + opcNames[opc] + " " + value.toString();
-                } else if (value instanceof Instruction) {
-                    return prefix + opcNames[opc] + " " + value.hashCode();
-                } else if (value instanceof String) {
-                    return prefix + opcNames[opc] + " \"" + value + "\"";
-                } else {
-                    return prefix + opcNames[opc] + " " + value;
-                }
-            } else {
-              return prefix + opcNames[opc];
-            }
-        }
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/Label.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.MemberDefinition;
-import java.io.OutputStream;
-
-/**
- * A label instruction. This is a 0 size instruction.
- * It is the only valid target of a branch instruction.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public final
-class Label extends Instruction {
-    static int labelCount = 0;
-    int ID;
-    int depth;
-    MemberDefinition locals[];
-
-    /**
-     * Constructor
-     */
-    public Label() {
-        super(0, opc_label, null);
-        this.ID = ++labelCount;
-    }
-
-    /**
-     * Get the final destination, eliminate jumps gotos, and jumps to
-     * labels that are immediately folowed by another label. The depth
-     * field is used to leave bread crumbs to avoid infinite loops.
-     */
-    Label getDestination() {
-        Label lbl = this;
-        if ((next != null) && (next != this) && (depth == 0)) {
-            depth = 1;
-
-            switch (next.opc) {
-              case opc_label:
-                lbl = ((Label)next).getDestination();
-                break;
-
-              case opc_goto:
-                lbl = ((Label)next.value).getDestination();
-                break;
-
-              case opc_ldc:
-              case opc_ldc_w:
-                if (next.value instanceof Integer) {
-                    Instruction inst = next.next;
-                    if (inst.opc == opc_label) {
-                        inst = ((Label)inst).getDestination().next;
-                    }
-
-                    if (inst.opc == opc_ifeq) {
-                        if (((Integer)next.value).intValue() == 0) {
-                            lbl = (Label)inst.value;
-                        } else {
-                            lbl = new Label();
-                            lbl.next = inst.next;
-                            inst.next = lbl;
-                        }
-                        lbl = lbl.getDestination();
-                        break;
-                    }
-                    if (inst.opc == opc_ifne) {
-                        if (((Integer)next.value).intValue() == 0) {
-                            lbl = new Label();
-                            lbl.next = inst.next;
-                            inst.next = lbl;
-                        } else {
-                            lbl = (Label)inst.value;
-                        }
-                        lbl = lbl.getDestination();
-                        break;
-                    }
-                }
-                break;
-            }
-            depth = 0;
-        }
-        return lbl;
-    }
-
-    public String toString() {
-        String s = "$" + ID + ":";
-        if (value != null)
-            s = s + " stack=" + value;
-        return s;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/LocalVariable.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-
-/**
- * This class is used to assemble the local variables in the local
- * variable table.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- *
- * @author Arthur van Hoff
- */
-public final
-class LocalVariable {
-    MemberDefinition field;
-    int slot;
-    int from;
-    int to;
-
-    public LocalVariable(MemberDefinition field, int slot) {
-        if (field == null) {
-            new Exception().printStackTrace();
-        }
-        this.field = field;
-        this.slot = slot;
-        to = -1;
-    }
-
-    LocalVariable(MemberDefinition field, int slot, int from, int to) {
-        this.field = field;
-        this.slot = slot;
-        this.from = from;
-        this.to = to;
-    }
-
-    public String toString() {
-        return field + "/" + slot;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/LocalVariableTable.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * This class is used to assemble the local variable table.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- *
- * @author Arthur van Hoff
- */
-final
-class LocalVariableTable {
-    LocalVariable locals[] = new LocalVariable[8];
-    int len;
-
-    /**
-     * Define a new local variable. Merge entries where possible.
-     */
-    void define(MemberDefinition field, int slot, int from, int to) {
-        if (from >= to) {
-            return;
-        }
-        for (int i = 0 ; i < len ; i++) {
-            if ((locals[i].field == field) && (locals[i].slot == slot) &&
-                (from <= locals[i].to) && (to >= locals[i].from)) {
-                locals[i].from = Math.min(locals[i].from, from);
-                locals[i].to = Math.max(locals[i].to, to);
-                return;
-            }
-        }
-        if (len == locals.length) {
-            LocalVariable newlocals[] = new LocalVariable[len * 2];
-            System.arraycopy(locals, 0, newlocals, 0, len);
-            locals = newlocals;
-        }
-        locals[len++] = new LocalVariable(field, slot, from, to);
-    }
-
-    /**
-     * Trim overlapping local ranges.  Java forbids shadowing of
-     * locals in nested scopes, but non-nested scopes may still declare
-     * locals with the same name.  Because local variable ranges are
-     * computed using flow analysis as part of assembly, it isn't
-     * possible to simply make sure variable ranges end where the
-     * enclosing lexical scope ends.  This method makes sure that
-     * variables with the same name don't overlap, giving priority to
-     * fields with higher slot numbers that should have appeared later
-     * in the source.
-     */
-    private void trim_ranges() {
-        for (int i=0; i<len; i++) {
-            for (int j=i+1; j<len; j++) {
-                if ((locals[i].field.getName()==locals[j].field.getName())
-                        && (locals[i].from <= locals[j].to)
-                        && (locals[i].to >= locals[j].from)) {
-                    // At this point we know that both ranges are
-                    // the same name and there is also overlap or they abut
-                    if (locals[i].slot < locals[j].slot) {
-                        if (locals[i].from < locals[j].from) {
-                          locals[i].to = Math.min(locals[i].to, locals[j].from);
-                        } else {
-                          // We've detected two local variables with the
-                          // same name, and the one with the greater slot
-                          // number starts before the other.  This order
-                          // reversal may happen with locals with the same
-                          // name declared in both a try body and an
-                          // associated catch clause.  This is rare, and
-                          // we give up.
-                        }
-                    } else if (locals[i].slot > locals[j].slot) {
-                        if (locals[i].from > locals[j].from) {
-                          locals[j].to = Math.min(locals[j].to, locals[i].from);
-                        } else {
-                          // Same situation as above; just give up.
-                        }
-                    } else {
-                        // This case can happen if there are two variables
-                        // with the same name and slot numbers, and ranges
-                        // that abut.  AFAIK the only way this can occur
-                        // is with multiple static initializers.  Punt.
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Write out the data.
-     */
-    void write(Environment env, DataOutputStream out, ConstantPool tab) throws IOException {
-        trim_ranges();
-        out.writeShort(len);
-        for (int i = 0 ; i < len ; i++) {
-            //System.out.println("pc=" + locals[i].from + ", len=" + (locals[i].to - locals[i].from) + ", nm=" + locals[i].field.getName() + ", slot=" + locals[i].slot);
-            out.writeShort(locals[i].from);
-            out.writeShort(locals[i].to - locals[i].from);
-            out.writeShort(tab.index(locals[i].field.getName().toString()));
-            out.writeShort(tab.index(locals[i].field.getType().getTypeSignature()));
-            out.writeShort(locals[i].slot);
-        }
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/NameAndTypeConstantData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * This is a name and type constant pool data item
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-final
-class NameAndTypeConstantData extends ConstantPoolData {
-    String name;
-    String type;
-
-    /**
-     * Constructor
-     */
-    NameAndTypeConstantData(ConstantPool tab, NameAndTypeData nt) {
-        name = nt.field.getName().toString();
-        type = nt.field.getType().getTypeSignature();
-        tab.put(name);
-        tab.put(type);
-    }
-
-    /**
-     * Write the constant to the output stream
-     */
-    void write(Environment env, DataOutputStream out, ConstantPool tab) throws IOException {
-        out.writeByte(CONSTANT_NAMEANDTYPE);
-        out.writeShort(tab.index(name));
-        out.writeShort(tab.index(type));
-    }
-
-    /**
-     * Return the order of the constant
-     */
-    int order() {
-        return 3;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/NameAndTypeData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-
-/**
- * An object to represent a name and type constant pool data item.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-final
-class NameAndTypeData {
-    MemberDefinition field;
-
-    /**
-     * Constructor
-     */
-    NameAndTypeData(MemberDefinition field) {
-        this.field = field;
-    }
-
-    /**
-     * Hashcode
-     */
-    public int hashCode() {
-        return field.getName().hashCode() * field.getType().hashCode();
-    }
-
-    /**
-     * Equality
-     */
-    public boolean equals(Object obj) {
-        if ((obj != null) && (obj instanceof NameAndTypeData)) {
-            NameAndTypeData nt = (NameAndTypeData)obj;
-            return field.getName().equals(nt.field.getName()) &&
-                field.getType().equals(nt.field.getType());
-        }
-        return false;
-    }
-
-    /**
-     * Convert to string
-     */
-    public String toString() {
-        return "%%" + field.toString() + "%%";
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/NumberConstantData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * A numeric constant pool item. Can either be integer, float, long or double.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-final
-class NumberConstantData extends ConstantPoolData {
-    Number num;
-
-    /**
-     * Constructor
-     */
-    NumberConstantData(ConstantPool tab, Number num) {
-        this.num = num;
-    }
-
-    /**
-     * Write the constant to the output stream
-     */
-    void write(Environment env, DataOutputStream out, ConstantPool tab) throws IOException {
-        if (num instanceof Integer) {
-            out.writeByte(CONSTANT_INTEGER);
-            out.writeInt(num.intValue());
-        } else if (num instanceof Long) {
-            out.writeByte(CONSTANT_LONG);
-            out.writeLong(num.longValue());
-        } else if (num instanceof Float) {
-            out.writeByte(CONSTANT_FLOAT);
-            out.writeFloat(num.floatValue());
-        } else if (num instanceof Double) {
-            out.writeByte(CONSTANT_DOUBLE);
-            out.writeDouble(num.doubleValue());
-        }
-    }
-    /**
-     * Return the order of the constant
-     */
-    int order() {
-        return (width() == 1) ? 0 : 3;
-    }
-
-    /**
-     * Return the number of entries that it takes up in the constant pool
-     */
-    int width() {
-        return ((num instanceof Double) || (num instanceof Long)) ? 2 : 1;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/StringConstantData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * This is a string constant pool data item.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-final
-class StringConstantData extends ConstantPoolData {
-    String str;
-
-    /**
-     * Constructor
-     */
-    StringConstantData(ConstantPool tab, String str) {
-        this.str = str;
-    }
-
-    /**
-     * Write the constant to the output stream
-     */
-    void write(Environment env, DataOutputStream out, ConstantPool tab) throws IOException {
-        out.writeByte(CONSTANT_UTF8);
-        out.writeUTF(str);
-    }
-
-    /**
-     * Return the order of the constant
-     */
-    int order() {
-        return 4;
-    }
-
-    /**
-     * toString
-     */
-    public String toString() {
-        return "StringConstantData[" + str + "]=" + str.hashCode();
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/StringExpressionConstantData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import sun.tools.tree.StringExpression;
-import java.io.IOException;
-import java.io.DataOutputStream;
-
-/**
- * This is a string expression constant. This constant
- * represents an Java string constant.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-final
-class StringExpressionConstantData extends ConstantPoolData {
-    StringExpression str;
-
-    /**
-     * Constructor
-     */
-    StringExpressionConstantData(ConstantPool tab, StringExpression str) {
-        this.str = str;
-        tab.put(str.getValue());
-    }
-
-    /**
-     * Write the constant to the output stream
-     */
-    void write(Environment env, DataOutputStream out, ConstantPool tab) throws IOException {
-        out.writeByte(CONSTANT_STRING);
-        out.writeShort(tab.index(str.getValue()));
-    }
-
-    /**
-     * Return the order of the constant
-     */
-    int order() {
-        return 0;
-    }
-
-    /**
-     * toString
-     */
-    public String toString() {
-        return "StringExpressionConstantData[" + str.getValue() + "]=" + str.getValue().hashCode();
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/SwitchData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.util.Hashtable;
-import java.util.Enumeration;
-import java.util.Arrays;
-
-/**
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public final
-class SwitchData {
-    int minValue, maxValue;
-    Label defaultLabel = new Label();
-    Hashtable<Integer, Label> tab = new Hashtable<>();
-// JCOV
-    Hashtable<Integer, Long> whereCaseTab = null;
-// end JCOV
-
-    /**
-     * Get a label
-     */
-    public Label get(int n) {
-        return tab.get(n);
-    }
-
-    /**
-     * Get a label
-     */
-    public Label get(Integer n) {
-        return tab.get(n);
-    }
-
-    /**
-     * Add a label
-     */
-    public void add(int n, Label lbl) {
-        if (tab.size() == 0) {
-            minValue = n;
-            maxValue = n;
-        } else {
-            if (n < minValue) {
-                minValue = n;
-            }
-            if (n > maxValue) {
-                maxValue = n;
-            }
-        }
-        tab.put(Integer.valueOf(n), lbl);
-    }
-
-    /**
-     * Get the default label
-     */
-    public Label getDefaultLabel() {
-        return defaultLabel;
-    }
-
-    /**
-     * Return the keys of this enumaration sorted in ascending order
-     */
-    public synchronized Enumeration<Integer> sortedKeys() {
-        return new SwitchDataEnumeration(tab);
-    }
-
-// JCOV
-    public void initTableCase() {
-        whereCaseTab = new Hashtable<Integer, Long>();
-    }
-    public void addTableCase(int index, long where) {
-        if (whereCaseTab != null)
-            whereCaseTab.put(Integer.valueOf(index), Long.valueOf(where));
-    }
-    // this puts String key into Hashtable<Integer, Long>
-    @SuppressWarnings("unchecked")
-    public void addTableDefault(long where) {
-        if (whereCaseTab != null)
-            ((Hashtable)whereCaseTab).put("default", Long.valueOf(where));
-    }
-    public long whereCase(Object key) {
-        Long i = whereCaseTab.get(key);
-        return (i == null) ? 0L : i.longValue();
-    }
-    public boolean getDefault() {
-         return (whereCase("default") != 0L);
-    }
-// end JCOV
-}
-
-class SwitchDataEnumeration implements Enumeration<Integer> {
-    private Integer table[];
-    private int current_index = 0;
-
-    /**
-     * Create a new enumeration from the hashtable.  Each key in the
-     * hash table will be an Integer, with the value being a label.  The
-     * enumeration returns the keys in sorted order.
-     */
-    SwitchDataEnumeration(Hashtable<Integer, Label> tab) {
-        table = new Integer[tab.size()];
-        int i = 0;
-        for (Enumeration<Integer> e = tab.keys() ; e.hasMoreElements() ; ) {
-            table[i++] = e.nextElement();
-        }
-        Arrays.sort(table);
-        current_index = 0;
-    }
-
-    /**
-     * Are there more keys to return?
-     */
-    public boolean hasMoreElements() {
-        return current_index < table.length;
-    }
-
-    /**
-     * Return the next key.
-     */
-    public Integer nextElement() {
-        return table[current_index++];
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/asm/TryData.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.asm;
-
-import sun.tools.java.*;
-import java.util.Vector;
-
-/**
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public final
-class TryData {
-    Vector<CatchData> catches = new Vector<>();
-    Label endLabel = new Label();
-
-    /**
-     * Add a label
-     */
-    public CatchData add(Object type) {
-        CatchData cd = new CatchData(type);
-        catches.addElement(cd);
-        return cd;
-    }
-
-    /**
-     * Get a label
-     */
-    public CatchData getCatch(int n) {
-        return catches.elementAt(n);
-    }
-
-    /**
-     * Get the default label
-     */
-    public Label getEndLabel() {
-        return endLabel;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/java/AmbiguousClass.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.java;
-
-/**
- * This exception is thrown when an unqualified class name
- * is used that can be resolved in more than one way.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-
-@SuppressWarnings("serial") // JDK implementation class
-public
-class AmbiguousClass extends ClassNotFound {
-    /**
-     * The class that was not found
-     */
-    public Identifier name1;
-    public Identifier name2;
-
-    /**
-     * Constructor
-     */
-    public AmbiguousClass(Identifier name1, Identifier name2) {
-        super(name1.getName());
-        this.name1 = name1;
-        this.name2 = name2;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/java/AmbiguousMember.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.java;
-
-import java.util.Enumeration;
-
-/**
- * This exception is thrown when a field reference is
- * ambiguous.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-@SuppressWarnings("serial") // JDK implementation class
-public
-class AmbiguousMember extends Exception {
-    /**
-     * The field that was not found
-     */
-    public MemberDefinition field1;
-    public MemberDefinition field2;
-
-    /**
-     * Constructor
-     */
-    public AmbiguousMember(MemberDefinition field1, MemberDefinition field2) {
-        super(field1.getName() + " + " + field2.getName());
-        this.field1 = field1;
-        this.field2 = field2;
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/java/ArrayType.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.java;
-
-/**
- * This class represents an Java array type.
- * It overrides the relevant methods in class Type.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- *
- * @author      Arthur van Hoff
- */
-public final
-class ArrayType extends Type {
-    /**
-     * The type of the element.
-     */
-    Type elemType;
-
-    /**
-     * Construct an array type. Use Type.tArray to create
-     * a new array type.
-     */
-    ArrayType(String typeSig, Type elemType) {
-        super(TC_ARRAY, typeSig);
-        this.elemType = elemType;
-    }
-
-    public Type getElementType() {
-        return elemType;
-    }
-
-    public int getArrayDimension() {
-        return elemType.getArrayDimension() + 1;
-    }
-
-    public String typeString(String id, boolean abbrev, boolean ret) {
-        return getElementType().typeString(id, abbrev, ret) + "[]";
-    }
-}
--- a/src/jdk.rmic/share/classes/sun/tools/java/BinaryAttribute.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 1994, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.java;
-
-import java.io.IOException;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-
-/**
- * This class is used to represent an attribute from a binary class.
- * This class should go away once arrays are objects.
- *
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-public final
-class BinaryAttribute implements Constants {
-    Identifier name;
-    byte data[];
-    BinaryAttribute next;
-
-    /**
-     * Constructor
-     */
-    BinaryAttribute(Identifier name, byte data[], BinaryAttribute next) {
-        this.name = name;
-        this.data = data;
-        this.next = next;
-    }
-
-    /**
-     * Load a list of attributes
-     */
-    public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException {
-        BinaryAttribute atts = null;
-        int natt = in.readUnsignedShort();  // JVM 4.6 method_info.attrutes_count
-
-        for (int i = 0 ; i < natt ; i++) {
-            // id from JVM 4.7 attribute_info.attribute_name_index
-            Identifier id = cpool.getIdentifier(in.readUnsignedShort());
-            // id from JVM 4.7 attribute_info.attribute_length
-            int len = in.readInt();
-
-            if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) {
-                in.skipBytes(len);
-            } else {
-                byte data[] = new byte[len];
-                in.readFully(data);
-                atts = new BinaryAttribute(id, data, atts);
-            }
-        }
-        return atts;
-    }
-
-    // write out the Binary attributes to the given stream
-    // (note that attributes may be null)
-    static void write(BinaryAttribute attributes, DataOutputStream out,
-                      BinaryConstantPool cpool, Environment env) throws IOException {
-        // count the number of attributes
-        int attributeCount = 0;
-        for (BinaryAttribute att = attributes; att != null; att = att.next)
-            attributeCount++;
-        out.writeShort(attributeCount);
-
-        // write out each attribute
-        for (BinaryAttribute att = attributes; att != null; att = att.next) {
-            Identifier name = att.name;
-            byte data[] = att.data;
-            // write the identifier
-            out.writeShort(cpool.indexString(name.toString(), env));
-            // write the length
-            out.writeInt(data.length);
-            // write the data
-            out.write(data, 0, data.length);
-        }
-    }
-
-    /**
-     * Accessors
-     */
-
-    public Identifier getName() { return name; }
-
-    public byte[] getData() { return data; }
-
-    public BinaryAttribute getNextAttribute() { return next; }
-
-}
--- a/src/jdk.rmic/share/classes/sun/tools/java/BinaryClass.java	Wed Apr 08 15:00:39 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,542 +0,0 @@
-/*
- * Copyright (c) 1994, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.java;
-
-import java.io.IOException;
-import java.io.DataInputStream;
-import java.io.OutputStream;
-import java.io.DataOutputStream;
-import java.io.ByteArrayInputStream;
-import java.util.Hashtable;
-import java.util.Vector;
-import java.util.Enumeration;
-
-/**
- * WARNING: The contents of this source file are not part of any
- * supported API.  Code that depends on them does so at its own risk:
- * they are subject to change or removal without notice.
- */
-@SuppressWarnings("deprecation")
-public final
-class BinaryClass extends ClassDefinition implements Constants {
-    BinaryConstantPool cpool;
-    BinaryAttribute atts;
-    Vector<ClassDeclaration> dependencies;
-    private boolean haveLoadedNested = false;
-
-    /**
-     * Constructor
-     */
-    public BinaryClass(Object source, ClassDeclaration declaration, int modifiers,
-                           ClassDeclaration superClass, ClassDeclaration interfaces[],
-                           Vector<ClassDeclaration> dependencies) {
-        super(source, 0, declaration, modifiers, null, null);
-        this.dependencies = dependencies;
-        this.superClass = superClass;
-        this.interfaces = interfaces;
-    }
-
-    /**
-     * Flags used by basicCheck() to avoid duplicate calls.
-     * (Part of fix for 4105911)
-     */
-    private boolean basicCheckDone = false;
-    private boolean basicChecking = false;
-
-    /**
-     * Ready a BinaryClass for further checking.  Note that, until recently,
-     * BinaryClass relied on the default basicCheck() provided by
-     * ClassDefinition.  The definition here has been added to ensure that
-     * the information generated by collectInheritedMethods is available
-     * for BinaryClasses.
-     */
-    protected void basicCheck(Environment env) throws ClassNotFound {
-        if (tracing) env.dtEnter("BinaryClass.basicCheck: " + getName());
-
-        // We need to guard against duplicate calls to basicCheck().  They
-        // can lead to calling collectInheritedMethods() for this class
-        // from within a previous call to collectInheritedMethods() for
-        // this class.  That is not allowed.
-        // (Part of fix for 4105911)
-        if (basicChecking || basicCheckDone) {
-            if (tracing) env.dtExit("BinaryClass.basicCheck: OK " + getName());
-            return;
-        }
-
-        if (tracing) env.dtEvent("BinaryClass.basicCheck: CHECKING " + getName());
-        basicChecking = true;
-
-        super.basicCheck(env);
-
-        // Collect inheritance information.
-        if (doInheritanceChecks) {
-            collectInheritedMethods(env);
-        }
-
-        basicCheckDone = true;
-        basicChecking = false;
-        if (tracing) env.dtExit("BinaryClass.basicCheck: " + getName());
-    }
-
-    /**
-     * Load a binary class
-     */
-    public static BinaryClass load(Environment env, DataInputStream in) throws IOException {
-        return load(env, in, ~(ATT_CODE|ATT_ALLCLASSES));
-    }
-
-    public static BinaryClass load(Environment env,
-                                   DataInputStream in, int mask) throws IOException {
-        // Read the header
-        int magic = in.readInt();                    // JVM 4.1 ClassFile.magic
-        if (magic != JAVA_MAGIC) {
-            throw new ClassFormatError("wrong magic: " + magic + ", expected " + JAVA_MAGIC);
-        }
-        int minor_version = in.readUnsignedShort();  // JVM 4.1 ClassFile.minor_version
-        int version = in.readUnsignedShort();        // JVM 4.1 ClassFile.major_version
-        if (version < JAVA_MIN_SUPPORTED_VERSION) {
-            throw new ClassFormatError(
-                           sun.tools.javac.Main.getText(
-                               "javac.err.version.too.old",
-                               String.valueOf(version)));
-        } else if ((version >= JAVA_MIN_PREVIEW_MAJOR_VERSION)
-                     && (minor_version == JAVA_PREVIEW_MINOR_VERSION)) {
-            // reject all class files that have preview features enabled
-            throw new ClassFormatError(
-                           sun.tools.javac.Main.getText(
-                               "javac.err.version.preview",
-                               version+"."+minor_version));
-        } else if ((version > JAVA_MAX_SUPPORTED_VERSION)
-                     || (version == JAVA_MAX_SUPPORTED_VERSION
-                  && minor_version > JAVA_MAX_SUPPORTED_MINOR_VERSION)) {
-            throw new ClassFormatError(
-                           sun.tools.javac.Main.getText(
-                               "javac.err.version.too.recent",
-                               version+"."+minor_version));
-        }
-
-        // Read the constant pool
-        BinaryConstantPool cpool = new BinaryConstantPool(in);
-
-        // The dependencies of this class
-        Vector<ClassDeclaration> dependencies = cpool.getDependencies(env);
-
-        // Read modifiers
-        int classMod = in.readUnsignedShort() & ACCM_CLASS;  // JVM 4.1 ClassFile.access_flags
-
-        // Read the class name - from JVM 4.1 ClassFile.this_class
-        ClassDeclaration classDecl = cpool.getDeclaration(env, in.readUnsignedShort());
-
-        // Read the super class name (may be null) - from JVM 4.1 ClassFile.super_class
-        ClassDeclaration superClassDecl = cpool.getDeclaration(env, in.readUnsignedShort());
-
-        // Read the interface names - from JVM 4.1 ClassFile.interfaces_count
-        ClassDeclaration interfaces[] = new ClassDeclaration[in.readUnsignedShort()];
-        for (int i = 0 ; i < interfaces.length ; i++) {
-            // JVM 4.1 ClassFile.interfaces[]
-            interfaces[i] = cpool.getDeclaration(env, in.readUnsignedShort());
-        }
-
-        // Allocate the class
-        BinaryClass c = new BinaryClass(null, classDecl, classMod, superClassDecl,
-                                        interfaces, dependencies);
-        c.cpool = cpool;
-
-        // Add any additional dependencies
-        c.addDependency(superClassDecl);
-
-        // Read the fields
-        int nfields = in.readUnsignedShort();  // JVM 4.1 ClassFile.fields_count
-        for (int i = 0 ; i < nfields ; i++) {
-            // JVM 4.5 field_info.access_flags
-            int fieldMod = in.readUnsignedShort() & ACCM_FIELD;
-            // JVM 4.5 field_info.name_index
-            Identifier fieldName = cpool.getIdentifier(in.readUnsignedShort());
-            // JVM 4.5 field_info.descriptor_index
-            Type fieldType = cpool.getType(in.readUnsignedShort());
-            BinaryAttribute atts = BinaryAttribute.load(in, cpool, mask);
-            c.addMember(new BinaryMember(c, fieldMod, fieldType, fieldName, atts));
-        }
-
-        // Read the methods
-        int nmethods = in.readUnsignedShort();  // JVM 4.1 ClassFile.methods_count
-        for (int i = 0 ; i < nmethods ; i++) {
-            // JVM 4.6 method_info.access_flags
-            int methMod = in.readUnsignedShort() & ACCM_METHOD;
-            // JVM 4.6 method_info.name_index
-            Identifier methName = cpool.getIdentifier(in.readUnsignedShort());
-            // JVM 4.6 method_info.descriptor_index
-            Type methType = cpool.getType(in.readUnsignedShort());
-            BinaryAttribute atts = BinaryAttribute.load(in, cpool, mask);
-            c.addMember(new BinaryMember(c, methMod, methType, methName, atts));
-        }
-
-        // Read the class attributes
-        c.atts = BinaryAttribute.load(in, cpool, mask);
-
-        // See if the SourceFile is known
-        byte data[] = c.getAttribute(idSourceFile);
-        if (data != null) {
-            DataInputStream dataStream = new DataInputStream(new ByteArrayInputStream(data));
-            // JVM 4.7.2 SourceFile_attribute.sourcefile_index
-            c.source = cpool.getString(dataStream.readUnsignedShort());
-        }
-
-        // See if the Documentation is know
-        data = c.getAttribute(idDocumentation);
-        if (data != null) {
-            c.documentation = new DataInputStream(new ByteArrayInputStream(data)).readUTF();
-        }
-
-        // Was it compiled as deprecated?
-        if (c.getAttribute(idDeprecated) != null) {
-            c.modifiers |= M_DEPRECATED;
-        }
-
-        // Was it synthesized by the compiler?
-        if (c.getAttribute(idSynthetic) != null) {
-            c.modifiers |= M_SYNTHETIC;
-        }
-
-        return c;
-    }
-
-    /**
-     * Called when an environment ties a binary definition to a declaration.
-     * At this point, auxiliary definitions may be loaded.
-     */
-
-    public void loadNested(Environment env) {
-        loadNested(env, 0);
-    }
-
-    public void loadNested(Environment env, int flags) {
-        // Sanity check.
-        if (haveLoadedNested) {
-            // Duplicate calls most likely should not occur, but they do
-            // in javap.  Be tolerant of them for the time being.
-            // throw new CompilerError("multiple loadNested");
-            if (tracing) env.dtEvent("loadNested: DUPLICATE CALL SKIPPED");
-            return;
-        }
-        haveLoadedNested = true;
-        // Read class-nesting information.
-        try {
-            byte data[];
-            data = getAttribute(idInnerClasses);
-            if (data != null) {
-                initInnerClasses(env, data, flags);
-            }
-        } catch (IOException ee) {
-            // The inner classes attribute is not well-formed.
-            // It may, for example, contain no data.  Report this.
-            // We used to throw a CompilerError here (bug 4095108).
-            env.error(0, "malformed.attribute", getClassDeclaration(),
-                      idInnerClasses);
-            if (tracing)
-                env.dtEvent("loadNested: MALFORMED ATTRIBUTE (InnerClasses)");
-        }
-    }
-
-    private void initInnerClasses(Environment env,
-                                  byte data[],
-                                  int flags) throws IOException {
-        DataInputStream ds = new DataInputStream(new ByteArrayInputStream(data));
-        int nrec = ds.readUnsignedShort();  // InnerClasses_attribute.number_of_classes
-        for (int i = 0; i < nrec; i++) {
-            // For each inner class name transformation, we have a record
-            // with the following fields:
-            //
-            //    u2 inner_class_info_index;   // CONSTANT_Class_info index
-            //    u2 outer_class_info_index;   // CONSTANT_Class_info index
-            //    u2 inner_name_index;         // CONSTANT_Utf8_info index
-            //    u2 inner_class_access_flags; // access_flags bitmask
-            //
-            // The spec states that outer_class_info_index is 0 iff
-            // the inner class is not a member of its enclosing class (i.e.
-            // it is a local or anonymous class).  The spec also states
-            // that if a class is anonymous then inner_name_index should
-            // be 0.
-            //
-            // Prior to jdk1.2, javac did not implement the spec.  Instead
-            // it <em>always</em> set outer_class_info_index to the
-            // enclosing outer class and if the class was anonymous,
-            // it set inner_name_index to be the index of a CONSTANT_Utf8
-            // entry containing the null string "" (idNull).  This code is
-            // designed to handle either kind of class file.
-            //
-            // See also the compileClass() method in SourceClass.java.
-
-            // Read in the inner_class_info
-            // InnerClasses_attribute.classes.inner_class_info_index
-            int inner_index = ds.readUnsignedShort();
-            // could check for zero.
-            ClassDeclaration inner = cpool.getDeclaration(env, inner_index);
-
-            // Read in the outer_class_info.  Note that the index will be
-            // zero if the class is "not a member".
-            ClassDeclaration outer = null;
-            // InnerClasses_attribute.classes.outer_class_info_index
-            int outer_index = ds.readUnsignedShort();
-            if (outer_index != 0) {
-                outer = cpool.getDeclaration(env, outer_index);
-            }
-
-            // Read in the inner_name_index.  This may be zero.  An anonymous
-            // class will either have an inner_nm_index of zero (as the spec
-            // dictates) or it will have an inner_nm of idNull (for classes
-            // generated by pre-1.2 compilers).  Handle both.
-            Identifier inner_nm = idNull;
-            // InnerClasses_attribute.classes.inner_name_index
-            int inner_nm_index = ds.readUnsignedShort();
-            if (inner_nm_index != 0) {
-                inner_nm = Identifier.lookup(cpool.getString(inner_nm_index));
-            }
-
-            // Read in the modifiers for the inner class.
-            // InnerClasses_attribute.classes.inner_name_index
-            int mods = ds.readUnsignedShort();
-
-            // Is the class accessible?
-            // The old code checked for
-            //
-            //    (!inner_nm.equals(idNull) && (mods & M_PRIVATE) == 0)
-            //
-            // which we will preserve to keep it working for class files
-            // generated by 1.1 compilers.  In addition we check for
-            //
-            //    (outer != null)
-            //
-            // as an additional check that only makes sense with 1.2
-            // generated files.  Note that it is entirely possible that
-            // the M_PRIVATE bit is always enough.  We are being
-            // conservative here.
-            //
-            // The ATT_ALLCLASSES flag causes the M_PRIVATE modifier
-            // to be ignored, and is used by tools such as 'javap' that
-            // wish to examine all classes regardless of the normal access
-            // controls that apply during compilation.  Note that anonymous
-            // and local classes are still not considered accessible, though
-            // named local classes in jdk1.1 may slip through.  Note that
-            // this accessibility test is an optimization, and it is safe to
-            // err on the side of greater accessibility.
-            boolean accessible =
-                (outer != null) &&
-                (!inner_nm.equals(idNull)) &&
-                ((mods & M_PRIVATE) == 0 ||
-                 (flags & ATT_ALLCLASSES) != 0);
-
-            // The reader should note that there has been a significant change
-            // in the way that the InnerClasses attribute is being handled.
-            // In particular, previously the compiler called initInner() for
-            // <em>every</em> inner class.  Now the compiler does not call
-            // initInner() if the inner class is inaccessible.  This means
-            // that inaccessible inner classes don't have any of the processing
-            // from initInner() done for them: fixing the access flags,
-            // setting outerClass, setting outerMember in their outerClass,
-            // etc.  We believe this is fine: if the class is inaccessible
-            // and binary, then everyone who needs to see its internals
-            // has already been compiled.  Hopefully.
-
-            if (accessible) {
-                Identifier nm =
-                    Identifier.lookupInner(outer.getName(), inner_nm);
-
-                // Tell the type module about the nesting relation:
-                Type.tClass(nm);
-
-                if (inner.equals(getClassDeclaration())) {
-                    // The inner class in the record is this class.
-                    try {
-                        ClassDefinition outerClass = outer.getClassDefinition(env);
-                        initInner(outerClass, mods);
-                    } catch (ClassNotFound e) {
-                        // report the error elsewhere
-                    }
-                } else if (outer.equals(getClassDeclaration())) {
-                    // The outer class in the record is this class.
-                    try {
-                        ClassDefinition innerClass =
-                            inner.getClassDefinition(env);
-                        initOuter(innerClass, mods);
-                    } catch (ClassNotFound e) {
-                        // report the error elsewhere
-                    }
-                }
-            }
-        }
-    }
-
-    private void initInner(ClassDefinition outerClass, int mods) {
-        if (getOuterClass() != null)
-            return;             // already done
-        /******
-        // Maybe set static, protected, or private.
-        if ((