LibJF/libjf-unsafe-v0/src/main/java/io/gitlab/jfronny/libjf/unsafe/asm/AsmTransformer.java

42 lines
1.6 KiB
Java
Raw Normal View History

2021-09-27 20:55:48 +02:00
package io.gitlab.jfronny.libjf.unsafe.asm;
import io.gitlab.jfronny.libjf.unsafe.asm.patch.Patch;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.transformer.FabricMixinTransformerProxy;
import org.spongepowered.asm.transformers.MixinClassWriter;
public class AsmTransformer extends FabricMixinTransformerProxy {
public FabricMixinTransformerProxy delegate;
public AsmConfig asmConfig;
@Override
public byte[] transformClassBytes(String name, String transformedName, byte[] basicClass) {
byte[] data = delegate.transformClassBytes(name, transformedName, basicClass);
if (data == null || name == null)
return basicClass;
basicClass = data;
if (name.startsWith("org.objectweb.asm")
|| name.startsWith("net.fabricmc.loader")
|| name.startsWith("net.minecraft")
|| name.startsWith("io.gitlab.jfronny.libjf.unsafe.asm")
|| name.startsWith("joptsimple")
)
return basicClass;
ClassNode klass = new ClassNode();
ClassReader reader = new ClassReader(basicClass);
reader.accept(klass, ClassReader.EXPAND_FRAMES);
for (Patch patch : asmConfig.getPatches()) {
patch.apply(klass);
}
ClassWriter writer = new MixinClassWriter(reader, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
klass.accept(writer);
basicClass = writer.toByteArray();
return basicClass;
}
}