42 lines
1.6 KiB
Java
42 lines
1.6 KiB
Java
![]() |
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;
|
||
|
}
|
||
|
}
|