Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
8294959: java.base java.lang.Module uses ASM to load module-info.class
Reviewed-by: mchung
  • Loading branch information
asotona committed Mar 9, 2023
1 parent 68b5eef commit 595645c
Showing 1 changed file with 17 additions and 46 deletions.
63 changes: 17 additions & 46 deletions src/java.base/share/classes/java/lang/Module.java
Expand Up @@ -35,6 +35,7 @@
import java.lang.module.ModuleDescriptor.Opens;
import java.lang.module.ModuleDescriptor.Version;
import java.lang.module.ResolvedModule;
import java.lang.reflect.AccessFlag;
import java.lang.reflect.AnnotatedElement;
import java.net.URI;
import java.net.URL;
Expand All @@ -51,6 +52,13 @@
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import jdk.internal.classfile.AccessFlags;
import jdk.internal.classfile.Attribute;
import jdk.internal.classfile.ClassModel;
import jdk.internal.classfile.ClassTransform;
import jdk.internal.classfile.Classfile;
import jdk.internal.classfile.attribute.ModuleAttribute;
import jdk.internal.classfile.attribute.RuntimeVisibleAnnotationsAttribute;

import jdk.internal.javac.PreviewFeature;
import jdk.internal.loader.BuiltinClassLoader;
Expand All @@ -62,13 +70,6 @@
import jdk.internal.module.ModuleLoaderMap;
import jdk.internal.module.ServicesCatalog;
import jdk.internal.module.Resources;
import jdk.internal.org.objectweb.asm.AnnotationVisitor;
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;
import jdk.internal.org.objectweb.asm.ModuleVisitor;
import jdk.internal.org.objectweb.asm.Opcodes;
import jdk.internal.reflect.CallerSensitive;
import jdk.internal.reflect.Reflection;
import jdk.internal.vm.annotation.Stable;
Expand Down Expand Up @@ -1589,47 +1590,17 @@ private Class<?> loadModuleInfoClass() {
*/
private Class<?> loadModuleInfoClass(InputStream in) throws IOException {
final String MODULE_INFO = "module-info";

ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS
+ ClassWriter.COMPUTE_FRAMES);

ClassVisitor cv = new ClassVisitor(Opcodes.ASM7, cw) {
@Override
public void visit(int version,
int access,
String name,
String signature,
String superName,
String[] interfaces) {
cw.visit(version,
Opcodes.ACC_INTERFACE
+ Opcodes.ACC_ABSTRACT
+ Opcodes.ACC_SYNTHETIC,
MODULE_INFO,
null,
"java/lang/Object",
null);
}
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
byte[] bytes = Classfile.parse(in.readAllBytes(),
Classfile.Option.constantPoolSharing(false)).transform((clb, cle) -> {
switch (cle) {
case AccessFlags af -> clb.withFlags(AccessFlag.INTERFACE,
AccessFlag.ABSTRACT, AccessFlag.SYNTHETIC);
// keep annotations
return super.visitAnnotation(desc, visible);
}
@Override
public void visitAttribute(Attribute attr) {
case RuntimeVisibleAnnotationsAttribute a -> clb.with(a);
// drop non-annotation attributes
}
@Override
public ModuleVisitor visitModule(String name, int flags, String version) {
// drop Module attribute
return null;
}
};

ClassReader cr = new ClassReader(in);
cr.accept(cv, 0);
byte[] bytes = cw.toByteArray();

case Attribute<?> a -> {}
default -> clb.with(cle);
}});
ClassLoader cl = new ClassLoader(loader) {
@Override
protected Class<?> findClass(String cn)throws ClassNotFoundException {
Expand Down

1 comment on commit 595645c

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.