On Wed, 15 Mar 2023 16:42:53 GMT, Adam Sotona <asot...@openjdk.org> wrote:
>> jdk.jlink internal plugins are heavily using ASM >> >> This patch converts ASM calls to Classfile API. >> >> Please review. >> Thanks, >> Adam > > Adam Sotona has updated the pull request incrementally with one additional > commit since the last revision: > > fixed SystemModulesPlugin src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java line 160: > 158: > resource.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)) { > 159: byte[] bytes = resource.contentBytes(); > 160: if (newClassReader(path, bytes).interfaces().stream() `IncludeLocalesPluginTest.java` test is failing. Adding `-J-Djlink.debug=true` will get the stack trace: Failed to parse class file: /jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th java.lang.IllegalStateException: Bad magic number at java.base/jdk.internal.classfile.impl.ClassReaderImpl.<init>(ClassReaderImpl.java:94) at java.base/jdk.internal.classfile.impl.ClassImpl.<init>(ClassImpl.java:68) at java.base/jdk.internal.classfile.Classfile.parse(Classfile.java:165) at jdk.jlink/jdk.tools.jlink.internal.plugins.AbstractPlugin.newClassReader(AbstractPlugin.java:105) at jdk.jlink/jdk.tools.jlink.internal.plugins.IncludeLocalesPlugin.lambda$transform$5(IncludeLocalesPlugin.java:161) at jdk.jlink/jdk.tools.jlink.plugin.ResourcePool.lambda$transformAndCopy$0(ResourcePool.java:112) at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1924) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at jdk.jlink/jdk.tools.jlink.plugin.ResourcePool.transformAndCopy(ResourcePool.java:111) at jdk.jlink/jdk.tools.jlink.internal.plugins.IncludeLocalesPlugin.transform(IncludeLocalesPlugin.java:154) at jdk.jlink/jdk.tools.jlink.internal.ImagePluginStack.visitResources(ImagePluginStack.java:262) at jdk.jlink/jdk.tools.jlink.internal.ImageFileCreator.generateJImage(ImageFileCreator.java:184) at jdk.jlink/jdk.tools.jlink.internal.ImageFileCreator.writeImage(ImageFileCreator.java:163) at jdk.jlink/jdk.tools.jlink.internal.ImageFileCreator.create(ImageFileCreator.java:100) at jdk.jlink/jdk.tools.jlink.internal.JlinkTask$ImageHelper.retrieve(JlinkTask.java:889) at jdk.jlink/jdk.tools.jlink.internal.ImagePluginStack.operate(ImagePluginStack.java:194) at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImage(JlinkTask.java:452) at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.run(JlinkTask.java:292) at jdk.jlink/jdk.tools.jlink.internal.Main.run(Main.java:56) at jdk.jlink/jdk.tools.jlink.internal.Main.main(Main.java:34) Dumping class file 26549-include-locales//jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th java.lang.IllegalStateException: Bad magic number at java.base/jdk.internal.classfile.impl.ClassReaderImpl.<init>(ClassReaderImpl.java:94) at java.base/jdk.internal.classfile.impl.ClassImpl.<init>(ClassImpl.java:68) at java.base/jdk.internal.classfile.Classfile.parse(Classfile.java:165) at jdk.jlink/jdk.tools.jlink.internal.plugins.AbstractPlugin.newClassReader(AbstractPlugin.java:105) at jdk.jlink/jdk.tools.jlink.internal.plugins.IncludeLocalesPlugin.lambda$transform$5(IncludeLocalesPlugin.java:161) at jdk.jlink/jdk.tools.jlink.plugin.ResourcePool.lambda$transformAndCopy$0(ResourcePool.java:112) at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1924) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at jdk.jlink/jdk.tools.jlink.plugin.ResourcePool.transformAndCopy(ResourcePool.java:111) at jdk.jlink/jdk.tools.jlink.internal.plugins.IncludeLocalesPlugin.transform(IncludeLocalesPlugin.java:154) at jdk.jlink/jdk.tools.jlink.internal.ImagePluginStack.visitResources(ImagePluginStack.java:262) at jdk.jlink/jdk.tools.jlink.internal.ImageFileCreator.generateJImage(ImageFileCreator.java:184) at jdk.jlink/jdk.tools.jlink.internal.ImageFileCreator.writeImage(ImageFileCreator.java:163) at jdk.jlink/jdk.tools.jlink.internal.ImageFileCreator.create(ImageFileCreator.java:100) at jdk.jlink/jdk.tools.jlink.internal.JlinkTask$ImageHelper.retrieve(JlinkTask.java:889) at jdk.jlink/jdk.tools.jlink.internal.ImagePluginStack.operate(ImagePluginStack.java:194) at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImage(JlinkTask.java:452) at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.run(JlinkTask.java:292) at jdk.jlink/jdk.tools.jlink.internal.Main.run(Main.java:56) at jdk.jlink/jdk.tools.jlink.internal.Main.main(Main.java:34) ``` Apparently `/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th` is not a valid class file. Using ASM `ClassReader` to parse this resource file succeeds because it does not do much of the class file validation. Instead the ClassFile API throws `IllegalStateException` as it has a bad magic number. @naotoj what is the file format of this `LineBreakIteratorData_th` file? ------------- PR: https://git.openjdk.org/jdk/pull/12944