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

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

Introduction

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

Prototype

public LdcInsnNode(final Object value) 

Source Link

Document

Constructs a new LdcInsnNode .

Usage

From source file:blockphysics.asm.BPTransformer.java

License:Open Source License

private byte[] transformTileEntityPiston(byte[] bytes) {
    /*try// www.j  a v  a2s  .c  o m
    {
        FileOutputStream fos = new FileOutputStream("d:/TileEntityPiston.orig.class");
        fos.write(bytes);
      fos.close();
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }*/

    System.out.print("[BlockPhysics] Patching TileEntityPiston.class ........");

    boolean ok = false, ok2 = false, ok3 = false, ok4 = false, ok5 = false;
    ClassNode classNode = new ClassNode();
    ClassReader classReader = new ClassReader(bytes);
    classReader.accept(classNode, 0);

    MethodNode m;
    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        m = methods.next();
        if (m.name.equals("<init>") && m.desc.equals("(IIIZZ)V")) {
            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    InsnList toInject = new InsnList();
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ACONST_NULL));
                    toInject.add(new FieldInsnNode(PUTFIELD, "ast", "movingBlockTileEntityData", "Lbx;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "ast", "bpmeta", "I"));

                    m.instructions.insertBefore(m.instructions.get(index), toInject);

                    ok = true;
                    break;
                }
            }
        } else if (m.name.equals("f") && m.desc.equals("()V")) {
            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == INVOKEVIRTUAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("abv")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("g")
                        && ((MethodInsnNode) m.instructions.get(index)).desc.equals("(IIII)V")) {
                    InsnList toInject = new InsnList();

                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "k", "Labv;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "l", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "m", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "n", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "bpmeta", "I"));
                    toInject.add(new MethodInsnNode(INVOKESTATIC, "blockphysics/BlockPhysics", "setBlockBPdata",
                            "(Labv;IIII)Z"));
                    toInject.add(new InsnNode(POP));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "movingBlockTileEntityData", "Lbx;"));
                    LabelNode l1 = new LabelNode();
                    toInject.add(new JumpInsnNode(IFNULL, l1));
                    toInject.add(new FieldInsnNode(GETSTATIC, "aqw", "s", "[Laqw;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "a", "I"));
                    toInject.add(new InsnNode(AALOAD));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "k", "Labv;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "b", "I"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "aqw", "createTileEntity", "(Labv;I)Lasm;"));
                    toInject.add(new VarInsnNode(ASTORE, 1));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "movingBlockTileEntityData", "Lbx;"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "asm", "a", "(Lbx;)V"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "k", "Labv;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "l", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "m", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "n", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "abv", "a", "(IIILasm;)V"));
                    toInject.add(l1);

                    m.instructions.insert(m.instructions.get(index), toInject);

                    ok2 = true;
                    break;
                }
            }
        } else if (m.name.equals("a") && m.desc.equals("(Lbx;)V")) {
            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    InsnList toInject = new InsnList();
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "b", "(Ljava/lang/String;)Z"));
                    LabelNode l1 = new LabelNode();
                    toInject.add(new JumpInsnNode(IFEQ, l1));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "c", "(Ljava/lang/String;)B"));
                    toInject.add(new FieldInsnNode(PUTFIELD, "ast", "bpmeta", "I"));
                    toInject.add(l1);
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("TileEntityData"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "b", "(Ljava/lang/String;)Z"));
                    LabelNode l0 = new LabelNode();
                    toInject.add(new JumpInsnNode(IFEQ, l0));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("TileEntityData"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "l", "(Ljava/lang/String;)Lbx;"));
                    toInject.add(new FieldInsnNode(PUTFIELD, "ast", "movingBlockTileEntityData", "Lbx;"));
                    toInject.add(l0);

                    m.instructions.insertBefore(m.instructions.get(index), toInject);

                    ok3 = true;
                    break;
                }
            }
        } else if (m.name.equals("b") && m.desc.equals("(Lbx;)V")) {
            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    InsnList toInject = new InsnList();
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "bpmeta", "I"));
                    toInject.add(new InsnNode(I2B));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "a", "(Ljava/lang/String;B)V"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "movingBlockTileEntityData", "Lbx;"));
                    LabelNode l0 = new LabelNode();
                    toInject.add(new JumpInsnNode(IFNULL, l0));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("TileEntityData"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "movingBlockTileEntityData", "Lbx;"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "a", "(Ljava/lang/String;Lbx;)V"));
                    toInject.add(l0);

                    m.instructions.insertBefore(m.instructions.get(index), toInject);

                    ok4 = true;
                    break;
                }
            }
        } else if (m.name.equals("h") && m.desc.equals("()V")) {
            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == INVOKEVIRTUAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("abv")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("g")
                        && ((MethodInsnNode) m.instructions.get(index)).desc.equals("(IIII)V")) {
                    InsnList toInject = new InsnList();

                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "k", "Labv;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "l", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "m", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "n", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "bpmeta", "I"));
                    toInject.add(new MethodInsnNode(INVOKESTATIC, "blockphysics/BlockPhysics", "setBlockBPdata",
                            "(Labv;IIII)Z"));
                    toInject.add(new InsnNode(POP));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "movingBlockTileEntityData", "Lbx;"));
                    LabelNode l0 = new LabelNode();
                    toInject.add(new JumpInsnNode(IFNULL, l0));
                    toInject.add(new FieldInsnNode(GETSTATIC, "aqw", "s", "[Laqw;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "a", "I"));
                    toInject.add(new InsnNode(AALOAD));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "k", "Labv;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "b", "I"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "aqw", "createTileEntity", "(Labv;I)Lasm;"));
                    toInject.add(new VarInsnNode(ASTORE, 1));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "movingBlockTileEntityData", "Lbx;"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "asm", "a", "(Lbx;)V"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "k", "Labv;"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "l", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "m", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "ast", "n", "I"));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "abv", "a", "(IIILasm;)V"));
                    toInject.add(l0);

                    m.instructions.insert(m.instructions.get(index), toInject);

                    ok5 = true;
                    break;
                }
            }
        }
    }

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(cw);

    if (ok && ok2 && ok3 && ok4 && ok5)
        System.out.println("OK");
    else
        System.out.println("Failed." + ok + ok2 + ok3 + ok4 + ok5);

    FieldVisitor fv;

    fv = cw.visitField(ACC_PUBLIC, "movingBlockTileEntityData", "Lbx;", null, null);
    fv.visitEnd();

    fv = cw.visitField(ACC_PUBLIC, "bpmeta", "I", null, null);
    fv.visitEnd();

    cw.visitEnd();

    /*try
    {
       FileOutputStream fos = new FileOutputStream("d:/TileEntityPiston.mod.class");
       fos.write(cw.toByteArray());
     fos.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }*/

    return cw.toByteArray();
}

