Package org.objectweb.asm.tree

Examples of org.objectweb.asm.tree.InsnNode


                // Rather than JSRing, we will jump to the inline version and
                // push NULL for what was once the return value. This hack
                // allows us to avoid doing any sort of data flow analysis to
                // figure out which instructions manipulate the old return value
                // pointer which is now known to be unneeded.
                newInstructions.add(new InsnNode(ACONST_NULL));
                newInstructions.add(new JumpInsnNode(GOTO, startlbl));
                newInstructions.add(newinst.returnLabel);

                // Insert this new instantiation into the queue to be emitted
                // later.
View Full Code Here


        methodVisitor.visitCode();

        // visit instructions
        body.accept(methodVisitor);
        if (addReturn) {
            new InsnNode(RETURN).accept(methodVisitor);
        }

        // visit local variable declarations
        for (LocalVariableNode localVariableNode : localVariableNodes) {
            localVariableNode.accept(methodVisitor);
View Full Code Here

      m.instructions.add(new VarInsnNode(ILOAD, 2));
      m.instructions.add(new VarInsnNode(ILOAD, 3));
      m.instructions.add(new VarInsnNode(ILOAD, 4));
      m.instructions.add(new VarInsnNode(ALOAD, 5));
      m.instructions.add(new MethodInsnNode(INVOKESTATIC, "cofh/asm/HooksCore", "paneConnectsTo", sig, false));
      m.instructions.add(new InsnNode(IRETURN));

      m.localVariables = null;

      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
      cn.accept(cw);
View Full Code Here

          updated = true;
          for (int i = 0, e = m.instructions.size(); i < e; ++i) {
            AbstractInsnNode n = m.instructions.get(i);
            if (n.getOpcode() == RETURN) {
              m.instructions.insertBefore(n, new VarInsnNode(ALOAD, 0));
              m.instructions.insertBefore(n, new InsnNode(ICONST_0));
              m.instructions.insertBefore(n, new FieldInsnNode(PUTFIELD, name, names[1], "Z"));
              break;
            }
          }
        }
