From 19f11ee62ed69aa3863a06e15e937a8d227e5cf3 Mon Sep 17 00:00:00 2001 From: FalsePattern Date: Fri, 7 Jun 2024 16:37:56 +0200 Subject: [PATCH] tiny asm fixes --- .../endlessids/asm/GameDataHooks.java | 6 +++++ .../asm/transformer/GameDataAccelerator.java | 22 ++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/falsepattern/endlessids/asm/GameDataHooks.java b/src/main/java/com/falsepattern/endlessids/asm/GameDataHooks.java index a0981e7..3457650 100644 --- a/src/main/java/com/falsepattern/endlessids/asm/GameDataHooks.java +++ b/src/main/java/com/falsepattern/endlessids/asm/GameDataHooks.java @@ -20,10 +20,14 @@ public class GameDataHooks { return gameData.endlessIDsItemBlockCache; } + //Called by ASM + @SuppressWarnings("unused") public static void cacheItemBlock(ItemBlock itemBlock, GameData gameData) { forGameData(gameData).put(itemBlock.field_150939_a, new WeakReference<>(itemBlock)); } + //Called by ASM + @SuppressWarnings("unused") public static ItemBlock fetchCachedItemBlock(Block block, GameData gameData) { var weakItem = forGameData(gameData).get(block); if (weakItem != null) { @@ -32,6 +36,8 @@ public class GameDataHooks { return null; } + //Called by ASM + @SuppressWarnings("unused") public static Iterable fakeIterable() { return Collections.emptyList(); } diff --git a/src/main/java/com/falsepattern/endlessids/asm/transformer/GameDataAccelerator.java b/src/main/java/com/falsepattern/endlessids/asm/transformer/GameDataAccelerator.java index 65dc43d..40ca3c0 100644 --- a/src/main/java/com/falsepattern/endlessids/asm/transformer/GameDataAccelerator.java +++ b/src/main/java/com/falsepattern/endlessids/asm/transformer/GameDataAccelerator.java @@ -1,5 +1,6 @@ package com.falsepattern.endlessids.asm.transformer; +import com.falsepattern.endlessids.asm.AsmTransformException; import com.falsepattern.endlessids.asm.IClassNodeTransformer; import com.falsepattern.endlessids.asm.IETransformer; import lombok.val; @@ -71,19 +72,30 @@ public class GameDataAccelerator implements IClassNodeTransformer { var iter = method.instructions.iterator(); while (iter.hasNext()) { var insn = iter.next(); - if (!(insn instanceof FieldInsnNode)) + if ((insn.getOpcode() != Opcodes.GETFIELD) && !(insn instanceof FieldInsnNode)) continue; var fieldInsn = (FieldInsnNode) insn; if (!(fieldInsn.owner.equals("cpw/mods/fml/common/registry/GameData") && fieldInsn.name.equals("iItemRegistry") && fieldInsn.desc.equals("Lcpw/mods/fml/common/registry/FMLControlledNamespacedRegistry;"))) continue; - iter.previous(); - iter.previous(); iter.remove(); - iter.next(); + { + val testInsn = iter.previous(); + if (testInsn.getOpcode() != Opcodes.ALOAD || ((VarInsnNode)testInsn).var != 0) + throw new AsmTransformException("Opcode assertion 1 failed!"); + } iter.remove(); - iter.next(); + { + val testInsn = iter.next(); + if (testInsn.getOpcode() != Opcodes.INVOKEVIRTUAL) + throw new AsmTransformException("Opcodes assertion 2 failed!"); + + val testInvoke = (MethodInsnNode)testInsn; + if (!testInvoke.owner.equals("cpw/mods/fml/common/registry/FMLControlledNamespacedRegistry") || + !testInvoke.name.equals("typeSafeIterable")) + throw new AsmTransformException("Opcodes assertion 3 failed!"); + } iter.remove(); iter.add(new VarInsnNode(Opcodes.ALOAD, 1)); iter.add(new VarInsnNode(Opcodes.ALOAD, 0));