From source file:blockphysics.asm.BPTransformer.java

License:Open Source License

private byte[] transformAnvilChunkLoader(byte[] bytes) {
    /*try//ww w . j a  v a 2s.co m
     {
         FileOutputStream fos = new FileOutputStream("d:/AnvilChunkLoader.orig.class");
         fos.write(bytes);
       fos.close();
     } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }*/

    System.out.print("[BlockPhysics] Patching AnvilChunkLoader.class ........");

    boolean ok = false, ok2 = false, ok3 = false, ok4 = false, ok6 = false, ok7 = false;
    ClassNode classNode = new ClassNode();
    ClassReader classReader = new ClassReader(bytes);
    classReader.accept(classNode, 0);

    MethodNode m;
    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        m = methods.next();
        if (m.name.equals("a") && m.desc.equals("(Ladq;Labv;Lbx;)V")) {
            int var1 = 9;
            for (int index = 0; index < m.instructions.size(); index++) {
                if (ok3)
                    break;
                if (m.instructions.get(index).getOpcode() == INVOKESPECIAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("bx")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("<init>")
                        && ((MethodInsnNode) m.instructions.get(index)).desc.equals("()V")) {
                    for (int index2 = index; index2 < m.instructions.size(); index2++) {
                        if (m.instructions.get(index2).getOpcode() == ASTORE) {
                            var1 = ((VarInsnNode) m.instructions.get(index2)).var;
                            ok3 = true;
                            break;
                        }
                    }
                }
            }

            int var2 = 11;
            for (int index = 0; index < m.instructions.size(); index++) {
                if (ok4)
                    break;
                if (m.instructions.get(index).getType() == AbstractInsnNode.LDC_INSN
                        && ((LdcInsnNode) m.instructions.get(index)).cst.equals("Data")) {
                    for (int index2 = index; index2 < m.instructions.size(); index2++) {
                        if (m.instructions.get(index2).getOpcode() == ALOAD) {
                            var2 = ((VarInsnNode) m.instructions.get(index2)).var;
                            ok4 = true;
                            break;
                        }
                    }
                }
            }

            for (int index = 0; index < m.instructions.size(); index++) {
                if (m.instructions.get(index).getOpcode() == INVOKEVIRTUAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("cf")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("a")
                        && ((MethodInsnNode) m.instructions.get(index)).desc.equals("(Lck;)V")) {
                    InsnList toInject = new InsnList();

                    toInject.add(new VarInsnNode(ALOAD, var1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new VarInsnNode(ALOAD, var2));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "adr", "getBPdataArray", "()[B"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "a", "(Ljava/lang/String;[B)V"));

                    m.instructions.insertBefore(m.instructions.get(index - 2), toInject);

                    ok = true;
                    break;
                }
            }
        } else if (m.name.equals("a") && m.desc.equals("(Labv;Lbx;)Ladq;")) {
            int var1 = 11;
            for (int index = 0; index < m.instructions.size(); index++) {

                if (ok6)
                    break;
                if (m.instructions.get(index).getOpcode() == INVOKEVIRTUAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("cf")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("b")
                        && ((MethodInsnNode) m.instructions.get(index)).desc.equals("(I)Lck;")) {
                    for (int index2 = index; index2 < m.instructions.size(); index2++) {
                        if (m.instructions.get(index2).getOpcode() == ASTORE) {
                            var1 = ((VarInsnNode) m.instructions.get(index2)).var;
                            ok6 = true;
                            break;
                        }
                    }
                }
            }

            int var2 = 13;
            for (int index = 0; index < m.instructions.size(); index++) {
                if (ok7)
                    break;
                if (m.instructions.get(index).getOpcode() == INVOKESPECIAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("adr")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("<init>")
                        && ((MethodInsnNode) m.instructions.get(index)).desc.equals("(IZ)V")) {
                    for (int index2 = index; index2 < m.instructions.size(); index2++) {
                        if (m.instructions.get(index2).getOpcode() == ASTORE) {
                            var2 = ((VarInsnNode) m.instructions.get(index2)).var;
                            ok7 = true;
                            break;
                        }
                    }
                }
            }

            for (int index = 0; index < m.instructions.size(); index++) {
                if (m.instructions.get(index).getOpcode() == INVOKEVIRTUAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("adr")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("e")
                        && ((MethodInsnNode) m.instructions.get(index)).desc.equals("()V")) {
                    InsnList toInject = new InsnList();

                    toInject.add(new VarInsnNode(ALOAD, var1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "b", "(Ljava/lang/String;)Z"));
                    LabelNode l6 = new LabelNode();
                    toInject.add(new JumpInsnNode(IFEQ, l6));
                    toInject.add(new VarInsnNode(ALOAD, var2));
                    toInject.add(new VarInsnNode(ALOAD, var1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "j", "(Ljava/lang/String;)[B"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "adr", "setBPdataArray", "([B)V"));
                    LabelNode l7 = new LabelNode();
                    toInject.add(new JumpInsnNode(GOTO, l7));
                    toInject.add(l6);
                    toInject.add(new FrameNode(Opcodes.F_SAME, 0, null, 0, null));
                    toInject.add(new VarInsnNode(ALOAD, var2));
                    toInject.add(new IntInsnNode(SIPUSH, 4096));
                    toInject.add(new IntInsnNode(NEWARRAY, T_BYTE));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "adr", "setBPdataArray", "([B)V"));
                    toInject.add(l7);

                    m.instructions.insertBefore(m.instructions.get(index - 1), toInject);

                    ok2 = true;
                    break;
                }
            }
        }
    }

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(cw);

    if (ok && ok2 && ok3 && ok4 && ok6 && ok7)
        System.out.println("OK");
    else
        System.out.println("Failed." + ok + ok2 + ok3 + ok4 + ok6 + ok7);

    /*try
    {
       FileOutputStream fos = new FileOutputStream("d:/AnvilChunkLoader.mod.class");
       fos.write(cw.toByteArray());
     fos.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }*/

    return cw.toByteArray();
}

