Do not compute frame on plugin class (#848)
This commit is contained in:
parent
c4063c14c5
commit
f76be9aab0
|
@ -11,6 +11,7 @@ import org.objectweb.asm.tree.AbstractInsnNode;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
import org.objectweb.asm.tree.FieldInsnNode;
|
import org.objectweb.asm.tree.FieldInsnNode;
|
||||||
import org.objectweb.asm.tree.FieldNode;
|
import org.objectweb.asm.tree.FieldNode;
|
||||||
|
import org.objectweb.asm.tree.FrameNode;
|
||||||
import org.objectweb.asm.tree.InsnList;
|
import org.objectweb.asm.tree.InsnList;
|
||||||
import org.objectweb.asm.tree.InsnNode;
|
import org.objectweb.asm.tree.InsnNode;
|
||||||
import org.objectweb.asm.tree.JumpInsnNode;
|
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 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(new FieldInsnNode(Opcodes.PUTFIELD, node.name, remapper.name, remapper.desc));
|
||||||
list.add(labelNode);
|
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 VarInsnNode(Opcodes.ALOAD, 0));
|
||||||
list.add(new FieldInsnNode(Opcodes.GETFIELD, node.name, remapper.name, remapper.desc));
|
list.add(new FieldInsnNode(Opcodes.GETFIELD, node.name, remapper.name, remapper.desc));
|
||||||
list.add(new InsnNode(Opcodes.ARETURN));
|
list.add(new InsnNode(Opcodes.ARETURN));
|
||||||
|
|
|
@ -167,12 +167,10 @@ public class ClassLoaderRemapper extends LenientJarRemapper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
|
||||||
private void checkFieldTypes(Field field) throws TypeNotPresentException {
|
private void checkFieldTypes(Field field) throws TypeNotPresentException {
|
||||||
field.getGenericType();
|
field.getGenericType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
|
||||||
private void checkMethodTypes(Method method) throws TypeNotPresentException {
|
private void checkMethodTypes(Method method) throws TypeNotPresentException {
|
||||||
method.getGenericReturnType();
|
method.getGenericReturnType();
|
||||||
method.getGenericParameterTypes();
|
method.getGenericParameterTypes();
|
||||||
|
@ -361,14 +359,13 @@ public class ClassLoaderRemapper extends LenientJarRemapper {
|
||||||
private byte[] remapClassFile(ClassReader reader, final ClassRepo repo) {
|
private byte[] remapClassFile(ClassReader reader, final ClassRepo repo) {
|
||||||
ClassNode node = new ClassNode();
|
ClassNode node = new ClassNode();
|
||||||
RemappingClassAdapter mapper = new RemappingClassAdapter(node, this, repo);
|
RemappingClassAdapter mapper = new RemappingClassAdapter(node, this, repo);
|
||||||
reader.accept(mapper, ClassReader.SKIP_FRAMES);
|
reader.accept(mapper, 0);
|
||||||
|
|
||||||
for (PluginTransformer transformer : ArclightRemapper.INSTANCE.getTransformerList()) {
|
for (PluginTransformer transformer : ArclightRemapper.INSTANCE.getTransformerList()) {
|
||||||
transformer.handleClass(node, this);
|
transformer.handleClass(node, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 有的插件的编译器奇奇怪怪的,所以在这里要重新计算 frame
|
ClassWriter wr = new PluginClassWriter(ClassWriter.COMPUTE_MAXS);
|
||||||
ClassWriter wr = new PluginClassWriter(node.version == Opcodes.V1_5 ? ClassWriter.COMPUTE_MAXS : ClassWriter.COMPUTE_FRAMES);
|
|
||||||
node.accept(wr);
|
node.accept(wr);
|
||||||
|
|
||||||
return dump(wr.toByteArray());
|
return dump(wr.toByteArray());
|
||||||
|
|
|
@ -31,7 +31,7 @@ public class SwitchTableFixer implements Implementer, Function<byte[], byte[]> {
|
||||||
@Override
|
@Override
|
||||||
public byte[] apply(byte[] bytes) {
|
public byte[] apply(byte[] bytes) {
|
||||||
ClassNode node = new ClassNode();
|
ClassNode node = new ClassNode();
|
||||||
new ClassReader(bytes).accept(node, ClassReader.SKIP_FRAMES);
|
new ClassReader(bytes).accept(node, 0);
|
||||||
processClass(node, null);
|
processClass(node, null);
|
||||||
ClassWriter writer = new ClassWriter(0);
|
ClassWriter writer = new ClassWriter(0);
|
||||||
node.accept(writer);
|
node.accept(writer);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user