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; } }