From source file:blockphysics.asm.BPTransformer.java

License:Open Source License

private byte[] transformBlockPhysics(byte[] bytes) {
    /*try/*from  w w  w.  j a  v  a  2  s .c o  m*/
    {
        FileOutputStream fos = new FileOutputStream("d:/BlockPhysics.orig.class");
        fos.write(bytes);
      fos.close();
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }*/

    try {
        Class.forName("org.bukkit.Bukkit");
        System.out.println("[BlockPhysics] Bukkit detected.");
    } catch (ClassNotFoundException e) {
        return bytes;
    }

    System.out.print("[BlockPhysics] Patching BlockPhysics.class ............");

    boolean ok = false;
    ClassNode classNode = new ClassNode();
    ClassReader classReader = new ClassReader(bytes);
    classReader.accept(classNode, 0);

    MethodNode m;
    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        m = methods.next();
        if (m.name.equals("tickBlocksRandomMove") && m.desc.equals("(Ljr;)V")) {
            m.instructions.clear();
            m.localVariables.clear();

            InsnList toInject = new InsnList();

            toInject.add(new FieldInsnNode(GETSTATIC, "blockphysics/BlockPhysics", "skipMove", "Z"));
            LabelNode l0 = new LabelNode();
            toInject.add(new JumpInsnNode(IFEQ, l0));
            toInject.add(new InsnNode(RETURN));
            toInject.add(l0);
            toInject.add(new FrameNode(Opcodes.F_SAME, 0, null, 0, null));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new FieldInsnNode(GETFIELD, "jr", "G", "Lgnu/trove/map/hash/TLongShortHashMap;"));
            toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "gnu/trove/map/hash/TLongShortHashMap", "iterator",
                    "()Lgnu/trove/iterator/TLongShortIterator;"));
            toInject.add(new VarInsnNode(ASTORE, 1));
            LabelNode l1 = new LabelNode();
            toInject.add(l1);
            toInject.add(new FrameNode(Opcodes.F_APPEND, 1,
                    new Object[] { "gnu/trove/iterator/TLongShortIterator" }, 0, null));
            toInject.add(new VarInsnNode(ALOAD, 1));
            toInject.add(new MethodInsnNode(INVOKEINTERFACE, "gnu/trove/iterator/TLongShortIterator", "hasNext",
                    "()Z"));
            LabelNode l2 = new LabelNode();
            toInject.add(new JumpInsnNode(IFEQ, l2));
            toInject.add(new VarInsnNode(ALOAD, 1));
            toInject.add(new MethodInsnNode(INVOKEINTERFACE, "gnu/trove/iterator/TLongShortIterator", "advance",
                    "()V"));
            toInject.add(new VarInsnNode(ALOAD, 1));
            toInject.add(
                    new MethodInsnNode(INVOKEINTERFACE, "gnu/trove/iterator/TLongShortIterator", "key", "()J"));
            toInject.add(new VarInsnNode(LSTORE, 2));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new InsnNode(POP));
            toInject.add(new VarInsnNode(LLOAD, 2));
            toInject.add(new MethodInsnNode(INVOKESTATIC, "abv", "keyToX", "(J)I"));
            toInject.add(new VarInsnNode(ISTORE, 4));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new InsnNode(POP));
            toInject.add(new VarInsnNode(LLOAD, 2));
            toInject.add(new MethodInsnNode(INVOKESTATIC, "abv", "keyToZ", "(J)I"));
            toInject.add(new VarInsnNode(ISTORE, 5));
            toInject.add(new VarInsnNode(ILOAD, 4));
            toInject.add(new IntInsnNode(BIPUSH, 16));
            toInject.add(new InsnNode(IMUL));
            toInject.add(new VarInsnNode(ISTORE, 6));
            toInject.add(new VarInsnNode(ILOAD, 5));
            toInject.add(new IntInsnNode(BIPUSH, 16));
            toInject.add(new InsnNode(IMUL));
            toInject.add(new VarInsnNode(ISTORE, 7));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new VarInsnNode(ILOAD, 4));
            toInject.add(new VarInsnNode(ILOAD, 5));
            toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "jr", "e", "(II)Ladq;"));
            toInject.add(new VarInsnNode(ASTORE, 8));
            toInject.add(new VarInsnNode(ALOAD, 8));
            toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "adq", "i", "()[Ladr;"));
            toInject.add(new VarInsnNode(ASTORE, 12));
            toInject.add(new VarInsnNode(ALOAD, 12));
            toInject.add(new InsnNode(ARRAYLENGTH));
            toInject.add(new VarInsnNode(ISTORE, 9));
            toInject.add(new InsnNode(ICONST_0));
            toInject.add(new VarInsnNode(ISTORE, 10));
            LabelNode l3 = new LabelNode();
            toInject.add(l3);
            toInject.add(new FrameNode(Opcodes.F_FULL, 12,
                    new Object[] { "jr", "gnu/trove/iterator/TLongShortIterator", Opcodes.LONG, Opcodes.INTEGER,
                            Opcodes.INTEGER, Opcodes.INTEGER, Opcodes.INTEGER, "adq", Opcodes.INTEGER,
                            Opcodes.INTEGER, Opcodes.TOP, "[Ladr;" },
                    0, new Object[] {}));
            toInject.add(new VarInsnNode(ILOAD, 10));
            toInject.add(new VarInsnNode(ILOAD, 9));
            LabelNode l4 = new LabelNode();
            toInject.add(new JumpInsnNode(IF_ICMPGE, l4));
            toInject.add(new VarInsnNode(ALOAD, 12));
            toInject.add(new VarInsnNode(ILOAD, 10));
            toInject.add(new InsnNode(AALOAD));
            toInject.add(new VarInsnNode(ASTORE, 13));
            toInject.add(new VarInsnNode(ALOAD, 13));
            LabelNode l5 = new LabelNode();
            toInject.add(new JumpInsnNode(IFNULL, l5));
            toInject.add(new InsnNode(ICONST_0));
            toInject.add(new VarInsnNode(ISTORE, 14));
            LabelNode l6 = new LabelNode();
            toInject.add(l6);
            toInject.add(new FrameNode(Opcodes.F_APPEND, 2, new Object[] { "adr", Opcodes.INTEGER }, 0, null));
            toInject.add(new VarInsnNode(ILOAD, 14));
            toInject.add(new InsnNode(ICONST_3));
            toInject.add(new JumpInsnNode(IF_ICMPGE, l5));
            toInject.add(new FieldInsnNode(GETSTATIC, "blockphysics/BlockPhysics", "updateLCG", "I"));
            toInject.add(new InsnNode(ICONST_3));
            toInject.add(new InsnNode(IMUL));
            toInject.add(new LdcInsnNode(new Integer(1013904223)));
            toInject.add(new InsnNode(IADD));
            toInject.add(new FieldInsnNode(PUTSTATIC, "blockphysics/BlockPhysics", "updateLCG", "I"));
            toInject.add(new FieldInsnNode(GETSTATIC, "blockphysics/BlockPhysics", "updateLCG", "I"));
            toInject.add(new InsnNode(ICONST_2));
            toInject.add(new InsnNode(ISHR));
            toInject.add(new VarInsnNode(ISTORE, 11));
            toInject.add(new VarInsnNode(ILOAD, 11));
            toInject.add(new IntInsnNode(BIPUSH, 15));
            toInject.add(new InsnNode(IAND));
            toInject.add(new VarInsnNode(ISTORE, 15));
            toInject.add(new VarInsnNode(ILOAD, 11));
            toInject.add(new IntInsnNode(BIPUSH, 8));
            toInject.add(new InsnNode(ISHR));
            toInject.add(new IntInsnNode(BIPUSH, 15));
            toInject.add(new InsnNode(IAND));
            toInject.add(new VarInsnNode(ISTORE, 16));
            toInject.add(new VarInsnNode(ILOAD, 11));
            toInject.add(new IntInsnNode(BIPUSH, 16));
            toInject.add(new InsnNode(ISHR));
            toInject.add(new IntInsnNode(BIPUSH, 15));
            toInject.add(new InsnNode(IAND));
            toInject.add(new VarInsnNode(ISTORE, 17));
            toInject.add(new VarInsnNode(ALOAD, 13));
            toInject.add(new VarInsnNode(ILOAD, 15));
            toInject.add(new VarInsnNode(ILOAD, 17));
            toInject.add(new VarInsnNode(ILOAD, 16));
            toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "adr", "a", "(III)I"));
            toInject.add(new VarInsnNode(ISTORE, 18));
            toInject.add(new VarInsnNode(ALOAD, 13));
            toInject.add(new VarInsnNode(ILOAD, 15));
            toInject.add(new VarInsnNode(ILOAD, 17));
            toInject.add(new VarInsnNode(ILOAD, 16));
            toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "adr", "b", "(III)I"));
            toInject.add(new VarInsnNode(ISTORE, 19));
            toInject.add(new FieldInsnNode(GETSTATIC, "blockphysics/BlockPhysics", "blockSet",
                    "[[Lblockphysics/BlockDef;"));
            toInject.add(new VarInsnNode(ILOAD, 18));
            toInject.add(new InsnNode(AALOAD));
            toInject.add(new VarInsnNode(ILOAD, 19));
            toInject.add(new InsnNode(AALOAD));
            toInject.add(new FieldInsnNode(GETFIELD, "blockphysics/BlockDef", "randomtick", "Z"));
            LabelNode l7 = new LabelNode();
            toInject.add(new JumpInsnNode(IFEQ, l7));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new VarInsnNode(ILOAD, 15));
            toInject.add(new VarInsnNode(ILOAD, 6));
            toInject.add(new InsnNode(IADD));
            toInject.add(new VarInsnNode(ILOAD, 17));
            toInject.add(new VarInsnNode(ALOAD, 13));
            toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "adr", "d", "()I"));
            toInject.add(new InsnNode(IADD));
            toInject.add(new VarInsnNode(ILOAD, 16));
            toInject.add(new VarInsnNode(ILOAD, 7));
            toInject.add(new InsnNode(IADD));
            toInject.add(new VarInsnNode(ILOAD, 18));
            toInject.add(new VarInsnNode(ILOAD, 19));
            toInject.add(new InsnNode(ICONST_0));
            toInject.add(new MethodInsnNode(INVOKESTATIC, "blockphysics/BlockPhysics", "tryToMove",
                    "(Labv;IIIIIZ)Z"));
            toInject.add(new InsnNode(POP));
            toInject.add(l7);
            toInject.add(new FrameNode(Opcodes.F_FULL, 14,
                    new Object[] { "jr", "gnu/trove/iterator/TLongShortIterator", Opcodes.LONG, Opcodes.INTEGER,
                            Opcodes.INTEGER, Opcodes.INTEGER, Opcodes.INTEGER, "adq", Opcodes.INTEGER,
                            Opcodes.INTEGER, Opcodes.INTEGER, "[Ladr;", "adr", Opcodes.INTEGER },
                    0, new Object[] {}));
            toInject.add(new IincInsnNode(14, 1));
            toInject.add(new JumpInsnNode(GOTO, l6));
            toInject.add(l5);
            toInject.add(new FrameNode(Opcodes.F_FULL, 12,
                    new Object[] { "jr", "gnu/trove/iterator/TLongShortIterator", Opcodes.LONG, Opcodes.INTEGER,
                            Opcodes.INTEGER, Opcodes.INTEGER, Opcodes.INTEGER, "adq", Opcodes.INTEGER,
                            Opcodes.INTEGER, Opcodes.TOP, "[Ladr;" },
                    0, new Object[] {}));
            toInject.add(new IincInsnNode(10, 1));
            toInject.add(new JumpInsnNode(GOTO, l3));
            toInject.add(l4);
            toInject.add(new FrameNode(Opcodes.F_FULL, 2,
                    new Object[] { "jr", "gnu/trove/iterator/TLongShortIterator" }, 0, new Object[] {}));
            toInject.add(new JumpInsnNode(GOTO, l1));
            toInject.add(l2);
            toInject.add(new FrameNode(Opcodes.F_CHOP, 1, null, 0, null));
            toInject.add(new InsnNode(RETURN));

            m.instructions.add(toInject);

            ok = true;
            break;
        }
    }

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(cw);

    if (ok)
        System.out.println("OK");
    else
        System.out.println("Failed." + ok);

    /*try
    {
       FileOutputStream fos = new FileOutputStream("d:/BlockPhysics.class");
       fos.write(cw.toByteArray());
     fos.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }*/

    return cw.toByteArray();
}

