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

Reply via email to