List of usage examples for org.objectweb.asm.tree InsnList InsnList
InsnList
From source file:me.themallard.bitmmo.impl.plugin.gamecontext.GameContextPlugin.java
License:Open Source License
private InsnList createContextCall(MethodNode mn, String contextCallName, String type) { InsnList list = new InsnList(); String desc = "(L" + type + ";)V)"; list.add(new VarInsnNode(ALOAD, 0)); list.add(new MethodInsnNode(INVOKESTATIC, "me/themallard/bitmmo/impl/plugin/gamecontext/GameContext", contextCallName, desc, false)); return list;//w ww . j a va 2 s . c o m }
From source file:me.themallard.bitmmo.impl.plugin.inputactiontracker.InputActionTrackerPlugin.java
License:Open Source License
private void createSetKeyDown(ClassNode cn) { InsnList insn = new InsnList(); MethodNode mn = new MethodNode(cn, ACC_PUBLIC, "setKeyDown", "(LHTMud/InputActionTracker$ActionType;Z)V", null, null);/*from w w w. ja va2s .c om*/ // ((Key) this.enumMap.get(actionType)).setKeyPressed(value); // aload0 // getfield this.enumMap Ljava/util/EnumMap; // aload1 // invokevirtual \ // java/util/EnumMap.get((Ljava/lang/Object;)Ljava/lang/Object;); // checkcast Key // aload2 // invokevirtual Key.setKeyPressed((Z)V); // return mn.visitMaxs(3, 3); insn.add(new VarInsnNode(ALOAD, 0)); FieldNode enumMap = cn.getField(null, "Ljava/util/EnumMap;"); insn.add(new FieldInsnNode(GETFIELD, cn.name, enumMap.name, enumMap.desc)); insn.add(new VarInsnNode(ALOAD, 1)); insn.add(new MethodInsnNode(INVOKEVIRTUAL, "java/util/EnumMap", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", false)); insn.add(new TypeInsnNode(CHECKCAST, "Key")); insn.add(new VarInsnNode(ILOAD, 2)); insn.add(new MethodInsnNode(INVOKEVIRTUAL, "Key", "setKeyPressed", "(Z)V", false)); insn.add(new InsnNode(RETURN)); mn.instructions.insert(insn); cn.methods.add(mn); }
From source file:me.themallard.bitmmo.impl.plugin.SimplePlugin.java
License:Open Source License
private void createInstances(ClassNode cn) { for (MethodNode mn : cn.methods) { if (!new PatternBuilder().add(new LdcElement(new LdcInsnNode("PulpCore-Destroyer"))).build() .contains(mn.instructions)) continue; for (String clazz : instancesCreate) { InsnList inject = new InsnList(); inject.add(new TypeInsnNode(Opcodes.NEW, clazz)); inject.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, clazz, "<init>", "()V", false)); mn.instructions.insertBefore(mn.instructions.get(0), inject); }/* w ww. j av a 2 s . c o m*/ } }
From source file:net.afterchat.mocap.MocapClassTransformer.java
License:Open Source License
public byte[] patchClassASM(String name, byte[] bytes) { ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(bytes); classReader.accept(classNode, 0);/*from w w w . j a va2 s. c om*/ Iterator<MethodNode> methods = classNode.methods.iterator(); while (methods.hasNext()) { MethodNode m = methods.next(); if ((m.name.equals("onBlockPlacedBy")) || (m.name.equals("a") && m.desc.equals("(Lahb;IIILsv;Ladd;)V"))) { logger.info("** MOCAP - Patching onBlockPlacedBy: " + m.name); AbstractInsnNode currentNode = null; Iterator<AbstractInsnNode> iter = m.instructions.iterator(); int index = -1; while (iter.hasNext()) { index++; currentNode = iter.next(); /** * Just prior to the original empty function return, inject code to trigger * our custom block place event. */ if (currentNode.getOpcode() == RETURN) { InsnList toInject = new InsnList(); toInject.add(new TypeInsnNode(NEW, "net/afterchat/mocap/LivingPlaceBlockEvent")); toInject.add(new InsnNode(DUP)); toInject.add(new VarInsnNode(ALOAD, 5)); toInject.add(new VarInsnNode(ALOAD, 6)); toInject.add(new VarInsnNode(ILOAD, 2)); toInject.add(new VarInsnNode(ILOAD, 3)); toInject.add(new VarInsnNode(ILOAD, 4)); toInject.add(new MethodInsnNode(INVOKESPECIAL, "net/afterchat/mocap/LivingPlaceBlockEvent", "<init>", "(Lnet/minecraft/entity/EntityLivingBase;Lnet/minecraft/item/ItemStack;III)V")); toInject.add(new VarInsnNode(ASTORE, 7)); toInject.add(new FieldInsnNode(GETSTATIC, "net/minecraftforge/common/MinecraftForge", "EVENT_BUS", "Lcpw/mods/fml/common/eventhandler/EventBus;")); toInject.add(new VarInsnNode(ALOAD, 7)); toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "cpw/mods/fml/common/eventhandler/EventBus", "post", "(Lcpw/mods/fml/common/eventhandler/Event;)Z")); toInject.add(new InsnNode(POP)); m.instructions.insertBefore(currentNode, toInject); } } } } ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); classNode.accept(writer); return writer.toByteArray(); }
From source file:net.cazzar.corelib.asm.MethodTransformer.java
License:Open Source License
/** * Transform the insn list for use in a obf environment * * @param insnList the instructions to fiddle with * * @return the new insnList/*from www . j av a 2 s. c o m*/ */ public InsnList transformInsns(InsnList insnList) { if (!CoreMod.getRuntimeDeobfuscationEnabled()) return insnList; InsnList insns = new InsnList(); for (ListIterator<AbstractInsnNode> i = insnList.iterator(); i.hasNext();) { AbstractInsnNode currNode = i.next(); if (currNode instanceof FieldInsnNode) { FieldInsnNode node = (FieldInsnNode) currNode; node.name = getMapping(node.name); } else if (currNode instanceof MethodInsnNode) { MethodInsnNode node = (MethodInsnNode) currNode; String mtd = getMapping(node.name); node.name = getMapping(node.name); } insns.add(currNode); } return insns; }
From source file:net.cazzar.corelib.asm.transformers.PositionedSoundRecord.java
License:Open Source License
@SuppressWarnings("OverlyLongMethod") @Override//from ww w. jav a2s .c om public void transform(ClassNode node, String transformedName) { MethodNode mtd = new MethodNode(ACC_PUBLIC, "hashCode", "()I", null, new String[0]); // mtd.name = "hashCode"; // mtd.desc = "()I"; InsnList insns = new InsnList(); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F")); insns.add(new InsnNode(FCONST_0)); insns.add(new InsnNode(FCMPL)); LabelNode l1 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l1)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false)); LabelNode l2 = new LabelNode(new Label()); insns.add(new JumpInsnNode(GOTO, l2)); insns.add(l1); insns.add(new FrameNode(F_SAME, 0, null, 0, null)); insns.add(new InsnNode(ICONST_0)); insns.add(l2); insns.add(new VarInsnNode(ISTORE, 1)); insns.add(new IntInsnNode(BIPUSH, 31)); insns.add(new VarInsnNode(ILOAD, 1)); insns.add(new InsnNode(IMUL)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F")); insns.add(new InsnNode(FCONST_0)); insns.add(new InsnNode(FCMPL)); LabelNode l5 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l5)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false)); LabelNode l6 = new LabelNode(new Label()); insns.add(new JumpInsnNode(GOTO, l6)); insns.add(l5); insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER })); insns.add(new InsnNode(ICONST_0)); insns.add(l6); insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER }, 2, new Object[] { INTEGER, INTEGER })); insns.add(new InsnNode(IADD)); insns.add(new VarInsnNode(ISTORE, 1)); insns.add(new IntInsnNode(BIPUSH, 31)); insns.add(new VarInsnNode(ILOAD, 1)); insns.add(new InsnNode(IMUL)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F")); insns.add(new InsnNode(FCONST_0)); insns.add(new InsnNode(FCMPL)); LabelNode l8 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l8)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false)); LabelNode l9 = new LabelNode(new Label()); insns.add(new JumpInsnNode(GOTO, l9)); insns.add(l8); insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER })); insns.add(new InsnNode(ICONST_0)); insns.add(l9); insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER }, 2, new Object[] { INTEGER, INTEGER })); insns.add(new InsnNode(IADD)); insns.add(new VarInsnNode(ISTORE, 1)); insns.add(new IntInsnNode(BIPUSH, 31)); insns.add(new VarInsnNode(ILOAD, 1)); insns.add(new InsnNode(IMUL)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F")); insns.add(new InsnNode(FCONST_0)); insns.add(new InsnNode(FCMPL)); LabelNode l11 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l11)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false)); LabelNode l12 = new LabelNode(new Label()); insns.add(new JumpInsnNode(GOTO, l12)); insns.add(l11); insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER })); insns.add(new InsnNode(ICONST_0)); insns.add(l12); insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER }, 2, new Object[] { INTEGER, INTEGER })); insns.add(new InsnNode(IADD)); insns.add(new VarInsnNode(ISTORE, 1)); insns.add(new IntInsnNode(BIPUSH, 31)); insns.add(new VarInsnNode(ILOAD, 1)); insns.add(new InsnNode(IMUL)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F")); insns.add(new InsnNode(FCONST_0)); insns.add(new InsnNode(FCMPL)); LabelNode l14 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l14)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false)); LabelNode l15 = new LabelNode(new Label()); insns.add(new JumpInsnNode(GOTO, l15)); insns.add(l14); insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER })); insns.add(new InsnNode(ICONST_0)); insns.add(l15); insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER }, 2, new Object[] { INTEGER, INTEGER })); insns.add(new InsnNode(IADD)); insns.add(new VarInsnNode(ISTORE, 1)); insns.add(new IntInsnNode(BIPUSH, 31)); insns.add(new VarInsnNode(ILOAD, 1)); insns.add(new InsnNode(IMUL)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "repeat", "Z")); LabelNode l17 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l17)); insns.add(new InsnNode(ICONST_1)); LabelNode l18 = new LabelNode(new Label()); insns.add(new JumpInsnNode(GOTO, l18)); insns.add(l17); insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER })); insns.add(new InsnNode(ICONST_0)); insns.add(l18); insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER }, 2, new Object[] { INTEGER, INTEGER })); insns.add(new InsnNode(IADD)); insns.add(new VarInsnNode(ISTORE, 1)); insns.add(new IntInsnNode(BIPUSH, 31)); insns.add(new VarInsnNode(ILOAD, 1)); insns.add(new InsnNode(IMUL)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I")); insns.add(new InsnNode(IADD)); insns.add(new VarInsnNode(ISTORE, 1)); insns.add(new IntInsnNode(BIPUSH, 31)); insns.add(new VarInsnNode(ILOAD, 1)); insns.add(new InsnNode(IMUL)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i", "Lnet/minecraft/client/audio/ISound$AttenuationType;")); insns.add(new MethodInsnNode(INVOKEVIRTUAL, "net/minecraft/client/audio/ISound$AttenuationType", "hashCode", "()I", false)); insns.add(new InsnNode(IADD)); insns.add(new VarInsnNode(ISTORE, 1)); insns.add(new VarInsnNode(ILOAD, 1)); insns.add(new InsnNode(IRETURN)); mtd.instructions.add(transformInsns(insns)); node.methods.add(mtd); mtd = new MethodNode(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, new String[0]); insns = new InsnList(); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new VarInsnNode(ALOAD, 1)); l1 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IF_ACMPNE, l1)); insns.add(new InsnNode(ICONST_1)); insns.add(new InsnNode(IRETURN)); insns.add(l1); insns.add(new FrameNode(F_SAME, 0, null, 0, null)); insns.add(new VarInsnNode(ALOAD, 1)); insns.add(new TypeInsnNode(INSTANCEOF, "net/minecraft/client/audio/PositionedSound")); l2 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFNE, l2)); insns.add(new InsnNode(ICONST_0)); insns.add(new InsnNode(IRETURN)); insns.add(l2); insns.add(new FrameNode(F_SAME, 0, null, 0, null)); insns.add(new VarInsnNode(ALOAD, 1)); insns.add(new TypeInsnNode(CHECKCAST, "net/minecraft/client/audio/PositionedSound")); insns.add(new VarInsnNode(ASTORE, 2)); insns.add(new VarInsnNode(ALOAD, 2)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F")); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false)); LabelNode l4 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l4)); insns.add(new InsnNode(ICONST_0)); insns.add(new InsnNode(IRETURN)); insns.add( new FrameNode(F_APPEND, 1, new Object[] { "net/minecraft/client/audio/PositionedSound" }, 0, null)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I")); insns.add(new VarInsnNode(ALOAD, 2)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I")); l5 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IF_ICMPEQ, l5)); insns.add(new InsnNode(ICONST_0)); insns.add(new InsnNode(IRETURN)); insns.add(l5); insns.add(new FrameNode(F_SAME, 0, null, 0, null)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F")); insns.add(new VarInsnNode(ALOAD, 2)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false)); LabelNode l7 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l7)); insns.add(new InsnNode(ICONST_0)); insns.add(new InsnNode(IRETURN)); insns.add(l7); insns.add(new FrameNode(F_SAME, 0, null, 0, null)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F")); insns.add(new VarInsnNode(ALOAD, 2)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false)); l7 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l7)); insns.add(new InsnNode(ICONST_0)); insns.add(new InsnNode(IRETURN)); insns.add(l7); insns.add(new FrameNode(F_SAME, 0, null, 0, null)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F")); insns.add(new VarInsnNode(ALOAD, 2)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false)); l7 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l7)); insns.add(new InsnNode(ICONST_0)); insns.add(new InsnNode(IRETURN)); insns.add(l7); insns.add(new FrameNode(F_SAME, 0, null, 0, null)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F")); insns.add(new VarInsnNode(ALOAD, 2)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F")); insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false)); l7 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IFEQ, l7)); insns.add(new InsnNode(ICONST_0)); insns.add(new InsnNode(IRETURN)); insns.add(l7); // insns.add(new FrameNode(F_SAME, 0, null, 0, null)); // insns.add(new VarInsnNode(ALOAD, 0)); // insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147664_a", "Lnet/minecraft/util/ResourceLocation;")); // insns.add(new VarInsnNode(ALOAD, 2)); // insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147664_a", "Lnet/minecraft/util/ResourceLocation;")); // insns.add(new MethodInsnNode(INVOKEVIRTUAL, "net/minecraft/util/ResourceLocation", "equals", "(Ljava/lang/Object;)Z")); // l7 = new LabelNode(new Label()); // insns.add(new JumpInsnNode(IFNE, l7)); // insns.add(new InsnNode(ICONST_0)); // insns.add(new InsnNode(IRETURN)); // insns.add(l7 ); insns.add(new FrameNode(F_SAME, 0, null, 0, null)); insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i", "Lnet/minecraft/client/audio/ISound$AttenuationType;")); insns.add(new VarInsnNode(ALOAD, 2)); insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i", "Lnet/minecraft/client/audio/ISound$AttenuationType;")); l7 = new LabelNode(new Label()); insns.add(new JumpInsnNode(IF_ACMPEQ, l7)); insns.add(new InsnNode(ICONST_0)); insns.add(new InsnNode(IRETURN)); insns.add(l7); insns.add(new InsnNode(ICONST_1)); insns.add(new InsnNode(IRETURN)); mtd.instructions.add(transformInsns(insns)); }
From source file:net.doubledoordev.inventorylock.asm.Transformer.java
License:Open Source License
@Override public byte[] transform(String name, String transformedName, byte[] basicClass) { ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(basicClass); classReader.accept(classNode, READER_FLAGS); boolean isPlayer = transformedName.equals(ENTITY_PLAYER_OWNER_NAME); if (isPlayer) LOGGER.info("Found EntityPlayer"); for (MethodNode method : classNode.methods) { InsnList list = method.instructions; if (isPlayer && INSTANCE.mapMethodDesc(method.desc).equals(ENTITY_PLAYER_DESC) && INSTANCE.mapMethodName(name, method.name, method.desc).equals(ENTITY_PLAYER_TARGET)) { final LabelNode newLabel = new LabelNode(); LOGGER.info("Found canOpen"); AbstractInsnNode node = list.getFirst(); while (node.getOpcode() != IRETURN && node != list.getLast()) { if (node.getOpcode() == IFEQ) ((JumpInsnNode) node).label = newLabel; node = node.getNext();//from w w w. j av a 2 s . co m } if (node.getOpcode() != IRETURN) throw new RuntimeException("ASM failed. (return not found)"); final AbstractInsnNode target = node; while (node.getType() != LABEL && node != list.getLast()) node = node.getNext(); if (node.getType() != LABEL) throw new RuntimeException("ASM failed. (label not found)"); final LabelNode label = ((LabelNode) node); //Adding "else if (code instanceof BetterLockCode) return ((BetterLockCode) code).contains(this.getUniqueID());" InsnList inject = new InsnList(); inject.add(newLabel); inject.add(new VarInsnNode(ALOAD, 1)); inject.add(new TypeInsnNode(INSTANCEOF, BETTER_LOCK_TYPE)); inject.add(new JumpInsnNode(IFEQ, label)); inject.add(new VarInsnNode(ALOAD, 1)); inject.add(new TypeInsnNode(CHECKCAST, BETTER_LOCK_TYPE)); inject.add(new VarInsnNode(ALOAD, 0)); //inject.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, ENTITY_PLAYER_OWNER, ENTITY_PLAYER_GET_UUID, ENTITY_PLATER_GET_UUID_DESC, false)); inject.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, BETTER_LOCK_TYPE, BETTER_LOCK_CONTAINS, BETTER_LOCK_CONTAINS_DESC, false)); inject.add(new InsnNode(IRETURN)); list.insert(target, inject); LOGGER.info("Injected elseif into EntityPlayer's canOpen"); } for (AbstractInsnNode node = list.getFirst(); node != list.getLast(); node = node.getNext()) { if (node.getOpcode() != INVOKESTATIC) continue; MethodInsnNode methodInsnNode = ((MethodInsnNode) node); // if (transformedName.equals("net.minecraft.tileentity.TileEntityLockable")) // LOGGER.info("In {} ({}) Method {}.{}{} Translated {}.{}{}", name, transformedName, // methodInsnNode.owner, methodInsnNode.name, methodInsnNode.desc, // INSTANCE.map(methodInsnNode.owner), INSTANCE.mapMethodName(methodInsnNode.owner, methodInsnNode.name, methodInsnNode.desc), INSTANCE.mapMethodDesc(methodInsnNode.desc).equals(LOCK_CODE_DESC)); if (INSTANCE.map(methodInsnNode.owner).equals(LOCK_CODE_OWNER) && INSTANCE.mapMethodDesc(methodInsnNode.desc).equals(LOCK_CODE_DESC) && INSTANCE.mapMethodName(methodInsnNode.owner, methodInsnNode.name, methodInsnNode.desc) .equals(LOCK_CODE_TARGET)) { methodInsnNode.owner = LOCK_CODE_OWNER_REPLACE; methodInsnNode.name = LOCK_CODE_NAME; LOGGER.info("Replaced call in class {} ({}), method {}{}", name, transformedName, method.name, method.desc); } } } final ClassWriter writer = new ClassWriter(WRITER_FLAGS); classNode.accept(writer); return writer.toByteArray(); }
From source file:net.dries007.tfctweaks.asm.FluidRegistryCT.java
License:Open Source License
private byte[] magic(byte[] bytes) { FMLLog.info("Found the FluidRegistry class..."); ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(bytes); classReader.accept(classNode, 0);/*from w w w.ja v a 2 s . c o m*/ for (MethodNode m : classNode.methods) { if (m.name.equals("<clinit>") && m.desc.equals("()V")) { FMLLog.info("Found the <clinit> method..."); ListIterator<AbstractInsnNode> i = m.instructions.iterator(); while (i.hasNext()) { AbstractInsnNode node = i.next(); if (!(node instanceof FieldInsnNode) || node.getOpcode() != GETSTATIC) continue; FieldInsnNode fieldInsnNode = ((FieldInsnNode) node); if (!fieldInsnNode.owner.equals("net/minecraftforge/fluids/FluidRegistry")) continue; if (!fieldInsnNode.name.equals("WATER") && !fieldInsnNode.name.equals("LAVA")) continue; if (!fieldInsnNode.desc.equals("Lnet/minecraftforge/fluids/Fluid;")) continue; node = i.next(); if (!(node instanceof MethodInsnNode) || node.getOpcode() != INVOKESTATIC) continue; MethodInsnNode methodInsnNode = ((MethodInsnNode) node); if (!methodInsnNode.owner.equals("net/minecraftforge/fluids/FluidRegistry")) continue; if (!methodInsnNode.name.equals("registerFluid")) continue; if (!methodInsnNode.desc.equals("(Lnet/minecraftforge/fluids/Fluid;)Z")) continue; node = i.next(); if (!(node instanceof InsnNode) || node.getOpcode() != POP) continue; InsnNode insnNode = ((InsnNode) node); m.instructions.remove(fieldInsnNode); m.instructions.remove(methodInsnNode); m.instructions.remove(insnNode); FMLLog.info("[FluidRegistryCT] Removed the " + fieldInsnNode.name + " registration."); done++; } } else if (m.name.equals("getFluid") && m.desc.equals("(Ljava/lang/String;)Lnet/minecraftforge/fluids/Fluid;")) { FMLLog.info("Found the getFluid method..."); InsnList insnList = new InsnList(); { LabelNode labelFirstIf = new LabelNode(); insnList.add(new FieldInsnNode(GETSTATIC, "net/dries007/tfctweaks/util/FluidHacks", "makeAllWaterFTCWater", "Z")); insnList.add(new JumpInsnNode(IFEQ, labelFirstIf)); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new LdcInsnNode("water")); insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false)); insnList.add(new JumpInsnNode(IFEQ, labelFirstIf)); insnList.add(new FieldInsnNode(GETSTATIC, "com/bioxx/tfc/api/TFCFluids", "FRESHWATER", "Lnet/minecraftforge/fluids/Fluid;")); insnList.add(new InsnNode(ARETURN)); insnList.add(labelFirstIf); } { LabelNode lableSecondIf = new LabelNode(); insnList.add(new FieldInsnNode(GETSTATIC, "net/dries007/tfctweaks/util/FluidHacks", "makeAllLavaFTCLava", "Z")); insnList.add(new JumpInsnNode(IFEQ, lableSecondIf)); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new LdcInsnNode("lava")); insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false)); insnList.add(new JumpInsnNode(IFEQ, lableSecondIf)); insnList.add(new FieldInsnNode(GETSTATIC, "com/bioxx/tfc/api/TFCFluids", "LAVA", "Lnet/minecraftforge/fluids/Fluid;")); insnList.add(new InsnNode(ARETURN)); insnList.add(lableSecondIf); } m.instructions.insertBefore(m.instructions.getFirst(), insnList); FMLLog.info("[FluidRegistryCT] Edited getFluid(String) : Fluid."); done++; } else if (m.name.equals("isFluidRegistered")) { if (m.desc.equals("(Lnet/minecraftforge/fluids/Fluid;)Z")) { InsnList insnList = new InsnList(); LabelNode falseLabel = new LabelNode(); LabelNode trueLabel = new LabelNode(); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new JumpInsnNode(IFNULL, falseLabel)); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "net/minecraftforge/fluids/Fluid", "getName", "()Ljava/lang/String;", false)); insnList.add(new MethodInsnNode(INVOKESTATIC, "net/minecraftforge/fluids/FluidRegistry", "isFluidRegistered", "(Ljava/lang/String;)Z", false)); insnList.add(new JumpInsnNode(IFEQ, falseLabel)); insnList.add(new InsnNode(ICONST_1)); insnList.add(new JumpInsnNode(GOTO, trueLabel)); insnList.add(falseLabel); insnList.add(new InsnNode(ICONST_0)); insnList.add(trueLabel); insnList.add(new InsnNode(IRETURN)); // replace entire method m.instructions.clear(); m.instructions.add(insnList); FMLLog.info("[FluidRegistryCT] Edited isFluidRegistered(Fluid) : bool."); done++; } else if (m.desc.equals("(Ljava/lang/String;)Z")) { InsnList insnList = new InsnList(); LabelNode trueLabel = new LabelNode(); insnList.add(new LdcInsnNode("water")); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false)); insnList.add(new JumpInsnNode(IFNE, trueLabel)); insnList.add(new LdcInsnNode("lava")); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false)); insnList.add(new JumpInsnNode(IFNE, trueLabel)); insnList.add(new FieldInsnNode(GETSTATIC, "net/minecraftforge/fluids/FluidRegistry", "fluids", "Lcom/google/common/collect/BiMap;")); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new MethodInsnNode(INVOKEINTERFACE, "com/google/common/collect/BiMap", "containsKey", "(Ljava/lang/Object;)Z", true)); LabelNode falseLabel = new LabelNode(); insnList.add(new JumpInsnNode(IFEQ, falseLabel)); insnList.add(trueLabel); insnList.add(new InsnNode(ICONST_1)); LabelNode returnLabel = new LabelNode(); insnList.add(new JumpInsnNode(GOTO, returnLabel)); insnList.add(falseLabel); insnList.add(new InsnNode(ICONST_0)); insnList.add(returnLabel); insnList.add(new InsnNode(IRETURN)); // replace entire method m.instructions.clear(); m.instructions.add(insnList); FMLLog.info("[FluidRegistryCT] Edited isFluidRegistered(String) : bool."); done++; } } else if (m.name.equals("getFluidStack")) { LabelNode notNullNode = null; { // Grab first jump node label ListIterator<AbstractInsnNode> i = m.instructions.iterator(); while (i.hasNext()) { AbstractInsnNode node = i.next(); if (node.getOpcode() == IFNE) { notNullNode = ((JumpInsnNode) node).label; break; } } } InsnList insnList = new InsnList(); insnList.add(new LdcInsnNode("water")); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false)); insnList.add(new JumpInsnNode(IFNE, notNullNode)); insnList.add(new LdcInsnNode("lava")); insnList.add(new VarInsnNode(ALOAD, 0)); insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false)); insnList.add(new JumpInsnNode(IFNE, notNullNode)); // add to the beginning of the list, leave the rest of the method in place. m.instructions.insert(insnList); FMLLog.info("[FluidRegistryCT] Edited getFluidStack(String, int) : FluidStack."); done++; } } if (done != DONE) { FMLLog.severe( "\n######################################################################################\n" + "######################################################################################\n" + "######################################################################################\n" + "OUR ASM FLUID HACK FAILED! PLEASE MAKE AN ISSUE REPORT ON GITHUB WITH A COMPLETE MODLIST! https://github.com/dries007/TFC-Tweaks\n" + "Done %d out of %d ASM tweaks on class FluidRegistry\n" + "########################################################################################\n" + "########################################################################################\n" + "########################################################################################\n\n", done, DONE); } ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES); classNode.accept(writer); return writer.toByteArray(); }
From source file:net.enilink.composition.asm.util.InsnListGenerator.java
License:Open Source License
public InsnList pushInsns() { if (stack == null) { stack = new Stack<InsnList>(); }/* w ww .j a v a 2 s. c om*/ stack.push(instructions); instructions = new InsnList(); return instructions; }
From source file:net.epoxide.surge.asm.InstructionComparator.java
License:Creative Commons License
public static InsnList getImportantList(InsnList list) { if (list.size() == 0) return list; final HashMap<LabelNode, LabelNode> labels = new HashMap<LabelNode, LabelNode>(); for (AbstractInsnNode insn = list.getFirst(); insn != null; insn = insn.getNext()) if (insn instanceof LabelNode) labels.put((LabelNode) insn, (LabelNode) insn); final InsnList importantNodeList = new InsnList(); for (AbstractInsnNode insn = list.getFirst(); insn != null; insn = insn.getNext()) { if (insn instanceof LabelNode || insn instanceof LineNumberNode) continue; importantNodeList.add(insn.clone(labels)); }/*from w w w .j a v a 2 s . c o m*/ return importantNodeList; }