From source file:blockphysics.asm.BPTransformer.java

License:Open Source License

private byte[] transformEntity(byte[] bytes) {
    /*try//from  w w w  .ja  v  a  2 s .c  om
    {
        FileOutputStream fos = new FileOutputStream("d:/Entity.orig.class");
        fos.write(bytes);
      fos.close();
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }*/

    System.out.print("[BlockPhysics] Patching Entity.class ..................");

    boolean ok = false;
    ClassNode classNode = new ClassNode();
    ClassReader classReader = new ClassReader(bytes);
    classReader.accept(classNode, 0);

    MethodNode m;
    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        m = methods.next();

        if (m.name.equals("C") && m.desc.equals("()V")) {
            for (int index = 0; index < m.instructions.size() - 1; index++) {
                if (m.instructions.get(index).getType() == AbstractInsnNode.LDC_INSN
                        && ((LdcInsnNode) m.instructions.get(index)).cst.equals(0.001D)) {
                    ok = true;
                    m.instructions.set(m.instructions.get(index), new LdcInsnNode(new Double("0.07")));
                }
            }
        }
    }

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(cw);

    if (ok)
        System.out.println("OK");
    else
        System.out.println("Failed." + ok);

    /*try
    {
       FileOutputStream fos = new FileOutputStream("d:/Entity.class");
       fos.write(cw.toByteArray());
     fos.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }*/

    return cw.toByteArray();
}