View Full Code Here

          updated = true;
          for (int i = 0, e = m.instructions.size(); i < e; ++i) {
            AbstractInsnNode n = m.instructions.get(i);
            if (n.getOpcode() == LXOR) {
              m.instructions.insertBefore(n, new LdcInsnNode(new Long(13L)));
              m.instructions.insertBefore(n, new InsnNode(LMUL));
              break;
            }
          }
          if (containsItem != null) {
            break;
          }
        } else if (names[2].equals(mName) && "(J)Z".equals(m.desc)) {
          containsItem = m;
          if (updated) {
            break;
          }
        }
      }

      mc: if (containsItem != null) {
        // { cloning methods to get a different set of instructions to avoid erasing getEntry
        ClassNode clone = new ClassNode(ASM4);
        cr.accept(clone, ClassReader.EXPAND_FRAMES);
        String sig = "(J)Lnet/minecraft/util/LongHashMap$Entry;";
        for (MethodNode m : clone.methods) {
          String mName = remapper.mapMethodName(name, m.name, m.desc);
          if (names[1].equals(mName) && sig.equals(remapper.mapMethodDesc(m.desc))) {
            getEntry = m;
            break;
          }
        }
        // }
        if (getEntry == null) {
          break mc;
        }
        updated = true;
        containsItem.instructions.clear();
        containsItem.instructions.add(getEntry.instructions);
        /**
         * this looks counter intuitive (replacing getEntry != null check with the full method) but due to how the JVM handles inlining, this needs to
         * be done manually
         */
        for (AbstractInsnNode n = containsItem.instructions.get(0); n != null; n = n.getNext()) {
          if (n.getOpcode() == ARETURN) {
            AbstractInsnNode n2 = n.getPrevious();
            if (n2.getOpcode() == ACONST_NULL) {
              containsItem.instructions.set(n2, new InsnNode(ICONST_0));
            } else {
              containsItem.instructions.set(n2, new InsnNode(ICONST_1));
            }
            containsItem.instructions.set(n, n = new InsnNode(IRETURN));
          }
        }
      }

      if (!updated) {
View Full Code Here

      m.instructions.add(new FieldInsnNode(GETFIELD, name, names[1], "Ljava/util/List;"));
      m.instructions.add(new VarInsnNode(ALOAD, 1));
      m.instructions.add(new VarInsnNode(ILOAD, 2));
      m.instructions.add(new VarInsnNode(ILOAD, 3));
      m.instructions.add(new VarInsnNode(ILOAD, 4));
      m.instructions.add(new InsnNode(ICONST_0));
      m.instructions.add(new MethodInsnNode(INVOKESTATIC, "cofh/lib/util/helpers/InventoryHelper", "mergeItemStack",
          "(Ljava/util/List;Lnet/minecraft/item/ItemStack;IIZZ)Z", false));
      m.instructions.add(new InsnNode(IRETURN));

      // this fixes a crash in dev and with cauldron
      m.localVariables = null;

      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
View Full Code Here

            !((MethodInsnNode)n).name.equals("<init>")) n = n.getNext();
        m.instructions.insert(n, n = a);
        m.instructions.insert(n, n = new LineNumberNode(-15000, a));
        m.instructions.insert(n, n = new VarInsnNode(ALOAD, 0));
        m.instructions.insert(n, n = new TypeInsnNode(NEW, "cofh/lib/util/LinkedHashList"));
        m.instructions.insert(n, n = new InsnNode(DUP));
        m.instructions.insert(n, n = new MethodInsnNode(INVOKESPECIAL, "cofh/lib/util/LinkedHashList", "<init>", "()V", false));
        m.instructions.insert(n, n = new FieldInsnNode(PUTFIELD, "net/minecraft/world/World", "cofh_recentTiles", "Lcofh/lib/util/LinkedHashList;"));
      } else if ("addTileEntity".equals(m.name) && "(Lnet/minecraft/tileentity/TileEntity;)V".equals(remapper.mapMethodDesc(m.desc))) {
        addTileEntity = m;
      } else if (names[4].equals(remapper.mapMethodName(name, m.name, m.desc)) && "(Ljava/util/Collection;)V".equals(m.desc)) {
        addTileEntities = m;
      } else if (names[5].equals(remapper.mapMethodName(name, m.name, m.desc)) && "(IIILnet/minecraft/tileentity/TileEntity;)V".equals(remapper.mapMethodDesc(m.desc))) {
        setTileEntity = m;
      } else if (names[6].equals(remapper.mapMethodName(name, m.name, m.desc)) && "()V".equals(remapper.mapMethodDesc(m.desc))) {
        updateEntities = m;
      }
    }
    cn.fields.add(new FieldNode(ACC_PRIVATE, "cofh_recentTiles", "Lcofh/lib/util/LinkedHashList;", null, null));
    if (addTileEntity != null) {

      LabelNode a = new LabelNode(new Label());
      AbstractInsnNode n;
      addTileEntity.instructions.insert(n = a);
      addTileEntity.instructions.insert(n, n = new LineNumberNode(-15001, a));
      addTileEntity.instructions.insert(n, n = new VarInsnNode(ALOAD, 0));
      addTileEntity.instructions.insert(n, n = new FieldInsnNode(GETFIELD, "net/minecraft/world/World", "cofh_recentTiles", "Lcofh/lib/util/LinkedHashList;"));
      addTileEntity.instructions.insert(n, n = new VarInsnNode(ALOAD, 1));
      addTileEntity.instructions.insert(n, n = new MethodInsnNode(INVOKEVIRTUAL, "cofh/lib/util/LinkedHashList", "push", "(Ljava/lang/Object;)Z", false));
      addTileEntity.instructions.insert(n, n = new InsnNode(POP));
    }
    if (setTileEntity != null) {

      LabelNode a = new LabelNode(new Label());
      AbstractInsnNode n = setTileEntity.instructions.getLast();
      while (n.getOpcode() != RETURN) n = n.getPrevious();
      n = n.getPrevious();
      setTileEntity.instructions.insert(n = a);
      setTileEntity.instructions.insert(n, n = new LineNumberNode(-15002, a));
      setTileEntity.instructions.insert(n, n = new VarInsnNode(ALOAD, 0));
      setTileEntity.instructions.insert(n, n = new FieldInsnNode(GETFIELD, "net/minecraft/world/World", "cofh_recentTiles", "Lcofh/lib/util/LinkedHashList;"));
      setTileEntity.instructions.insert(n, n = new VarInsnNode(ALOAD, 4));
      setTileEntity.instructions.insert(n, n = new MethodInsnNode(INVOKEVIRTUAL, "cofh/lib/util/LinkedHashList", "push", "(Ljava/lang/Object;)Z", false));
      setTileEntity.instructions.insert(n, n = new InsnNode(POP));
    }
    if (addTileEntities != null) {
      LabelNode a = new LabelNode(new Label());
      AbstractInsnNode n = addTileEntities.instructions.getFirst();
      for (;;) {
        while (n.getOpcode() != CHECKCAST) n = n.getNext();
        if (remapper.mapType(((TypeInsnNode)n).desc).equals("net/minecraft/tileentity/TileEntity"))
          break;
      }
      addTileEntities.instructions.insert(n, n = a);
      addTileEntities.instructions.insert(n, n = new LineNumberNode(-15003, a));
      addTileEntities.instructions.insert(n, n = new InsnNode(DUP));
      addTileEntities.instructions.insert(n, n = new VarInsnNode(ALOAD, 0));
      addTileEntities.instructions.insert(n, n = new FieldInsnNode(GETFIELD, "net/minecraft/world/World", "cofh_recentTiles", "Lcofh/lib/util/LinkedHashList;"));
      addTileEntities.instructions.insert(n, n = new InsnNode(SWAP));
      addTileEntities.instructions.insert(n, n = new MethodInsnNode(INVOKEVIRTUAL, "cofh/lib/util/LinkedHashList", "push", "(Ljava/lang/Object;)Z", false));
      addTileEntities.instructions.insert(n, n = new InsnNode(POP));
    }
    if (updateEntities != null) {
      AbstractInsnNode n = updateEntities.instructions.getFirst();
      while (n.getOpcode() != INVOKEVIRTUAL ||
          !"onChunkUnload".equals(((MethodInsnNode)n).name) ||
          !"()V".equals(((MethodInsnNode)n).desc)) n = n.getNext();
      while (n.getOpcode() != PUTFIELD) n = n.getNext();
      n = n.getPrevious().getPrevious();
      LabelNode lStart = new LabelNode(new Label());
      LabelNode lCond = new LabelNode(new Label());
      LabelNode lGuard = new LabelNode(new Label());
      LabelNode a = new LabelNode(new Label());
      updateEntities.instructions.insert(n, n = a);
      updateEntities.instructions.insert(n, n = new LineNumberNode(-15004, a));
      updateEntities.instructions.insert(n, n = new JumpInsnNode(GOTO, lCond));
      updateEntities.instructions.insert(n, n = lStart);
      updateEntities.instructions.insert(n, n = new FrameNode(F_SAME, 0, null, 0, null));
      updateEntities.instructions.insert(n, n = new VarInsnNode(ALOAD, 0));
      updateEntities.instructions.insert(n, n = new FieldInsnNode(GETFIELD, "net/minecraft/world/World", "cofh_recentTiles", "Lcofh/lib/util/LinkedHashList;"));
      updateEntities.instructions.insert(n, n = new MethodInsnNode(INVOKEVIRTUAL, "cofh/lib/util/LinkedHashList", "shift", "()Ljava/lang/Object;", false));
      updateEntities.instructions.insert(n, n = new TypeInsnNode(CHECKCAST, "net/minecraft/tileentity/TileEntity"));
      updateEntities.instructions.insert(n, n = new InsnNode(DUP));
      updateEntities.instructions.insert(n, n = new JumpInsnNode(IFNULL, lGuard));
      updateEntities.instructions.insert(n, n = new MethodInsnNode(INVOKEVIRTUAL, "net/minecraft/tileentity/TileEntity", "cofh_validate", "()V", false));
      updateEntities.instructions.insert(n, n = new InsnNode(ACONST_NULL));
      updateEntities.instructions.insert(n, n = lGuard);
      updateEntities.instructions.insert(n, n = new InsnNode(POP));
      updateEntities.instructions.insert(n, n = lCond);
      updateEntities.instructions.insert(n, n = new FrameNode(F_SAME, 0, null, 0, null));
      updateEntities.instructions.insert(n, n = new VarInsnNode(ALOAD, 0));
      updateEntities.instructions.insert(n, n = new FieldInsnNode(GETFIELD, "net/minecraft/world/World", "cofh_recentTiles", "Lcofh/lib/util/LinkedHashList;"));
      updateEntities.instructions.insert(n, n = new MethodInsnNode(INVOKEVIRTUAL, "cofh/lib/util/LinkedHashList", "size", "()I", false));
View Full Code Here

//        }

        // visit instructions
        body.accept(methodVisitor);
        if (addReturn) {
            new InsnNode(RETURN).accept(methodVisitor);
        }

        // visit local variable declarations
        for (LocalVariableNode localVariableNode : localVariableNodes) {
            localVariableNode.accept(methodVisitor);
View Full Code Here

                // Rather than JSRing, we will jump to the inline version and
                // push NULL for what was once the return value. This hack
                // allows us to avoid doing any sort of data flow analysis to
                // figure out which instructions manipulate the old return value
                // pointer which is now known to be unneeded.
                newInstructions.add(new InsnNode(ACONST_NULL));
                newInstructions.add(new JumpInsnNode(GOTO, startlbl));
                newInstructions.add(newinst.returnLabel);

                // Insert this new instantiation into the queue to be emitted
                // later.
View Full Code Here

            {
              MethodNode newNode = new MethodNode( Opcodes.ACC_PUBLIC, "func_146977_a_original", mn.desc, mn.signature, new String[0] );
              newNode.instructions.add( new VarInsnNode( Opcodes.ALOAD, 0 ) );
              newNode.instructions.add( new VarInsnNode( Opcodes.ALOAD, 1 ) );
              newNode.instructions.add( new MethodInsnNode( Opcodes.INVOKESPECIAL, classNode.name, mn.name, mn.desc, false ) );
              newNode.instructions.add( new InsnNode( Opcodes.RETURN ) );
              log( newNode.name + newNode.desc + " - New Method" );
              classNode.methods.add( newNode );
              break;
            }
          }
View Full Code Here

TOP

Related Classes of org.objectweb.asm.tree.InsnNode

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.