81 lines
3.0 KiB
Java
81 lines
3.0 KiB
Java
package io.gitlab.jfronny.libjf.unsafe;
|
|
|
|
import io.gitlab.jfronny.commons.log.Logger;
|
|
import io.gitlab.jfronny.libjf.unsafe.asm.AsmConfig;
|
|
import io.gitlab.jfronny.libjf.unsafe.asm.AsmTransformer;
|
|
import io.gitlab.jfronny.libjf.unsafe.asm.BakedAsmConfig;
|
|
import org.objectweb.asm.tree.ClassNode;
|
|
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
|
|
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
|
import org.spongepowered.asm.mixin.transformer.IMixinTransformer;
|
|
import sun.misc.Unsafe;
|
|
|
|
import java.lang.reflect.Field;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
|
|
public class MixinPlugin implements IMixinConfigPlugin {
|
|
@Override
|
|
public void onLoad(String mixinPackage) {
|
|
try {
|
|
Logger.resetFactory();
|
|
SafeLog.BACKEND = Logger.forName("libjf");
|
|
|
|
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
|
Class<?> classLoaderClass = classLoader.getClass();
|
|
|
|
Field delegateField = classLoaderClass.getDeclaredField("delegate");
|
|
delegateField.setAccessible(true);
|
|
Object delegate = delegateField.get(classLoader);
|
|
Class<?> delegateClass = delegate.getClass();
|
|
|
|
Field mixinTransformerField = delegateClass.getDeclaredField("mixinTransformer");
|
|
mixinTransformerField.setAccessible(true);
|
|
|
|
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
|
|
unsafeField.setAccessible(true);
|
|
Unsafe unsafe = (Unsafe) unsafeField.get(null);
|
|
|
|
AsmTransformer.INSTANCE = (AsmTransformer) unsafe.allocateInstance(AsmTransformer.class);
|
|
AsmTransformer.INSTANCE.delegate = (IMixinTransformer) mixinTransformerField.get(delegate);
|
|
AsmTransformer.INSTANCE.asmConfigs = new HashSet<>();
|
|
DynamicEntry.execute("libjf:asm", AsmConfig.class, s -> {
|
|
SafeLog.info("Discovered LibJF asm plugin in " + s.modId());
|
|
AsmTransformer.INSTANCE.asmConfigs.add(new BakedAsmConfig(s.instance(), s.modId()));
|
|
});
|
|
AsmTransformer.INSTANCE.init();
|
|
mixinTransformerField.set(delegate, AsmTransformer.INSTANCE);
|
|
} catch (NoSuchFieldException | IllegalAccessException | InstantiationException e) {
|
|
SafeLog.error("Could not initialize LibJF ASM", e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getRefMapperConfig() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
|
|
}
|
|
|
|
@Override
|
|
public List<String> getMixins() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
|
|
}
|
|
|
|
@Override
|
|
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
|
|
}
|
|
}
|