From source file:blockphysics.asm.BPTransformer.java

License:Open Source License

private byte[] transformEntityTNTPrimed(byte[] bytes) {
    /*try/*from  w w w. j  a  v a2s . c  o  m*/
    {
        FileOutputStream fos = new FileOutputStream("d:/EntityTNTPrimed.orig.class");
        fos.write(bytes);
      fos.close();
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }*/

    boolean bukkit = false;
    try {
        Class.forName("org.bukkit.Bukkit");
        System.out.println("[BlockPhysics] Bukkit detected.");
        bukkit = true;
    } catch (ClassNotFoundException e) {

    }

    System.out.print("[BlockPhysics] Patching EntityTNTPrimed.class .........");
    boolean ok = false, ok2 = false, ok5 = false, ok6 = false, ok7 = false, ok8 = false, ok9 = false,
            ok10 = false;

    ClassNode classNode = new ClassNode();
    ClassReader classReader = new ClassReader(bytes);
    classReader.accept(classNode, 0);

    classNode.superName = "sq";

    MethodNode m;
    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        m = methods.next();

        if (m.name.equals("<init>") && m.desc.equals("(Labv;)V")) {
            for (int index = 0; index < m.instructions.size(); index++) {
                if (m.instructions.get(index).getOpcode() == INVOKESPECIAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("nm")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("<init>")
                        && ((MethodInsnNode) m.instructions.get(index)).desc.equals("(Labv;)V")) {
                    m.instructions.set(m.instructions.get(index),
                            new MethodInsnNode(INVOKESPECIAL, "sq", "<init>", "(Labv;)V"));
                    ok = true;
                    break;
                }
            }
        } else if (m.name.equals("<init>") && m.desc.equals("(Labv;DDDLoe;)V")) {
            InsnList toInject = new InsnList();

            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new VarInsnNode(ALOAD, 1));
            toInject.add(new VarInsnNode(DLOAD, 2));
            toInject.add(new VarInsnNode(DLOAD, 4));
            toInject.add(new VarInsnNode(DLOAD, 6));
            toInject.add(new IntInsnNode(BIPUSH, 46));
            toInject.add(new InsnNode(ICONST_0));
            toInject.add(new MethodInsnNode(INVOKESPECIAL, "sq", "<init>", "(Labv;DDDII)V"));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new IntInsnNode(BIPUSH, 80));
            toInject.add(new FieldInsnNode(PUTFIELD, "tb", "a", "I"));

            if (bukkit) {
                toInject.add(new VarInsnNode(ALOAD, 0));
                toInject.add(new LdcInsnNode(new Float("4.0")));
                toInject.add(new FieldInsnNode(PUTFIELD, "tb", "yield", "F"));
                toInject.add(new VarInsnNode(ALOAD, 0));
                toInject.add(new InsnNode(ICONST_0));
                toInject.add(new FieldInsnNode(PUTFIELD, "tb", "isIncendiary", "Z"));
            }

            toInject.add(new InsnNode(RETURN));

            m.instructions.clear();
            m.localVariables.clear();
            m.instructions.add(toInject);

            ok2 = true;
        } else if (m.name.equals("K") && m.desc.equals("()Z")) {
            InsnList toInject = new InsnList();
            toInject.add(new InsnNode(ICONST_0));
            toInject.add(new InsnNode(IRETURN));

            m.instructions.clear();
            m.localVariables.clear();
            m.instructions.add(toInject);
            ok5 = true;
        } else if (m.name.equals("l_") && m.desc.equals("()V")) {
            InsnList toInject = new InsnList();
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new FieldInsnNode(GETFIELD, "tb", "q", "Labv;"));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new MethodInsnNode(INVOKESTATIC, "blockphysics/BlockPhysics", "fallingSandUpdate",
                    "(Labv;Lsq;)V"));
            toInject.add(new InsnNode(RETURN));

            m.instructions.clear();
            m.localVariables.clear();
            m.instructions.add(toInject);
            ok6 = true;
        } else if (m.name.equals("b") && m.desc.equals("(Lbx;)V")) {
            InsnList toInject = new InsnList();

            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new VarInsnNode(ALOAD, 1));
            toInject.add(new MethodInsnNode(INVOKESPECIAL, "sq", "b", "(Lbx;)V"));

            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    m.instructions.insertBefore(m.instructions.get(index), toInject);
                    ok7 = true;
                    break;
                }
            }
        } else if (m.name.equals("a") && m.desc.equals("(Lbx;)V")) {
            InsnList toInject = new InsnList();

            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new VarInsnNode(ALOAD, 1));
            toInject.add(new MethodInsnNode(INVOKESPECIAL, "sq", "a", "(Lbx;)V"));

            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    m.instructions.insertBefore(m.instructions.get(index), toInject);
                    ok8 = true;
                    break;
                }
            }
        } else if (m.name.equals("d") && m.desc.equals("()V")) {
            m.access = ACC_PUBLIC;
            ok9 = true;
            if (bukkit) {
                for (int index = 0; index < m.instructions.size(); index++) {
                    if (m.instructions.get(index).getOpcode() == INVOKESTATIC
                            && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                            && ((MethodInsnNode) m.instructions.get(index)).owner.contains("entity/CraftEntity")
                            && ((MethodInsnNode) m.instructions.get(index)).name.equals("getEntity")) {
                        String pclass = ((MethodInsnNode) m.instructions.get(index)).owner
                                .replace("entity/CraftEntity", "");
                        m.instructions.set(m.instructions.get(index),
                                new MethodInsnNode(INVOKESPECIAL, pclass + "entity/CraftTNTPrimed", "<init>",
                                        "(L" + pclass + "CraftServer;Ltb;)V"));

                        InsnList toInject = new InsnList();

                        toInject.add(new TypeInsnNode(NEW, pclass + "entity/CraftTNTPrimed"));
                        toInject.add(new InsnNode(DUP));

                        m.instructions.insert(m.instructions.get(index - 3), toInject);

                        ok10 = true;
                        break;
                    }
                }
            } else {
                for (int index = 0; index < m.instructions.size(); index++) {
                    if (m.instructions.get(index).getOpcode() == ACONST_NULL) {
                        m.instructions.set(m.instructions.get(index), new VarInsnNode(ALOAD, 0));
                        ok10 = true;
                        break;
                    }
                }
            }
        }
    }

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(cw);

    if (ok && ok2 && ok5 && ok6 && ok7 && ok8 && ok9)
        System.out.println("OK");
    else
        System.out.println("Failed." + ok + ok2 + ok5 + ok6 + ok7 + ok8 + ok9);

    /*try
    {
       FileOutputStream fos = new FileOutputStream("d:/EntityTNTPrimed.class");
       fos.write(cw.toByteArray());
     fos.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }*/

    return cw.toByteArray();
}

