< prev index next >

src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java

Print this page
rev 47453 : imported patch jdk-new-asm-update.patch

*** 29,51 **** import java.io.InputStream; import java.io.OutputStream; import java.lang.module.ModuleDescriptor.Version; import java.util.ArrayList; import java.util.Collections; - import java.util.HashMap; import java.util.List; - import java.util.Map; import java.util.Set; 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.Opcodes; - import static jdk.internal.module.ClassFileAttributes.*; - /** * Utility class to extend a module-info.class with additional attributes. */ public final class ModuleInfoExtender { --- 29,51 ---- import java.io.InputStream; import java.io.OutputStream; import java.lang.module.ModuleDescriptor.Version; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; 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.org.objectweb.asm.commons.ModuleHashesAttribute; + import jdk.internal.org.objectweb.asm.commons.ModuleResolutionAttribute; + import jdk.internal.org.objectweb.asm.commons.ModuleTargetAttribute; /** * Utility class to extend a module-info.class with additional attributes. */ public final class ModuleInfoExtender {
*** 131,177 **** this.moduleResolution = mres; return this; } /** - * A ClassVisitor that supports adding class file attributes. If an - * attribute already exists then the first occurrence of the attribute - * is replaced. - */ - private static class AttributeAddingClassVisitor extends ClassVisitor { - private Map<String, Attribute> attrs = new HashMap<>(); - - AttributeAddingClassVisitor(int api, ClassVisitor cv) { - super(api, cv); - } - - void addAttribute(Attribute attr) { - attrs.put(attr.type, attr); - } - - @Override - public void visitAttribute(Attribute attr) { - String name = attr.type; - Attribute replacement = attrs.get(name); - if (replacement != null) { - attr = replacement; - attrs.remove(name); - } - super.visitAttribute(attr); - } - - /** - * Adds any remaining attributes that weren't replaced to the - * class file. - */ - void finish() { - attrs.values().forEach(a -> super.visitAttribute(a)); - attrs.clear(); - } - } - - /** * Outputs the modified module-info.class to the given output stream. * Once this method has been called then the Extender object should * be discarded. */ public void write(OutputStream out) throws IOException { --- 131,140 ----
*** 183,224 **** * Returns the bytes of the modified module-info.class. * Once this method has been called then the Extender object should * be discarded. */ public byte[] toByteArray() throws IOException { ! ClassWriter cw ! = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); - AttributeAddingClassVisitor cv - = new AttributeAddingClassVisitor(Opcodes.ASM5, cw); - ClassReader cr = new ClassReader(in); ! if (packages != null) ! cv.addAttribute(new ModulePackagesAttribute(packages)); ! if (mainClass != null) ! cv.addAttribute(new ModuleMainClassAttribute(mainClass)); ! if (targetPlatform != null) ! cv.addAttribute(new ModuleTargetAttribute(targetPlatform)); ! if (hashes != null) ! cv.addAttribute(new ModuleHashesAttribute(hashes)); ! if (moduleResolution != null) ! cv.addAttribute(new ModuleResolutionAttribute(moduleResolution.value())); ! List<Attribute> attrs = new ArrayList<>(); ! // prototypes of attributes that should be parsed ! attrs.add(new ModuleAttribute(version)); ! attrs.add(new ModulePackagesAttribute()); ! attrs.add(new ModuleMainClassAttribute()); attrs.add(new ModuleTargetAttribute()); attrs.add(new ModuleHashesAttribute()); - cr.accept(cv, attrs.toArray(new Attribute[0]), 0); ! // add any attributes that didn't replace previous attributes ! cv.finish(); return cw.toByteArray(); } /** --- 146,235 ---- * Returns the bytes of the modified module-info.class. * Once this method has been called then the Extender object should * be discarded. */ public byte[] toByteArray() throws IOException { ! ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS ! + ClassWriter.COMPUTE_FRAMES); ClassReader cr = new ClassReader(in); ! ClassVisitor cv = new ClassVisitor(Opcodes.ASM6, cw) { ! @Override ! public ModuleVisitor visitModule(String name, int flags, String version) { ! Version v = ModuleInfoExtender.this.version; ! String vs = (v != null) ? v.toString() : version; ! ModuleVisitor mv = super.visitModule(name, flags, vs); ! // ModuleMainClass attribute ! if (mainClass != null) { ! mv.visitMainClass(mainClass.replace('.', '/')); ! } ! // ModulePackages attribute ! if (packages != null) { ! packages.forEach(pn -> mv.visitPackage(pn.replace('.', '/'))); ! } ! ! return new ModuleVisitor(Opcodes.ASM6, mv) { ! public void visitMainClass(String existingMainClass) { ! // skip main class if there is a new value ! if (mainClass == null) { ! super.visitMainClass(existingMainClass); ! } ! } ! public void visitPackage(String existingPackage) { ! // skip packages if there is a new set of packages ! if (packages == null) { ! super.visitPackage(existingPackage); ! } ! } ! }; ! } ! @Override ! public void visitAttribute(Attribute attr) { ! String name = attr.type; ! // drop existing attributes if there are replacements ! if (name.equals(ClassFileConstants.MODULE_TARGET) ! && targetPlatform != null) ! return; ! if (name.equals(ClassFileConstants.MODULE_RESOLUTION) ! && moduleResolution != null) ! return; ! if (name.equals(ClassFileConstants.MODULE_HASHES) ! && hashes != null) ! return; ! ! super.visitAttribute(attr); ! ! } ! }; ! ! List<Attribute> attrs = new ArrayList<>(); attrs.add(new ModuleTargetAttribute()); + attrs.add(new ModuleResolutionAttribute()); attrs.add(new ModuleHashesAttribute()); cr.accept(cv, attrs.toArray(new Attribute[0]), 0); ! // add ModuleTarget, ModuleResolution and ModuleHashes attributes ! if (targetPlatform != null) { ! cw.visitAttribute(new ModuleTargetAttribute(targetPlatform)); ! } ! if (moduleResolution != null) { ! int flags = moduleResolution.value(); ! cw.visitAttribute(new ModuleResolutionAttribute(flags)); ! } ! if (hashes != null) { ! String algorithm = hashes.algorithm(); ! List<String> names = new ArrayList<>(); ! List<byte[]> values = new ArrayList<>(); ! for (String name : hashes.names()) { ! names.add(name); ! values.add(hashes.hashFor(name)); ! } ! cw.visitAttribute(new ModuleHashesAttribute(algorithm, names, values)); ! } return cw.toByteArray(); } /**
< prev index next >