< prev index next >
src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java
Print this page
@@ -50,10 +50,11 @@
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,16 +205,16 @@
}
// 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();
+ ModuleTarget target = attrs.target();
+ if (dropModuleTarget && target != null) {
+ this.dropModuleTarget = (target.osName() != null)
+ || (target.osArch() != null);
} else {
this.dropModuleTarget = false;
}
}
@@ -228,10 +229,14 @@
Set<String> packages() {
return packages;
}
+ ModuleTarget target() {
+ return attrs.target();
+ }
+
ModuleHashes recordedHashes() {
return attrs.recordedHashes();
}
ModuleResolution moduleResolution() {
@@ -370,11 +375,11 @@
extender.packages(packages);
}
}
void dropModuleTarget() {
- extender.targetPlatform("", "", "");
+ extender.targetPlatform("", "");
}
byte[] getBytes() throws IOException {
extender.write(this);
return buf;
@@ -397,10 +402,14 @@
"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,10 +421,11 @@
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,15 +523,14 @@
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()) {
+ // 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,19 +591,24 @@
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,14 +628,51 @@
}
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,14 +696,13 @@
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,10 +797,11 @@
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,15 +835,10 @@
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);
@@ -1086,29 +1132,10 @@
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);
< prev index next >