From source file:blockphysics.asm.BPTransformer.java

License:Open Source License

private byte[] transformEntityFallingSand(byte[] bytes) {
    /*try//w  w  w .j a  va2 s. co  m
    {
        FileOutputStream fos = new FileOutputStream("d:/EntityFallingSand.orig.class");
        fos.write(bytes);
      fos.close();
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }*/

    System.out.print("[BlockPhysics] Patching EntityFallingSand.class .......");
    boolean ok = false;
    boolean ok2 = false;
    boolean ok3 = false;
    boolean ok4 = false;
    boolean ok5 = false;
    boolean ok6 = false;
    boolean ok7 = false;
    boolean ok8 = false;
    boolean ok9 = false, ok10 = false;

    ClassNode classNode = new ClassNode();
    ClassReader classReader = new ClassReader(bytes);
    classReader.accept(classNode, 0);

    MethodNode m;
    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        m = methods.next();

        if (m.name.equals("<init>") && m.desc.equals("(Labv;)V")) {
            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    InsnList toInject = new InsnList();

                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_1));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "m", "Z"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new LdcInsnNode(new Float("0.996")));
                    toInject.add(new LdcInsnNode(new Float("0.996")));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "sq", "a", "(FF)V"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "sq", "P", "F"));
                    toInject.add(new InsnNode(FCONST_2));
                    toInject.add(new InsnNode(FDIV));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "N", "F"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "x", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "y", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "z", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationX", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new LdcInsnNode(new Double("-0.024525")));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationY", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationZ", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "slideDir", "B"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_1));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "Z", "Z"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new LdcInsnNode(new Float("0.8")));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "aa", "F"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_4));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "dead", "B"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "bpdata", "I"));

                    m.instructions.insertBefore(m.instructions.get(index), toInject);
                    ok10 = true;
                    break;
                }
            }
        } else if (m.name.equals("<init>") && m.desc.equals("(Labv;DDDII)V")) {
            for (int index = 0; index < m.instructions.size(); index++) {
                if (m.instructions.get(index).getOpcode() == INVOKEVIRTUAL
                        && m.instructions.get(index).getType() == AbstractInsnNode.METHOD_INSN
                        && ((MethodInsnNode) m.instructions.get(index)).owner.equals("sq")
                        && ((MethodInsnNode) m.instructions.get(index)).name.equals("a")) {
                    m.instructions.set(m.instructions.get(index - 1), new LdcInsnNode(new Float("0.996")));
                    m.instructions.set(m.instructions.get(index - 2), new LdcInsnNode(new Float("0.996")));
                    ok = true;
                    break;
                }
            }

            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    InsnList toInject = new InsnList();

                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationX", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new LdcInsnNode(new Double("-0.024525")));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationY", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationZ", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "slideDir", "B"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_1));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "Z", "Z"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new LdcInsnNode(new Float("0.8")));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "aa", "F"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_4));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "dead", "B"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "bpdata", "I"));

                    m.instructions.insertBefore(m.instructions.get(index), toInject);
                    ok2 = true;
                    break;
                }
            }
        } else if (m.name.equals("K") && m.desc.equals("()Z")) {
            InsnList toInject = new InsnList();
            toInject.add(new InsnNode(ICONST_0));
            toInject.add(new InsnNode(IRETURN));

            m.instructions.clear();
            m.localVariables.clear();
            m.instructions.add(toInject);
            ok9 = true;
        } else if (m.name.equals("l_") && m.desc.equals("()V")) {
            InsnList toInject = new InsnList();
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new FieldInsnNode(GETFIELD, "sq", "q", "Labv;"));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new MethodInsnNode(INVOKESTATIC, "blockphysics/BlockPhysics", "fallingSandUpdate",
                    "(Labv;Lsq;)V"));
            toInject.add(new InsnNode(RETURN));

            m.instructions.clear();
            m.localVariables.clear();
            m.instructions.add(toInject);
            ok3 = true;
        } else if (m.name.equals("b") && m.desc.equals("(F)V")) {
            m.instructions.clear();
            m.localVariables.clear();
            m.instructions.add(new InsnNode(RETURN));
            ok4 = true;
        } else if (m.name.equals("b") && m.desc.equals("(Lbx;)V")) {
            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    InsnList toInject = new InsnList();

                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("Acceleration"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_3));
                    toInject.add(new IntInsnNode(NEWARRAY, T_DOUBLE));
                    toInject.add(new InsnNode(DUP));
                    toInject.add(new InsnNode(ICONST_0));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "sq", "accelerationX", "D"));
                    toInject.add(new InsnNode(DASTORE));
                    toInject.add(new InsnNode(DUP));
                    toInject.add(new InsnNode(ICONST_1));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "sq", "accelerationY", "D"));
                    toInject.add(new InsnNode(DASTORE));
                    toInject.add(new InsnNode(DUP));
                    toInject.add(new InsnNode(ICONST_2));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "sq", "accelerationZ", "D"));
                    toInject.add(new InsnNode(DASTORE));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "sq", "a", "([D)Lcf;"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "a", "(Ljava/lang/String;Lck;)V"));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new FieldInsnNode(GETFIELD, "sq", "bpdata", "I"));
                    toInject.add(new InsnNode(I2B));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "a", "(Ljava/lang/String;B)V"));

                    m.instructions.insertBefore(m.instructions.get(index), toInject);
                    ok5 = true;
                    break;
                }
            }
        } else if (m.name.equals("a") && m.desc.equals("(Lbx;)V")) {

            while (!(m.instructions.get(0).getType() == AbstractInsnNode.LDC_INSN
                    && ((LdcInsnNode) m.instructions.get(0)).cst.equals("Data"))) {
                m.instructions.remove(m.instructions.get(0));
                ok6 = true;
            }

            InsnList toInject = new InsnList();
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new VarInsnNode(ALOAD, 1));
            toInject.add(new MethodInsnNode(INVOKESTATIC, "blockphysics/BlockPhysics", "readFallingSandID",
                    "(Lbx;)I"));
            toInject.add(new FieldInsnNode(PUTFIELD, "sq", "a", "I"));
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new VarInsnNode(ALOAD, 1));

            m.instructions.insertBefore(m.instructions.get(0), toInject);

            for (int index = m.instructions.size() - 1; index >= 0; index--) {
                if (m.instructions.get(index).getOpcode() == RETURN) {
                    toInject = new InsnList();
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("Acceleration"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "b", "(Ljava/lang/String;)Z"));
                    LabelNode l4 = new LabelNode();
                    toInject.add(new JumpInsnNode(IFEQ, l4));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("Acceleration"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "m", "(Ljava/lang/String;)Lcf;"));
                    toInject.add(new VarInsnNode(ASTORE, 2));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new VarInsnNode(ALOAD, 2));
                    toInject.add(new InsnNode(ICONST_0));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "cf", "b", "(I)Lck;"));
                    toInject.add(new TypeInsnNode(CHECKCAST, "ca"));
                    toInject.add(new FieldInsnNode(GETFIELD, "ca", "a", "D"));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationX", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new VarInsnNode(ALOAD, 2));
                    toInject.add(new InsnNode(ICONST_1));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "cf", "b", "(I)Lck;"));
                    toInject.add(new TypeInsnNode(CHECKCAST, "ca"));
                    toInject.add(new FieldInsnNode(GETFIELD, "ca", "a", "D"));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationY", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new VarInsnNode(ALOAD, 2));
                    toInject.add(new InsnNode(ICONST_2));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "cf", "b", "(I)Lck;"));
                    toInject.add(new TypeInsnNode(CHECKCAST, "ca"));
                    toInject.add(new FieldInsnNode(GETFIELD, "ca", "a", "D"));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationZ", "D"));
                    LabelNode l5 = new LabelNode();
                    toInject.add(new JumpInsnNode(GOTO, l5));
                    toInject.add(l4);
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationX", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationY", "D"));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(DCONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "accelerationZ", "D"));
                    toInject.add(l5);
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "b", "(Ljava/lang/String;)Z"));
                    LabelNode l7 = new LabelNode();
                    toInject.add(new JumpInsnNode(IFEQ, l7));
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new VarInsnNode(ALOAD, 1));
                    toInject.add(new LdcInsnNode("BPData"));
                    toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "bx", "c", "(Ljava/lang/String;)B"));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "bpdata", "I"));
                    LabelNode l8 = new LabelNode();
                    toInject.add(new JumpInsnNode(GOTO, l8));
                    toInject.add(l7);
                    toInject.add(new VarInsnNode(ALOAD, 0));
                    toInject.add(new InsnNode(ICONST_0));
                    toInject.add(new FieldInsnNode(PUTFIELD, "sq", "bpdata", "I"));
                    toInject.add(l8);

                    m.instructions.insertBefore(m.instructions.get(index), toInject);

                    ok7 = true;
                    break;
                }
            }
        } else if (m.name.equals("au") && m.desc.equals("()Z")) {
            InsnList toInject = new InsnList();
            toInject.add(new VarInsnNode(ALOAD, 0));
            toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "sq", "ae", "()Z"));
            toInject.add(new InsnNode(IRETURN));

            m.instructions.clear();
            m.localVariables.clear();
            m.instructions.add(toInject);
            ok8 = true;
        }

    }

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(cw);

    FieldVisitor fv;

    fv = cw.visitField(ACC_PUBLIC, "accelerationX", "D", null, null);
    fv.visitEnd();

    fv = cw.visitField(ACC_PUBLIC, "accelerationY", "D", null, null);
    fv.visitEnd();

    fv = cw.visitField(ACC_PUBLIC, "accelerationZ", "D", null, null);
    fv.visitEnd();

    fv = cw.visitField(ACC_PUBLIC, "bpdata", "I", null, null);
    fv.visitEnd();

    fv = cw.visitField(ACC_PUBLIC, "slideDir", "B", null, null);
    fv.visitEnd();

    fv = cw.visitField(ACC_PUBLIC, "media", "I", null, null);
    fv.visitEnd();

    fv = cw.visitField(ACC_PUBLIC, "dead", "B", null, null);
    fv.visitEnd();

    MethodVisitor mv;

    mv = cw.visitMethod(ACC_PUBLIC, "D", "()Lasu;", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, "sq", "E", "Lasu;");
    mv.visitInsn(ARETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    mv = cw.visitMethod(ACC_PUBLIC, "al", "()V", null, null);
    mv.visitCode();
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 1);
    mv.visitEnd();

    mv = cw.visitMethod(ACC_PUBLIC, "d", "(DDD)V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, "sq", "q", "Labv;");
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(DLOAD, 1);
    mv.visitVarInsn(DLOAD, 3);
    mv.visitVarInsn(DLOAD, 5);
    mv.visitMethodInsn(INVOKESTATIC, "blockphysics/BlockPhysics", "moveEntity", "(Labv;Lsq;DDD)V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(8, 7);
    mv.visitEnd();

    if (!ok8) {
        mv = cw.visitMethod(ACC_PUBLIC, "au", "()Z", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "sq", "ae", "()Z");
        mv.visitInsn(IRETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();

        ok8 = true;
    }

    cw.visitEnd();

    if (ok && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8 && ok9 && ok10)
        System.out.println("OK");
    else
        System.out.println("Failed." + ok + ok2 + ok3 + ok4 + ok5 + ok6 + ok7 + ok8 + ok9 + ok10);

    /*try
    {
       FileOutputStream fos = new FileOutputStream("d:/EntityFallingSand.class");
       fos.write(cw.toByteArray());
     fos.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }*/

    return cw.toByteArray();
}

From source file:br.usp.each.saeg.badua.core.internal.instr.InstrSupport.java

License:Open Source License

/**
 * Generates the instruction to push the given int value on the stack.
 *
 * @param value/*from  ww  w . j  av  a 2s  .c o  m*/
 *            the value to be pushed on the stack.
 * @return the AbstractInsnNode that push the given int value on the stack.
 */
public static AbstractInsnNode push(final int value) {
    final AbstractInsnNode insn;
    if (value >= -1 && value <= 5) {
        insn = new InsnNode(Opcodes.ICONST_0 + value);
    } else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) {
        insn = new IntInsnNode(Opcodes.BIPUSH, value);
    } else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE) {
        insn = new IntInsnNode(Opcodes.SIPUSH, value);
    } else {
        insn = new LdcInsnNode(value);
    }
    return insn;
}

