Do not compute frame on plugin class (#848)

This commit is contained in:
IzzelAliz 2023-01-17 20:34:41 +08:00
parent c4063c14c5
commit f76be9aab0
3 changed files with 7 additions and 6 deletions

View File

@ -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));

View File

@ -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());

View File

@ -31,7 +31,7 @@ public class SwitchTableFixer implements Implementer, Function<byte[], byte[]> {
@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);