Skip to content

Commit

Permalink
Fix running Fabric ASM's fork
Browse files Browse the repository at this point in the history
Who would've though these exist, right?

Update adapter data to fix LVT offsets incorrectly applying in methods added by forge

Fixes #516
  • Loading branch information
Su5eD committed Nov 20, 2023
1 parent 7db87c2 commit 09bf3ee
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 52 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ org.gradle.daemon=true

# Versions
versionConnector=1.0.0-beta.26
versionAdapter=1.8.12-1.20.1-20231112.230129
versionAdapter=1.8.16-1.20.1-20231120.221506
versionAdapterDefinition=1.8.16

versionMc=1.20.1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

public class FabricASMFixer {
private static final Logger LOGGER = LogUtils.getLogger();
private static final String FABRIC_ASM_MODID = "mm";
private static final Set<String> FABRIC_ASM_MODIDS = Set.of("mm", "mm_shedaniel");
private static final String MINECRAFT_MODULE = "minecraft";
public static final List<URL> URLS = new ArrayList<>();

Expand All @@ -57,7 +57,7 @@ public static void permitEnumSubclass(ClassNode enumNode, String anonymousClassN

public static void injectMinecraftModuleReader() {
try {
if (!FabricLoader.getInstance().isModLoaded(FABRIC_ASM_MODID)) {
if (FABRIC_ASM_MODIDS.stream().noneMatch(FabricLoader.getInstance()::isModLoaded)) {
return;
}
ModuleLayer layer = Launcher.INSTANCE.findLayerManager().orElseThrow().getLayer(IModuleLayerManager.Layer.GAME).orElseThrow();
Expand Down Expand Up @@ -115,7 +115,7 @@ public static class FabricASMGeneratedClassesSecureJar implements SecureJar {
}

private static class FabricASMGeneratedClassesProvider implements SecureJar.ModuleDataProvider {
private static final String GEN_PACKAGE = "com.chocohead.gen.mixin";
private static final Set<String> GEN_PACKAGES = Set.of("com.chocohead.gen.mixin", "me.shedaniel.gen.mixin");
private ModuleDescriptor descriptor;

@Override
Expand All @@ -127,7 +127,7 @@ public String name() {
public ModuleDescriptor descriptor() {
if (descriptor == null) {
descriptor = ModuleDescriptor.newAutomaticModule(name())
.packages(Set.of(GEN_PACKAGE))
.packages(GEN_PACKAGES)
.build();
}
return descriptor;
Expand Down
106 changes: 59 additions & 47 deletions src/mod/resources/META-INF/asm/injectFabricASM.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,56 +6,68 @@ var InsnNode = Java.type('org.objectweb.asm.tree.InsnNode');
var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode');

function initializeCoreMod() {
return {
'injectFabricASM': {
'target': {
'type': 'METHOD',
'class': 'com.chocohead.mm.Plugin',
'methodName': 'fishAddURL',
'methodDesc': '()Ljava/util/function/Consumer;'
var transformers = {};
var packages = ['com.chocohead.mm.', 'me.shedaniel.mm.'];

for (var i = 0; i < packages.length; i++) {
var pkg = packages[i];
var classTransformers = {
'injectFabricASM': {
'target': {
'type': 'METHOD',
'class': pkg + 'Plugin',
'methodName': 'fishAddURL',
'methodDesc': '()Ljava/util/function/Consumer;'
},
'transformer': function (node) {
var insns = new InsnList();
insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, 'dev/su5ed/sinytra/connector/service/FabricASMFixer', 'fishAddURL', '()Ljava/util/function/Consumer;'));
insns.add(new InsnNode(Opcodes.ARETURN));
node.instructions.insert(insns);
ASMAPI.log('DEBUG', 'Injected fishAddURL hook into FabricASM plugin');
return node;
}
},
'transformer': function (node) {
var insns = new InsnList();
insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, 'dev/su5ed/sinytra/connector/service/FabricASMFixer', 'fishAddURL', '()Ljava/util/function/Consumer;'));
insns.add(new InsnNode(Opcodes.ARETURN));
node.instructions.insert(insns);
ASMAPI.log('DEBUG', 'Injected fishAddURL hook into FabricASM plugin');
return node;
}
},
'renameGeneratedMixinClassName': {
'target': {
'type': 'METHOD',
'class': 'com.chocohead.mm.Plugin$1',
'methodName': 'generate',
'methodDesc': '(Ljava/lang/String;Ljava/util/Collection;)V'
'renameGeneratedMixinClassName': {
'target': {
'type': 'METHOD',
'class': pkg + 'Plugin$1',
'methodName': 'generate',
'methodDesc': '(Ljava/lang/String;Ljava/util/Collection;)V'
},
'transformer': function (node) {
var insns = new InsnList();
insns.add(new VarInsnNode(Opcodes.ALOAD, 1));
insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, 'dev/su5ed/sinytra/connector/service/FabricASMFixer', 'flattenMixinClass', '(Ljava/lang/String;)Ljava/lang/String;'));
insns.add(new VarInsnNode(Opcodes.ASTORE, 1));
node.instructions.insert(insns);
ASMAPI.log('DEBUG', 'Injected flattenMixinClass modifier into FabricASM Plugin$1');
return node;
}
},
'transformer': function (node) {
var insns = new InsnList();
insns.add(new VarInsnNode(Opcodes.ALOAD, 1));
insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, 'dev/su5ed/sinytra/connector/service/FabricASMFixer', 'flattenMixinClass', '(Ljava/lang/String;)Ljava/lang/String;'));
insns.add(new VarInsnNode(Opcodes.ASTORE, 1));
node.instructions.insert(insns);
ASMAPI.log('DEBUG', 'Injected flattenMixinClass modifier into FabricASM Plugin$1');
return node;
}
},
'permitEnumSubclass': {
'target': {
'type': 'METHOD',
'class': 'com.chocohead.mm.EnumSubclasser',
'methodName': 'defineAnonymousSubclass',
'methodDesc': '(Lorg/objectweb/asm/tree/ClassNode;Lcom/chocohead/mm/api/EnumAdder$EnumAddition;Ljava/lang/String;Ljava/lang/String;)[B'
},
'transformer': function (node) {
var insns = new InsnList();
insns.add(new VarInsnNode(Opcodes.ALOAD, 0));
insns.add(new VarInsnNode(Opcodes.ALOAD, 2));
insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, 'dev/su5ed/sinytra/connector/service/FabricASMFixer', 'permitEnumSubclass', '(Lorg/objectweb/asm/tree/ClassNode;Ljava/lang/String;)V'));
node.instructions.insert(insns);
ASMAPI.log('DEBUG', 'Injected permitEnumSubclass modifier into FabricASM EnumSubclasser');
return node;
'permitEnumSubclass': {
'target': {
'type': 'METHOD',
'class': pkg + 'EnumSubclasser',
'methodName': 'defineAnonymousSubclass',
'methodDesc': '(Lorg/objectweb/asm/tree/ClassNode;Lcom/chocohead/mm/api/EnumAdder$EnumAddition;Ljava/lang/String;Ljava/lang/String;)[B'
},
'transformer': function (node) {
var insns = new InsnList();
insns.add(new VarInsnNode(Opcodes.ALOAD, 0));
insns.add(new VarInsnNode(Opcodes.ALOAD, 2));
insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, 'dev/su5ed/sinytra/connector/service/FabricASMFixer', 'permitEnumSubclass', '(Lorg/objectweb/asm/tree/ClassNode;Ljava/lang/String;)V'));
node.instructions.insert(insns);
ASMAPI.log('DEBUG', 'Injected permitEnumSubclass modifier into FabricASM EnumSubclasser');
return node;
}
}
};

for (var key in classTransformers) {
transformers[key + i] = classTransformers[key];
}
}

return transformers;
}

0 comments on commit 09bf3ee

Please sign in to comment.