From source file:cl.inria.stiq.instrumenter.BCIUtils.java

License:Open Source License

/**
 * Generates the bytecode that pushes the given value onto the stack
 *//*  w  ww. j av a 2s . c o m*/
public static AbstractInsnNode pushInt(int aValue) {
    switch (aValue) {
    case -1:
        return new InsnNode(ICONST_M1);
    case 0:
        return new InsnNode(ICONST_0);
    case 1:
        return new InsnNode(ICONST_1);
    case 2:
        return new InsnNode(ICONST_2);
    case 3:
        return new InsnNode(ICONST_3);
    case 4:
        return new InsnNode(ICONST_4);
    case 5:
        return new InsnNode(ICONST_5);
    }

    if (aValue >= Byte.MIN_VALUE && aValue <= Byte.MAX_VALUE)
        return new IntInsnNode(BIPUSH, aValue);
    else if (aValue >= Short.MIN_VALUE && aValue <= Short.MAX_VALUE)
        return new IntInsnNode(SIPUSH, aValue);
    else
        return new LdcInsnNode(new Integer(aValue));
}

From source file:cl.inria.stiq.instrumenter.BCIUtils.java

License:Open Source License

/**
 * Generates the bytecode that pushes the given value onto the stack
 *//* w w w.  ja v a2s  .  co  m*/
