From f76be9aab038ccbdb28474b8be6c13e7311e05a3 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Tue, 17 Jan 2023 20:34:41 +0800 Subject: [PATCH] Do not compute frame on plugin class (#848) --- .../common/mod/util/remapper/ClassLoaderAdapter.java | 4 ++++ .../common/mod/util/remapper/ClassLoaderRemapper.java | 7 ++----- .../java/io/izzel/arclight/boot/asm/SwitchTableFixer.java | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderAdapter.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderAdapter.java index 3563e100..2fccc7a6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderAdapter.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderAdapter.java @@ -11,6 +11,7 @@ import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.FieldNode; +import org.objectweb.asm.tree.FrameNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.JumpInsnNode; @@ -86,6 +87,9 @@ public class ClassLoaderAdapter implements PluginTransformer { list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(ArclightRemapper.class), "createClassLoaderRemapper", Type.getMethodDescriptor(Type.getType(ClassLoaderRemapper.class), Type.getType(ClassLoader.class)), false)); list.add(new FieldInsnNode(Opcodes.PUTFIELD, node.name, remapper.name, remapper.desc)); list.add(labelNode); + if ((node.version & 0xFFFF) >= Opcodes.V1_6) { + list.add(new FrameNode(Opcodes.F_SAME, 0, null, 0, null)); + } list.add(new VarInsnNode(Opcodes.ALOAD, 0)); list.add(new FieldInsnNode(Opcodes.GETFIELD, node.name, remapper.name, remapper.desc)); list.add(new InsnNode(Opcodes.ARETURN)); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java index cd8a5efd..d99d84fd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java @@ -167,12 +167,10 @@ public class ClassLoaderRemapper extends LenientJarRemapper { } } - @SuppressWarnings("ResultOfMethodCallIgnored") private void checkFieldTypes(Field field) throws TypeNotPresentException { field.getGenericType(); } - @SuppressWarnings("ResultOfMethodCallIgnored") private void checkMethodTypes(Method method) throws TypeNotPresentException { method.getGenericReturnType(); method.getGenericParameterTypes(); @@ -361,14 +359,13 @@ public class ClassLoaderRemapper extends LenientJarRemapper { private byte[] remapClassFile(ClassReader reader, final ClassRepo repo) { ClassNode node = new ClassNode(); RemappingClassAdapter mapper = new RemappingClassAdapter(node, this, repo); - reader.accept(mapper, ClassReader.SKIP_FRAMES); + reader.accept(mapper, 0); for (PluginTransformer transformer : ArclightRemapper.INSTANCE.getTransformerList()) { transformer.handleClass(node, this); } - // 有的插件的编译器奇奇怪怪的,所以在这里要重新计算 frame - ClassWriter wr = new PluginClassWriter(node.version == Opcodes.V1_5 ? ClassWriter.COMPUTE_MAXS : ClassWriter.COMPUTE_FRAMES); + ClassWriter wr = new PluginClassWriter(ClassWriter.COMPUTE_MAXS); node.accept(wr); return dump(wr.toByteArray()); diff --git a/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/SwitchTableFixer.java b/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/SwitchTableFixer.java index f5e2d518..585e0c78 100644 --- a/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/SwitchTableFixer.java +++ b/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/SwitchTableFixer.java @@ -31,7 +31,7 @@ public class SwitchTableFixer implements Implementer, Function { @Override public byte[] apply(byte[] bytes) { ClassNode node = new ClassNode(); - new ClassReader(bytes).accept(node, ClassReader.SKIP_FRAMES); + new ClassReader(bytes).accept(node, 0); processClass(node, null); ClassWriter writer = new ClassWriter(0); node.accept(writer);