From 1b5b9d7b74dac6a4392a418fe3dd90bcc6b5e0cf Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 1 Jul 2023 15:45:15 +0200 Subject: [PATCH] Port JDK master changes --- .../internal/plugins/SystemModulesPlugin.java | 123 ++++++++++-------- 1 file changed, 71 insertions(+), 52 deletions(-) diff --git a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java index 8f3e0be22cd..f70765ed428 100644 --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java @@ -118,12 +118,16 @@ public final class SystemModulesPlugin extends AbstractPlugin { ClassDesc.ofInternalName("jdk/internal/module/SystemModules"); private static final ClassDesc CD_SYSTEM_MODULES_MAP = ClassDesc.ofInternalName(SYSTEM_MODULES_MAP_CLASSNAME); - private final int moduleDescriptorsPerMethod; + private static final MethodTypeDesc MTD_StringArray = MethodTypeDesc.of(CD_String.arrayType()); + private static final MethodTypeDesc MTD_SystemModules = MethodTypeDesc.of(CD_SYSTEM_MODULES); + + private int moduleDescriptorsPerMethod; private boolean enabled; public SystemModulesPlugin() { this(75); } + public SystemModulesPlugin(int moduleDescriptorsPerMethod) { super("system-modules"); this.moduleDescriptorsPerMethod = moduleDescriptorsPerMethod; @@ -436,7 +440,7 @@ void validatePackages() { boolean hasModulePackages() throws IOException { try (InputStream in = getInputStream()) { // parse module-info.class - return Classfile.parse(in.readAllBytes()).elementStream() + return Classfile.of().parse(in.readAllBytes()).elementStream() .anyMatch(e -> e instanceof ModulePackagesAttribute mpa && !mpa.packages().isEmpty()); } @@ -521,6 +525,18 @@ static class SystemModulesClassGenerator { ClassDesc.ofInternalName("jdk/internal/module/ModuleHashes"); private static final ClassDesc CD_MODULE_RESOLUTION = ClassDesc.ofInternalName("jdk/internal/module/ModuleResolution"); + private static final ClassDesc CD_Map_Entry = ClassDesc.ofInternalName("java/util/Map$Entry"); + private static final MethodTypeDesc MTD_boolean = MethodTypeDesc.of(CD_boolean); + private static final MethodTypeDesc MTD_ModuleDescriptorArray = MethodTypeDesc.of(CD_MODULE_DESCRIPTOR.arrayType()); + private static final MethodTypeDesc MTD_ModuleTargetArray = MethodTypeDesc.of(CD_MODULE_TARGET.arrayType()); + private static final MethodTypeDesc MTD_void_String = MethodTypeDesc.of(CD_void, CD_String); + private static final MethodTypeDesc MTD_void_int = MethodTypeDesc.of(CD_void, CD_int); + private static final MethodTypeDesc MTD_ModuleHashesArray = MethodTypeDesc.of(CD_MODULE_HASHES.arrayType()); + private static final MethodTypeDesc MTD_ModuleResolutionArray = MethodTypeDesc.of(CD_MODULE_RESOLUTION.arrayType()); + private static final MethodTypeDesc MTD_Map = MethodTypeDesc.of(CD_Map); + private static final MethodTypeDesc MTD_MapEntry_Object_Object = MethodTypeDesc.of(CD_Map_Entry, CD_Object, CD_Object); + private static final MethodTypeDesc MTD_Map_MapEntryArray = MethodTypeDesc.of(CD_Map, CD_Map_Entry.arrayType()); + private static final MethodTypeDesc MTD_Set_ObjectArray = MethodTypeDesc.of(CD_Set, CD_Object.arrayType()); private static final int MAX_LOCAL_VARS = 256; @@ -589,7 +605,7 @@ private void dedups(ModuleDescriptor md) { * Generate SystemModules class */ public byte[] genClassBytes(Configuration cf) { - return Classfile.build(classDesc, + return Classfile.of().build(classDesc, clb -> { clb.withFlags(ACC_FINAL + ACC_SUPER) .withInterfaceSymbols(List.of(CD_SYSTEM_MODULES)) @@ -626,13 +642,13 @@ public byte[] genClassBytes(Configuration cf) { */ private void genConstructor(ClassBuilder clb) { clb.withMethodBody( - "", - MethodTypeDesc.of(CD_void), + INIT_NAME, + MTD_void, ACC_PUBLIC, cob -> cob.aload(0) .invokespecial(CD_Object, - "", - MethodTypeDesc.of(CD_void)) + INIT_NAME, + MTD_void) .return_()); } @@ -648,7 +664,7 @@ private void genHasSplitPackages(ClassBuilder clb) { clb.withMethodBody( "hasSplitPackages", - MethodTypeDesc.of(CD_boolean), + MTD_boolean, ACC_PUBLIC, cob -> cob.constantInstruction(hasSplitPackages ? 1 : 0) .ireturn()); @@ -666,7 +682,7 @@ private void genIncubatorModules(ClassBuilder clb) { clb.withMethodBody( "hasIncubatorModules", - MethodTypeDesc.of(CD_boolean), + MTD_boolean, ACC_PUBLIC, cob -> cob.constantInstruction(hasIncubatorModules ? 1 : 0) .ireturn()); @@ -679,12 +695,13 @@ private void genModuleDescriptorsMethod(ClassBuilder clb) { if (moduleInfos.size() <= moduleDescriptorsPerMethod) { clb.withMethodBody( "moduleDescriptors", - MethodTypeDesc.of(CD_MODULE_DESCRIPTOR.arrayType()), + MTD_ModuleDescriptorArray, ACC_PUBLIC, cob -> { cob.constantInstruction(moduleInfos.size()) .anewarray(CD_MODULE_DESCRIPTOR) .astore(MD_VAR); + for (int index = 0; index < moduleInfos.size(); index++) { ModuleInfo minfo = moduleInfos.get(index); new ModuleDescriptorBuilder(cob, @@ -736,9 +753,9 @@ private void genModuleDescriptorsMethod(ClassBuilder clb) { ACC_PUBLIC, cob -> { cob.constantInstruction(moduleInfos.size()) - .anewarray(CD_MODULE_DESCRIPTOR) - .dup() - .astore(MD_VAR); + .anewarray(CD_MODULE_DESCRIPTOR) + .dup() + .astore(MD_VAR); cob.new_(arrayListClassDesc) .dup() .sipush(moduleInfos.size()) @@ -815,7 +832,7 @@ private void genModuleDescriptorsMethod(ClassBuilder clb) { private void genModuleTargetsMethod(ClassBuilder clb) { clb.withMethodBody( "moduleTargets", - MethodTypeDesc.of(CD_MODULE_TARGET.arrayType()), + MTD_ModuleTargetArray, ACC_PUBLIC, cob -> { cob.constantInstruction(moduleInfos.size()) @@ -848,8 +865,8 @@ private void genModuleTargetsMethod(ClassBuilder clb) { .dup() .constantInstruction(minfo.target().targetPlatform()) .invokespecial(CD_MODULE_TARGET, - "", - MethodTypeDesc.of(CD_void, CD_String)); + INIT_NAME, + MTD_void_String); cob.aastore(); } @@ -866,7 +883,7 @@ private void genModuleTargetsMethod(ClassBuilder clb) { private void genModuleHashesMethod(ClassBuilder clb) { clb.withMethodBody( "moduleHashes", - MethodTypeDesc.of(CD_MODULE_HASHES.arrayType()), + MTD_ModuleHashesArray, ACC_PUBLIC, cob -> { cob.constantInstruction(moduleInfos.size()) @@ -893,7 +910,7 @@ private void genModuleHashesMethod(ClassBuilder clb) { private void genModuleResolutionsMethod(ClassBuilder clb) { clb.withMethodBody( "moduleResolutions", - MethodTypeDesc.of(CD_MODULE_RESOLUTION.arrayType()), + MTD_ModuleResolutionArray, ACC_PUBLIC, cob -> { cob.constantInstruction(moduleInfos.size()) @@ -909,8 +926,8 @@ private void genModuleResolutionsMethod(ClassBuilder clb) { .dup() .constantInstruction(minfo.moduleResolution().value()) .invokespecial(CD_MODULE_RESOLUTION, - "", - MethodTypeDesc.of(CD_void, CD_int)) + INIT_NAME, + MTD_void_int) .aastore(); } } @@ -944,7 +961,7 @@ private void generate(ClassBuilder clb, boolean dedup) { clb.withMethodBody( methodName, - MethodTypeDesc.of(CD_Map), + MTD_Map, ACC_PUBLIC, cob -> { @@ -974,7 +991,7 @@ private void generate(ClassBuilder clb, // new Map$Entry[size] cob.constantInstruction(map.size()) - .anewarray(ClassDesc.ofInternalName("java/util/Map$Entry")); + .anewarray(CD_Map_Entry); int index = 0; for (var e : new TreeMap<>(map).entrySet()) { @@ -993,11 +1010,9 @@ private void generate(ClassBuilder clb, cob.aload(varIndex); } - MethodTypeDesc desc = MethodTypeDesc.ofDescriptor( - "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map$Entry;"); cob.invokestatic(CD_Map, "entry", - desc, + MTD_MapEntry_Object_Object, true) .aastore(); index++; @@ -1006,8 +1021,7 @@ private void generate(ClassBuilder clb, // invoke Map.ofEntries(Map$Entry[]) cob.invokestatic(CD_Map, "ofEntries", - MethodTypeDesc.ofDescriptor( - "([Ljava/util/Map$Entry;)Ljava/util/Map;"), + MTD_Map_MapEntryArray, true) .areturn(); }); @@ -1034,8 +1048,7 @@ private void genImmutableSet(CodeBuilder cob, Set set) { } cob.invokestatic(CD_Set, "of", - MethodTypeDesc.ofDescriptor( - "([Ljava/lang/Object;)Ljava/util/Set;"), + MTD_Set_ObjectArray, true); } else { for (String element : sorted(set)) { @@ -1090,6 +1103,9 @@ class ModuleDescriptorBuilder { static final MethodTypeDesc MTD_SET = MethodTypeDesc.of(CD_MODULE_BUILDER, CD_Set); static final MethodTypeDesc MTD_STRING = MethodTypeDesc.of(CD_MODULE_BUILDER, CD_String); static final MethodTypeDesc MTD_BOOLEAN = MethodTypeDesc.of(CD_MODULE_BUILDER, CD_boolean); + static final MethodTypeDesc MTD_void_String = MethodTypeDesc.of(CD_void, CD_String); + static final MethodTypeDesc MTD_ModuleDescriptor_int = MethodTypeDesc.of(CD_MODULE_DESCRIPTOR, CD_int); + static final MethodTypeDesc MTD_List_ObjectArray = MethodTypeDesc.of(CD_List, CD_Object.arrayType()); final CodeBuilder cob; final ModuleDescriptor md; @@ -1142,8 +1158,8 @@ void newBuilder() { .dup() .constantInstruction(md.name()) .invokespecial(CD_MODULE_BUILDER, - "", - MethodTypeDesc.of(CD_void, CD_String)) + INIT_NAME, + MTD_void_String) .astore(BUILDER_VAR); if (md.isOpen()) { @@ -1179,7 +1195,7 @@ void putModuleDescriptor() { .constantInstruction(md.hashCode()) .invokevirtual(CD_MODULE_BUILDER, "build", - MethodTypeDesc.of(CD_MODULE_DESCRIPTOR, CD_int)) + MTD_ModuleDescriptor_int) .aastore(); } @@ -1405,8 +1421,7 @@ void newProvides(String service, List providers) { } cob.invokestatic(CD_List, "of", - MethodTypeDesc.ofDescriptor( - "([Ljava/lang/Object;)Ljava/util/List;"), + MTD_List_ObjectArray, true) .invokestatic(CD_MODULE_BUILDER, "newProvides", @@ -1465,6 +1480,8 @@ class ModuleHashesBuilder { ClassDesc.ofInternalName("jdk/internal/module/ModuleHashes$Builder"); static final MethodTypeDesc STRING_BYTE_ARRAY_SIG = MethodTypeDesc.of(MODULE_HASHES_BUILDER, CD_String, CD_byte.arrayType()); + static final MethodTypeDesc MTD_void_String_int = MethodTypeDesc.of(CD_void, CD_String, CD_int); + static final MethodTypeDesc MTD_ModuleHashes = MethodTypeDesc.of(CD_MODULE_HASHES); final ModuleHashes recordedHashes; final CodeBuilder cob; @@ -1507,8 +1524,8 @@ void newModuleHashesBuilder() { .constantInstruction(recordedHashes.algorithm()) .constantInstruction(((4 * recordedHashes.names().size()) / 3) + 1) .invokespecial(MODULE_HASHES_BUILDER, - "", - MethodTypeDesc.of(CD_void, CD_String, CD_int)) + INIT_NAME, + MTD_void_String_int) .astore(BUILDER_VAR) .aload(BUILDER_VAR); } @@ -1524,7 +1541,7 @@ void pushModuleHashes() { .aload(BUILDER_VAR) .invokevirtual(MODULE_HASHES_BUILDER, "build", - MethodTypeDesc.of(CD_MODULE_HASHES)) + MTD_ModuleHashes) .aastore(); } @@ -1673,6 +1690,9 @@ int newStringSet(CodeBuilder cob, Set names) { * it will use a new local variable retrieved from the nextLocalVar */ static class SetBuilder> { + private static final MethodTypeDesc MTD_Set_ObjectArray = MethodTypeDesc.of( + CD_Set, CD_Object.arrayType()); + private final Set elements; private final int defaultVarIndex; private final IntSupplier nextLocalVar; @@ -1754,8 +1774,7 @@ private void generateSetOf(CodeBuilder cob, int index) { } cob.invokestatic(CD_Set, "of", - MethodTypeDesc.ofDescriptor( - "([Ljava/lang/Object;)Ljava/util/Set;"), + MTD_Set_ObjectArray, true); } cob.astore(index); @@ -1798,50 +1817,50 @@ private String genSystemModulesMapClass(ClassDesc allSystemModules, // write the class file to the pool as a resource String rn = "/java.base/" + SYSTEM_MODULES_MAP_CLASSNAME + ".class"; - ResourcePoolEntry e = ResourcePoolEntry.create(rn, Classfile.build( + ResourcePoolEntry e = ResourcePoolEntry.create(rn, Classfile.of().build( CD_SYSTEM_MODULES_MAP, clb -> clb.withFlags(ACC_FINAL + ACC_SUPER) .withVersion(52, 0) // .withMethodBody( - "", - MethodTypeDesc.of(CD_void), + INIT_NAME, + MTD_void, 0, cob -> cob.aload(0) .invokespecial(CD_Object, - "", - MethodTypeDesc.of(CD_void)) + INIT_NAME, + MTD_void) .return_()) // allSystemModules() .withMethodBody( "allSystemModules", - MethodTypeDesc.of(CD_SYSTEM_MODULES), + MTD_SystemModules, ACC_STATIC, cob -> cob.new_(allSystemModules) .dup() .invokespecial(allSystemModules, - "", - MethodTypeDesc.of(CD_void)) + INIT_NAME, + MTD_void) .areturn()) // defaultSystemModules() .withMethodBody( "defaultSystemModules", - MethodTypeDesc.of(CD_SYSTEM_MODULES), + MTD_SystemModules, ACC_STATIC, cob -> cob.new_(defaultSystemModules) .dup() .invokespecial(defaultSystemModules, - "", - MethodTypeDesc.of(CD_void)) + INIT_NAME, + MTD_void) .areturn()) // moduleNames() .withMethodBody( "moduleNames", - MethodTypeDesc.of(CD_String.arrayType()), + MTD_StringArray, ACC_STATIC, cob -> { cob.constantInstruction(map.size()); @@ -1862,7 +1881,7 @@ private String genSystemModulesMapClass(ClassDesc allSystemModules, // classNames() .withMethodBody( "classNames", - MethodTypeDesc.of(CD_String.arrayType()), + MTD_StringArray, ACC_STATIC, cob -> { cob.constantInstruction(map.size())