public static AbstractInsnNode pushLong(long aValue) {
    if (aValue == 0)
        return new InsnNode(LCONST_0);
    else if (aValue == 1)
        return new InsnNode(LCONST_1);
    else
        return new LdcInsnNode(new Long(aValue));
}

From source file:com.android.builder.testing.MockableJarGenerator.java

License:Apache License

private static InsnList throwExceptionsList(MethodNode methodNode, ClassNode classNode) {
    try {/* w  w  w. j  av  a  2 s.  c o  m*/
        String runtimeException = Type.getInternalName(RuntimeException.class);
        Constructor<RuntimeException> constructor = RuntimeException.class.getConstructor(String.class);

        InsnList instructions = new InsnList();
        instructions.add(new TypeInsnNode(Opcodes.NEW, runtimeException));
        instructions.add(new InsnNode(Opcodes.DUP));

        String className = classNode.name.replace('/', '.');
        instructions.add(new LdcInsnNode("Method " + methodNode.name + " in " + className + " not mocked. "
                + "See http://g.co/androidstudio/not-mocked for details."));
        instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, runtimeException, CONSTRUCTOR,
                Type.getType(constructor).getDescriptor(), false));
        instructions.add(new InsnNode(Opcodes.ATHROW));

        return instructions;
    } catch (NoSuchMethodException e) {
        throw new RuntimeException(e);
    }
}