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

41 lines
1.5 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
2021-09-28 20:31:54 +02:00
public byte[] transformClassBytes(String name, String transformedName, byte[] classBytes) {
classBytes = delegate.transformClassBytes(name, transformedName, classBytes);
if (classBytes == null || name == null)
return classBytes;
2021-09-27 20:55:48 +02:00
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")
)
2021-09-28 20:31:54 +02:00
return classBytes;
2021-09-27 20:55:48 +02:00
ClassNode klass = new ClassNode();
2021-09-28 20:31:54 +02:00
ClassReader reader = new ClassReader(classBytes);
2021-09-27 20:55:48 +02:00
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);
2021-09-28 20:31:54 +02:00
classBytes = writer.toByteArray();
return classBytes;
2021-09-27 20:55:48 +02:00
}
}