From 2627286f6cc83ec7d420a4f760d736cd7af540f5 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 15 Jun 2022 19:40:14 -0600 Subject: [PATCH] package: allow newer class files than asm supports in multirelease jars --- .../runelite/pluginhub/packager/Plugin.java | 67 ++++++++++++------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java b/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java index 9bca3b264..35b519027 100644 --- a/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java +++ b/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java @@ -604,41 +604,56 @@ public class Plugin implements Closeable continue; } + boolean isMultiRelease = fileName.startsWith("META-INF/versions"); byte[] classData = ByteStreams.toByteArray(jis); - new ClassReader(classData).accept(new ClassVisitor(Opcodes.ASM7, builtinApi) + + try { - boolean extendsPlugin; - String name; - - @SneakyThrows - @Override - public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) + new ClassReader(classData).accept(new ClassVisitor(Opcodes.ASM7, builtinApi) { - if ((version & 0xFFFF) > Opcodes.V1_8 - && !(fileName.startsWith("META-INF/versions") || fileName.endsWith("module-info.class"))) + boolean extendsPlugin; + String name; + + @SneakyThrows + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - throw PluginBuildException.of(Plugin.this, "plugins must be Java 1.8 compatible") - .withFile(fileName); + if ((version & 0xFFFF) > Opcodes.V1_8 + && !(isMultiRelease || fileName.endsWith("module-info.class"))) + { + throw PluginBuildException.of(Plugin.this, "plugins must be Java 1.8 compatible") + .withFile(fileName); + } + + jarClasses.add(name.replace('/', '.')); + + extendsPlugin = "net/runelite/client/plugins/Plugin".equals(superName); + this.name = name; + super.visit(version, access, name, signature, superName, interfaces); } - jarClasses.add(name.replace('/', '.')); - - extendsPlugin = "net/runelite/client/plugins/Plugin".equals(superName); - this.name = name; - super.visit(version, access, name, signature, superName, interfaces); - } - - @Override - public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) - { - if ("Lnet/runelite/client/plugins/PluginDescriptor;".equals(descriptor) && extendsPlugin) + @Override + public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { - pluginClasses.add(name.replace('/', '.')); - } + if ("Lnet/runelite/client/plugins/PluginDescriptor;".equals(descriptor) && extendsPlugin) + { + pluginClasses.add(name.replace('/', '.')); + } - return null; + return null; + } + }, ClassReader.SKIP_CODE); + } + catch (IllegalArgumentException e) + { + if (isMultiRelease) + { + // allow multirelease classes to not be parsable by asm, they may be too new + return; } - }, ClassReader.SKIP_CODE); + + throw e; + } } }