8294971: jdk.jlink jdk.tools.jimage.JImageTask is using ASM to verify classes

Reviewed-by: mchung
This commit is contained in:
Adam Sotona 2023-03-10 10:15:37 +00:00
parent 0f26d09da8
commit b1d89f3066
2 changed files with 13 additions and 5 deletions

View file

@ -190,6 +190,8 @@ module java.base {
jdk.jlink; jdk.jlink;
exports jdk.internal.logger to exports jdk.internal.logger to
java.logging; java.logging;
exports jdk.internal.classfile to
jdk.jlink;
exports jdk.internal.org.objectweb.asm to exports jdk.internal.org.objectweb.asm to
jdk.jartool, jdk.jartool,
jdk.jfr, jdk.jfr,

View file

@ -39,12 +39,14 @@ import java.util.MissingResourceException;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import jdk.internal.classfile.ClassModel;
import jdk.internal.classfile.Classfile;
import jdk.internal.classfile.CodeModel;
import jdk.internal.classfile.MethodModel;
import jdk.internal.jimage.BasicImageReader; import jdk.internal.jimage.BasicImageReader;
import jdk.internal.jimage.ImageHeader; import jdk.internal.jimage.ImageHeader;
import jdk.internal.jimage.ImageLocation; import jdk.internal.jimage.ImageLocation;
import jdk.internal.org.objectweb.asm.ClassReader;
import jdk.internal.org.objectweb.asm.tree.ClassNode;
import jdk.tools.jlink.internal.ImageResourcesTree; import jdk.tools.jlink.internal.ImageResourcesTree;
import jdk.tools.jlink.internal.TaskHelper; import jdk.tools.jlink.internal.TaskHelper;
import jdk.tools.jlink.internal.TaskHelper.BadArgs; import jdk.tools.jlink.internal.TaskHelper.BadArgs;
@ -366,9 +368,13 @@ class JImageTask {
if (name.endsWith(".class") && !name.endsWith("module-info.class")) { if (name.endsWith(".class") && !name.endsWith("module-info.class")) {
try { try {
byte[] bytes = reader.getResource(location); byte[] bytes = reader.getResource(location);
ClassReader cr = new ClassReader(bytes); Classfile.parse(bytes).forEachElement(cle -> {
ClassNode cn = new ClassNode(); if (cle instanceof MethodModel mm) mm.forEachElement(me -> {
cr.accept(cn, 0); if (me instanceof CodeModel com) com.forEachElement(coe -> {
//do nothing here, just visit each model element
});
});
});
} catch (Exception ex) { } catch (Exception ex) {
log.println("Error(s) in Class: " + name); log.println("Error(s) in Class: " + name);
} }