< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java

Print this page

        

*** 50,59 **** --- 50,60 ---- import jdk.internal.module.ClassFileConstants; import jdk.internal.module.ModuleHashes; import jdk.internal.module.ModuleInfo.Attributes; import jdk.internal.module.ModuleInfoExtender; import jdk.internal.module.ModuleResolution; + import jdk.internal.module.ModuleTarget; import jdk.internal.module.SystemModules; import jdk.internal.org.objectweb.asm.Attribute; import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.org.objectweb.asm.ClassVisitor; import jdk.internal.org.objectweb.asm.ClassWriter;
*** 204,219 **** } // add ModulePackages attribute if this module contains some packages // and ModulePackages is not present this.addModulePackages = packages.size() > 0 && !hasModulePackages(); // drop target attribute only if any OS property is present ! if (dropModuleTarget) { ! this.dropModuleTarget = ! descriptor.osName().isPresent() || ! descriptor.osArch().isPresent() || ! descriptor.osVersion().isPresent(); } else { this.dropModuleTarget = false; } } --- 205,220 ---- } // add ModulePackages attribute if this module contains some packages // and ModulePackages is not present this.addModulePackages = packages.size() > 0 && !hasModulePackages(); + // drop target attribute only if any OS property is present ! ModuleTarget target = attrs.target(); ! if (dropModuleTarget && target != null) { ! this.dropModuleTarget = (target.osName() != null) ! || (target.osArch() != null); } else { this.dropModuleTarget = false; } }
*** 228,237 **** --- 229,242 ---- Set<String> packages() { return packages; } + ModuleTarget target() { + return attrs.target(); + } + ModuleHashes recordedHashes() { return attrs.recordedHashes(); } ModuleResolution moduleResolution() {
*** 370,380 **** extender.packages(packages); } } void dropModuleTarget() { ! extender.targetPlatform("", "", ""); } byte[] getBytes() throws IOException { extender.write(this); return buf; --- 375,385 ---- extender.packages(packages); } } void dropModuleTarget() { ! extender.targetPlatform("", ""); } byte[] getBytes() throws IOException { extender.write(this); return buf;
*** 397,406 **** --- 402,415 ---- "java/lang/module/ModuleDescriptor$Requires$Modifier"; private static final String EXPORTS_MODIFIER_CLASSNAME = "java/lang/module/ModuleDescriptor$Exports$Modifier"; private static final String OPENS_MODIFIER_CLASSNAME = "java/lang/module/ModuleDescriptor$Opens$Modifier"; + private static final String MODULE_TARGET_CLASSNAME = + "jdk/internal/module/ModuleTarget"; + private static final String MODULE_TARGET_ARRAY_SIGNATURE = + "[Ljdk/internal/module/ModuleTarget;"; private static final String MODULE_HASHES_ARRAY_SIGNATURE = "[Ljdk/internal/module/ModuleHashes;"; private static final String MODULE_RESOLUTION_CLASSNAME = "jdk/internal/module/ModuleResolution"; private static final String MODULE_RESOLUTIONS_ARRAY_SIGNATURE =
*** 412,421 **** --- 421,431 ---- private static final int MAX_LOCAL_VARS = 256; private final int BUILDER_VAR = 0; private final int MD_VAR = 1; // variable for ModuleDescriptor + private final int MT_VAR = 1; // variable for ModuleTarget private final int MH_VAR = 1; // variable for ModuleHashes private int nextLocalVar = 2; // index to next local variable private final ClassWriter cw; private boolean dropModuleTarget;
*** 513,527 **** ModuleInfo moduleInfo; if (entry.moduleName().equals("java.base")) { moduleInfo = new ModuleInfo(entry.contentBytes(), packages, false); ModuleDescriptor md = moduleInfo.descriptor; ! // drop Moduletarget attribute only if java.base has all OS properties ! // otherwise, retain it ! if (dropModuleTarget && ! md.osName().isPresent() && md.osArch().isPresent() && ! md.osVersion().isPresent()) { dropModuleTarget = true; } else { dropModuleTarget = false; } } else { --- 523,536 ---- ModuleInfo moduleInfo; if (entry.moduleName().equals("java.base")) { moduleInfo = new ModuleInfo(entry.contentBytes(), packages, false); ModuleDescriptor md = moduleInfo.descriptor; ! // drop ModuleTarget attribute if java.base has all OS properties ! ModuleTarget target = moduleInfo.target(); ! if (dropModuleTarget ! && (target.osName() != null) && (target.osArch() != null)) { dropModuleTarget = true; } else { dropModuleTarget = false; } } else {
*** 582,600 **** boolean hasSplitPackages = (numPackages < packageCount); clinit(numModules, numPackages, hasSplitPackages); // generate SystemModules::descriptors genDescriptorsMethod(); // generate SystemModules::hashes genHashesMethod(); // generate SystemModules::moduleResolutions genModuleResolutionsMethod(); return cw; } ! /* * Generate bytecode for SystemModules::descriptors method */ private void genDescriptorsMethod() { this.mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "descriptors", --- 591,614 ---- boolean hasSplitPackages = (numPackages < packageCount); clinit(numModules, numPackages, hasSplitPackages); // generate SystemModules::descriptors genDescriptorsMethod(); + + // generate SystemModules::targets + genTargetsMethod(); + // generate SystemModules::hashes genHashesMethod(); + // generate SystemModules::moduleResolutions genModuleResolutionsMethod(); return cw; } ! /** * Generate bytecode for SystemModules::descriptors method */ private void genDescriptorsMethod() { this.mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "descriptors",
*** 614,627 **** } mv.visitVarInsn(ALOAD, MD_VAR); mv.visitInsn(ARETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } ! /* * Generate bytecode for SystemModules::hashes method */ private void genHashesMethod() { MethodVisitor hmv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, --- 628,678 ---- } mv.visitVarInsn(ALOAD, MD_VAR); mv.visitInsn(ARETURN); mv.visitMaxs(0, 0); mv.visitEnd(); + } + /** + * Generate bytecode for SystemModules::targets method + */ + private void genTargetsMethod() { + MethodVisitor mv = cw.visitMethod(ACC_PUBLIC+ACC_STATIC, + "targets", + "()" + MODULE_TARGET_ARRAY_SIGNATURE, + "()" + MODULE_TARGET_ARRAY_SIGNATURE, + null); + mv.visitCode(); + pushInt(mv, moduleInfos.size()); + mv.visitTypeInsn(ANEWARRAY, MODULE_TARGET_CLASSNAME); + mv.visitVarInsn(ASTORE, MT_VAR); + + for (int index=0; index < moduleInfos.size(); index++) { + ModuleInfo minfo = moduleInfos.get(index); + if (minfo.target() != null && !minfo.dropModuleTarget) { + mv.visitVarInsn(ALOAD, MT_VAR); + pushInt(mv, index); + + // new ModuleTarget(String, String) + mv.visitTypeInsn(NEW, MODULE_TARGET_CLASSNAME); + mv.visitInsn(DUP); + mv.visitLdcInsn(minfo.target().osName()); + mv.visitLdcInsn(minfo.target().osArch()); + mv.visitMethodInsn(INVOKESPECIAL, MODULE_TARGET_CLASSNAME, + "<init>", "(Ljava/lang/String;Ljava/lang/String;)V", false); + + mv.visitInsn(AASTORE); + } } ! mv.visitVarInsn(ALOAD, MT_VAR); ! mv.visitInsn(ARETURN); ! mv.visitMaxs(0, 0); ! mv.visitEnd(); ! } ! ! /** * Generate bytecode for SystemModules::hashes method */ private void genHashesMethod() { MethodVisitor hmv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC,
*** 645,658 **** hmv.visitVarInsn(ALOAD, MH_VAR); hmv.visitInsn(ARETURN); hmv.visitMaxs(0, 0); hmv.visitEnd(); - } ! /* * Generate bytecode for SystemModules::methodResoultions method */ private void genModuleResolutionsMethod() { MethodVisitor mresmv = cw.visitMethod(ACC_PUBLIC+ACC_STATIC, --- 696,708 ---- hmv.visitVarInsn(ALOAD, MH_VAR); hmv.visitInsn(ARETURN); hmv.visitMaxs(0, 0); hmv.visitEnd(); } ! /** * Generate bytecode for SystemModules::methodResoultions method */ private void genModuleResolutionsMethod() { MethodVisitor mresmv = cw.visitMethod(ACC_PUBLIC+ACC_STATIC,
*** 747,756 **** --- 797,807 ---- static final String BOOLEAN_SIG = "(Z)" + BUILDER_TYPE; final ModuleDescriptor md; final Set<String> packages; final int index; + ModuleDescriptorBuilder(ModuleDescriptor md, Set<String> packages, int index) { if (md.isAutomatic()) { throw new InternalError("linking automatic module is not supported"); } this.md = md;
*** 784,798 **** md.version().ifPresent(this::version); // main class md.mainClass().ifPresent(this::mainClass); - // os name, arch, version - targetPlatform(md.osName().orElse(null), - md.osArch().orElse(null), - md.osVersion().orElse(null)); - putModuleDescriptor(); } void newBuilder() { mv.visitTypeInsn(NEW, MODULE_DESCRIPTOR_BUILDER); --- 835,844 ----
*** 1086,1114 **** mv.visitMethodInsn(INVOKEVIRTUAL, MODULE_DESCRIPTOR_BUILDER, "version", STRING_SIG, false); mv.visitInsn(POP); } - /* - * Invoke Builder.osName(String name) - * Builder.osArch(String arch) - * Builder.osVersion(String version) - */ - void targetPlatform(String osName, String osArch, String osVersion) { - if (osName != null) { - invokeBuilderMethod("osName", osName); - } - - if (osArch != null) { - invokeBuilderMethod("osArch", osArch); - } - - if (osVersion != null) { - invokeBuilderMethod("osVersion", osVersion); - } - } - void invokeBuilderMethod(String methodName, String value) { mv.visitVarInsn(ALOAD, BUILDER_VAR); mv.visitLdcInsn(value); mv.visitMethodInsn(INVOKEVIRTUAL, MODULE_DESCRIPTOR_BUILDER, methodName, STRING_SIG, false); --- 1132,1141 ----
< prev index next >