Example usage for org.objectweb.asm.tree InsnList InsnList

List of usage examples for org.objectweb.asm.tree InsnList InsnList

Introduction

In this page you can find the example usage for org.objectweb.asm.tree InsnList InsnList.

Prototype

InsnList

Source Link

Usage

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