Example usage for org.objectweb.asm.tree AbstractInsnNode getOpcode

List of usage examples for org.objectweb.asm.tree AbstractInsnNode getOpcode

Introduction

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

Prototype

public int getOpcode() 

Source Link

Document

Returns the opcode of this instruction.

Usage

From source file:net.malisis.core.asm.AsmUtils.java

License:Open Source License

public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) {
    if (node1 == null || node2 == null || node1.getOpcode() != node2.getOpcode())
        return false;

    switch (node2.getType()) {
    case VAR_INSN:
        return varInsnEqual((VarInsnNode) node1, (VarInsnNode) node2);
    case TYPE_INSN:
        return typeInsnEqual((TypeInsnNode) node1, (TypeInsnNode) node2);
    case FIELD_INSN:
        return fieldInsnEqual((FieldInsnNode) node1, (FieldInsnNode) node2);
    case METHOD_INSN:
        return methodInsnEqual((MethodInsnNode) node1, (MethodInsnNode) node2);
    case LDC_INSN:
        return ldcInsnEqual((LdcInsnNode) node1, (LdcInsnNode) node2);
    case IINC_INSN:
        return iincInsnEqual((IincInsnNode) node1, (IincInsnNode) node2);
    case INT_INSN:
        return intInsnEqual((IntInsnNode) node1, (IntInsnNode) node2);
    default:/*  w w w .  j a v  a 2 s . c  o m*/
        return true;
    }
}

From source file:net.minecraftforge.fml.common.asm.transformers.AccessTransformer.java

License:Open Source License

private void replaceInvokeSpecial(ClassNode clazz, List<MethodNode> toReplace) {
    for (MethodNode method : clazz.methods) {
        for (Iterator<AbstractInsnNode> it = method.instructions.iterator(); it.hasNext();) {
            AbstractInsnNode insn = it.next();
            if (insn.getOpcode() == INVOKESPECIAL) {
                MethodInsnNode mInsn = (MethodInsnNode) insn;
                for (MethodNode n : toReplace) {
                    if (n.name.equals(mInsn.name) && n.desc.equals(mInsn.desc)) {
                        mInsn.setOpcode(INVOKEVIRTUAL);
                        break;
                    }/*w ww  .  j ava 2  s .co  m*/
                }
            }
        }
    }
}

From source file:net.minecrell.ice.launch.transformers.AccessTransformer.java

License:Open Source License

@Override
public byte[] transform(String name, String transformedName, byte[] bytes) {
    if (bytes == null || !modifiers.containsKey(transformedName)) {
        return bytes;
    }/*from  w ww.j ava2s  .c  om*/

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

    for (Modifier m : modifiers.get(transformedName)) {
        if (m.isClass) { // Class
            classNode.access = m.transform(classNode.access);
        } else if (m.desc == null) { // Field
            for (FieldNode fieldNode : classNode.fields) {
                if (m.wildcard || fieldNode.name.equals(m.name)) {
                    fieldNode.access = m.transform(fieldNode.access);
                    if (!m.wildcard)
                        break;
                }
            }
        } else {
            List<MethodNode> overridable = null;

            for (MethodNode methodNode : classNode.methods) {
                if (m.wildcard || (methodNode.name.equals(m.name) && methodNode.desc.equals(m.desc))) {
                    boolean wasPrivate = (methodNode.access & ACC_PRIVATE) != 0;
                    methodNode.access = m.transform(methodNode.access);

                    // Constructors always use INVOKESPECIAL
                    // if we changed from private to something else we need to replace all INVOKESPECIAL calls to this method with INVOKEVIRTUAL
                    // so that overridden methods will be called. Only need to scan this class, because obviously the method was private.
                    if (!methodNode.name.equals("<init>") && wasPrivate
                            && (methodNode.access & ACC_PRIVATE) == 0) {
                        if (overridable == null) {
                            overridable = new ArrayList<>(3);
                        }

                        overridable.add(methodNode);
                    }

                    if (!m.wildcard)
                        break;
                }
            }

            if (overridable != null) {
                for (MethodNode methodNode : classNode.methods) {
                    for (Iterator<AbstractInsnNode> itr = methodNode.instructions.iterator(); itr.hasNext();) {
                        AbstractInsnNode insn = itr.next();
                        if (insn.getOpcode() == INVOKESPECIAL) {
                            MethodInsnNode mInsn = (MethodInsnNode) insn;
                            for (MethodNode replace : overridable) {
                                if (replace.name.equals(mInsn.name) && replace.desc.equals(mInsn.desc)) {
                                    mInsn.setOpcode(INVOKEVIRTUAL);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    ClassWriter writer = new ClassWriter(0);
    classNode.accept(writer);
    return writer.toByteArray();
}

From source file:net.minecrell.quartz.launch.transformers.AccessTransformer.java

License:MIT License

@Override
protected void transform(String name, String transformedName, ClassNode classNode) {
    List<MethodNode> overridable = null;

    for (Map.Entry<String, AccessMapping> entry : mappings.getAccessMappings().row(transformedName)
            .entrySet()) {//from   w  ww.j  a  v a  2  s .co m
        String target = entry.getKey();
        AccessMapping accessMapping = entry.getValue();

        if (target.isEmpty()) {
            // Class mapping
            accessMapping.transform(classNode);
        } else if (target.indexOf('(') >= 0) {
            int len = target.length();

            // Method mapping
            for (MethodNode methodNode : classNode.methods) {
                // Fast check before we look more intensively
                if (methodNode.name.length() + methodNode.desc.length() != len
                        || !(target.startsWith(methodNode.name) && target.endsWith(methodNode.desc)))
                    continue;

                boolean wasPrivate = Access.PRIVATE.is(methodNode.access);
                accessMapping.transform(methodNode);

                // Constructors always use INVOKESPECIAL
                // If we changed from private to something else we need to replace all INVOKESPECIAL calls to this method with INVOKEVIRTUAL
                // So that overridden methods will be called. Only need to scan this class, because obviously the method was private.
                if (wasPrivate && accessMapping.getAccess() != Access.PRIVATE
                        && !methodNode.name.equals("<init>")) {
                    if (overridable == null) {
                        overridable = new ArrayList<>(3);
                    }

                    overridable.add(methodNode);
                }

                break;
            }
        } else {
            // Field mapping
            for (FieldNode fieldNode : classNode.fields) {
                if (target.equals(fieldNode.name)) {
                    accessMapping.transform(fieldNode);
                    break;
                }
            }
        }
    }

    if (overridable != null) {
        for (MethodNode methodNode : classNode.methods) {
            for (Iterator<AbstractInsnNode> itr = methodNode.instructions.iterator(); itr.hasNext();) {
                AbstractInsnNode insn = itr.next();
                if (insn.getOpcode() == INVOKESPECIAL) {
                    MethodInsnNode mInsn = (MethodInsnNode) insn;
                    for (MethodNode replace : overridable) {
                        if (replace.name.equals(mInsn.name) && replace.desc.equals(mInsn.desc)) {
                            mInsn.setOpcode(INVOKEVIRTUAL);
                            break;
                        }
                    }
                }
            }
        }
    }
}

From source file:net.minecrell.quartz.mappings.transformer.AccessTransformer.java

License:Open Source License

@Override
public ClassNode transform(String name, String transformedName, ClassNode classNode) {
    List<MethodNode> overridable = null;

    for (Map.Entry<String, AccessTransform> entry : this.mapper.getAccessTransforms().row(transformedName)
            .entrySet()) {//from   w w w  . ja  va  2  s . c  om
        String target = entry.getKey();
        AccessTransform access = entry.getValue();

        if (target.isEmpty()) {
            // Class mapping
            classNode.access = access.transform(classNode.access);
        } else if (target.indexOf('(') >= 0) {
            int len = target.length();

            // Method mapping
            for (MethodNode methodNode : classNode.methods) {
                // Fast check before we look more intensively
                if (methodNode.name.length() + methodNode.desc.length() != len
                        || !(target.startsWith(methodNode.name) && target.endsWith(methodNode.desc)))
                    continue;

                boolean wasPrivate = AccessModifier.PRIVATE.is(methodNode.access);
                methodNode.access = access.transform(methodNode.access);

                // Constructors always use INVOKESPECIAL
                // If we changed from private to something else we need to replace all INVOKESPECIAL calls to this method with INVOKEVIRTUAL
                // So that overridden methods will be called. Only need to scan this class, because obviously the method was private.
                if (wasPrivate && access.getAccess() != AccessModifier.PRIVATE
                        && !methodNode.name.equals("<init>")) {
                    if (overridable == null) {
                        overridable = new ArrayList<>(3);
                    }

                    overridable.add(methodNode);
                }

                break;
            }
        } else {
            // Field mapping
            for (FieldNode fieldNode : classNode.fields) {
                if (target.equals(fieldNode.name)) {
                    fieldNode.access = access.transform(fieldNode.access);
                    break;
                }
            }
        }
    }

    if (overridable != null) {
        for (MethodNode methodNode : classNode.methods) {
            for (Iterator<AbstractInsnNode> itr = methodNode.instructions.iterator(); itr.hasNext();) {
                AbstractInsnNode insn = itr.next();
                if (insn.getOpcode() == INVOKESPECIAL) {
                    MethodInsnNode mInsn = (MethodInsnNode) insn;
                    for (MethodNode replace : overridable) {
                        if (replace.name.equals(mInsn.name) && replace.desc.equals(mInsn.desc)) {
                            mInsn.setOpcode(INVOKEVIRTUAL);
                            break;
                        }
                    }
                }
            }
        }
    }

    return classNode;
}

From source file:net.roryclaasen.asm.rorysmodcore.transformer.EntityPlayerTransformer.java

License:Apache License

public byte[] patchOnUpdate(String name, byte[] bytes, boolean obfuscated) {
    RMLog.info("[EntityPlayer] [onUpdate] Patching", true);
    String targetMethodName = "";

    if (obfuscated == true)
        targetMethodName = "h";
    else//from   www .j  a v a  2 s .  c  o  m
        targetMethodName = "onUpdate";
    ClassNode classNode = new ClassNode();
    ClassReader classReader = new ClassReader(bytes);
    classReader.accept(classNode, 0);

    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        MethodNode method = methods.next();
        int invok_index = -1;
        if ((method.name.equals(targetMethodName) && method.desc.equals("()V"))) {
            AbstractInsnNode currentNode = null;
            AbstractInsnNode targetNode = null;

            Iterator<AbstractInsnNode> iter = method.instructions.iterator();

            int index = -1;

            int GETFIELD_COUNT = 0;
            while (iter.hasNext()) {
                index++;
                currentNode = iter.next();
                if (currentNode.getOpcode() == Opcodes.GETFIELD) {
                    GETFIELD_COUNT++;
                    if (GETFIELD_COUNT == 13) {
                        targetNode = currentNode;
                        invok_index = index;
                        break;
                    }
                }
            }
            if (targetNode == null || invok_index == -1) {
                RMLog.info("[EntityPlayer] Did not find all necessary target nodes! ABANDON CLASS!", true);
                return bytes;
            }
            /*
             * mv.visitLineNumber(305, l19);
             * mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
             * mv.visitVarInsn(ALOAD, 0);
             * -- mv.visitFieldInsn(GETFIELD, "net/minecraft/entity/player/EntityPlayer", "worldObj", "Lnet/minecraft/world/World;");
             * mv.visitFieldInsn(GETFIELD, "net/minecraft/world/World", "isRemote", "Z");
             * Label l21 = new Label();
             * mv.visitJumpInsn(IFNE, l21);
             */
            @SuppressWarnings("unused")
            AbstractInsnNode p1, p2, p3;
            p1 = method.instructions.get(invok_index - 1); // mv.visitVarInsn(ALOAD, 0);
            p2 = method.instructions.get(invok_index); // mv.visitFieldInsn(GETFIELD, "net/minecraft/entity/player/EntityPlayer", "worldObj", "Lnet/minecraft/world/World;");
            p3 = method.instructions.get(invok_index + 1); // mv.visitFieldInsn(GETFIELD, "net/minecraft/world/World", "isRemote", "Z");

            //method.instructions.remove(p1);
            //method.instructions.remove(p2);
            //method.instructions.remove(p3);

            MethodInsnNode m1 = new MethodInsnNode(Opcodes.INVOKESTATIC,
                    "net/roryclaasen/asm/rorysmodcore/transformer/StaticClass", "shouldWakeUp",
                    "(Lnet/minecraft/entity/player/EntityPlayer;)Z", false);

            method.instructions.set(p2, m1);
            method.instructions.remove(p3);
            break;
        }
    }
    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(writer);
    return writer.toByteArray();
}

From source file:net.roryclaasen.asm.rorysmodcore.transformer.WorldServerTransformer.java

License:Apache License

public byte[] patchTick(String name, byte[] bytes, boolean obfuscated) {
    RMLog.info("[WorldServer] [tick] Patching", true);
    String targetMethodName = "";

    if (obfuscated == true)
        targetMethodName = "b";
    else//from   w  w  w . j a v  a 2 s  . c o m
        targetMethodName = "tick";
    ClassNode classNode = new ClassNode();
    ClassReader classReader = new ClassReader(bytes);
    classReader.accept(classNode, 0);

    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        MethodNode method = methods.next();
        int invok_index = -1;
        if ((method.name.equals(targetMethodName) && method.desc.equals("()V"))) {
            AbstractInsnNode currentNode = null;
            AbstractInsnNode targetNode = null;

            Iterator<AbstractInsnNode> iter = method.instructions.iterator();

            int index = -1;

            int INVOKEVIRTUAL_COUNT = 0;
            while (iter.hasNext()) {
                index++;
                currentNode = iter.next();
                if (currentNode.getOpcode() == Opcodes.INVOKEVIRTUAL) {
                    INVOKEVIRTUAL_COUNT++;
                    if (INVOKEVIRTUAL_COUNT == 9) {
                        targetNode = currentNode;
                        invok_index = index;
                        break;
                    }
                }
            }
            if (targetNode == null || invok_index == -1) {
                RMLog.info("[WorldServer] Did not find all necessary target nodes! ABANDON CLASS!", true);
                return bytes;
            }
            AbstractInsnNode p1 = method.instructions.get(invok_index);
            MethodInsnNode a1 = new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/world/WorldServer",
                    "resetRainAndThunder", "()V", false);

            method.instructions.set(p1, a1);
            break;
        }
    }
    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(writer);
    return writer.toByteArray();
}

From source file:net.roryclaasen.asm.rorysmodcore.transformer.WorldServerTransformer.java

License:Apache License

public byte[] patchWakeAllPlayers(String name, byte[] bytes, boolean obfuscated) {
    RMLog.info("[WorldServer] [wakeAllPlayers] Patching", true);
    String targetMethodName = "";

    if (obfuscated == true)
        targetMethodName = "d";
    else/*from ww  w  .ja  v a2 s  .  co m*/
        targetMethodName = "wakeAllPlayers";

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

    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        MethodNode method = methods.next();
        int invok_index = -1;
        if ((method.name.equals(targetMethodName) && method.desc.equals("()V"))) {
            AbstractInsnNode currentNode = null;
            AbstractInsnNode targetNode = null;

            Iterator<AbstractInsnNode> iter = method.instructions.iterator();
            int index = -1;
            while (iter.hasNext()) {
                index++;
                currentNode = iter.next();
                if (currentNode.getOpcode() == Opcodes.INVOKEVIRTUAL) {
                    invok_index = index;
                    targetNode = currentNode;
                    break;
                }
            }
            if (targetNode == null || invok_index == -1) {
                RMLog.info("[WorldServer] Did not find all necessary target nodes! ABANDON CLASS!", true);
                return bytes;
            }
            AbstractInsnNode p1 = method.instructions.get(invok_index);
            MethodInsnNode p2 = new MethodInsnNode(Opcodes.INVOKESTATIC,
                    "net/roryclaasen/asm/rorysmodcore/transformer/StaticClass", "shouldWakeUp", "()Z", false);

            method.instructions.set(p1, p2);
            method.instructions.remove(method.instructions.get(invok_index - 1));
            break;
        }
    }
    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    classNode.accept(writer);
    return writer.toByteArray();
}

From source file:nova.core.wrapper.mc.forge.v17.asm.lib.ASMHelper.java

License:Open Source License

public static boolean isReturn(AbstractInsnNode node) {
    switch (node.getOpcode()) {
    case RET:/*w w  w.j  a  v a 2s. c  o  m*/
    case RETURN:
    case ARETURN:
    case DRETURN:
    case FRETURN:
    case IRETURN:
    case LRETURN:
        return true;

    default:
        return false;
    }
}

From source file:nova.core.wrapper.mc.forge.v17.asm.lib.InsnListPrinter.java

License:Open Source License

private void _visitInsn(AbstractInsnNode insn) {
    switch (insn.getType()) {
    case 0:/*from   ww w  .j a  v a 2s. co  m*/
        visitInsn(insn.getOpcode());
        break;
    case 1:
        IntInsnNode iinsn = (IntInsnNode) insn;
        visitIntInsn(iinsn.getOpcode(), iinsn.operand);
        break;
    case 2:
        VarInsnNode vinsn = (VarInsnNode) insn;
        visitVarInsn(vinsn.getOpcode(), vinsn.var);
        break;
    case 3:
        TypeInsnNode tinsn = (TypeInsnNode) insn;
        visitTypeInsn(tinsn.getOpcode(), tinsn.desc);
        break;
    case 4:
        FieldInsnNode finsn = (FieldInsnNode) insn;
        visitFieldInsn(finsn.getOpcode(), finsn.owner, finsn.name, finsn.desc);
        break;
    case 5:
        MethodInsnNode minsn = (MethodInsnNode) insn;
        visitMethodInsn(minsn.getOpcode(), minsn.owner, minsn.name, minsn.desc);
        break;
    case 6:
        InvokeDynamicInsnNode idinsn = (InvokeDynamicInsnNode) insn;
        visitInvokeDynamicInsn(idinsn.name, idinsn.desc, idinsn.bsm, idinsn.bsmArgs);
        break;
    case 7:
        JumpInsnNode jinsn = (JumpInsnNode) insn;
        visitJumpInsn(jinsn.getOpcode(), jinsn.label.getLabel());
        break;
    case 8:
        LabelNode linsn = (LabelNode) insn;
        visitLabel(linsn.getLabel());
        break;
    case 9:
        LdcInsnNode ldcinsn = (LdcInsnNode) insn;
        visitLdcInsn(ldcinsn.cst);
        break;
    case 10:
        IincInsnNode iiinsn = (IincInsnNode) insn;
        visitIincInsn(iiinsn.var, iiinsn.incr);
        break;
    case 11:
        TableSwitchInsnNode tsinsn = (TableSwitchInsnNode) insn;
        Label[] tslables = new Label[tsinsn.labels.size()];
        for (int i = 0; i < tslables.length; i++) {
            tslables[i] = tsinsn.labels.get(i).getLabel();
        }
        visitTableSwitchInsn(tsinsn.min, tsinsn.max, tsinsn.dflt.getLabel(), tslables);
        break;
    case 12:
        LookupSwitchInsnNode lsinsn = (LookupSwitchInsnNode) insn;
        Label[] lslables = new Label[lsinsn.labels.size()];
        for (int i = 0; i < lslables.length; i++) {
            lslables[i] = lsinsn.labels.get(i).getLabel();
        }
        int[] lskeys = new int[lsinsn.keys.size()];
        for (int i = 0; i < lskeys.length; i++) {
            lskeys[i] = lsinsn.keys.get(i);
        }
        visitLookupSwitchInsn(lsinsn.dflt.getLabel(), lskeys, lslables);
        break;
    case 13:
        MultiANewArrayInsnNode ainsn = (MultiANewArrayInsnNode) insn;
        visitMultiANewArrayInsn(ainsn.desc, ainsn.dims);
        break;
    case 14:
        FrameNode fnode = (FrameNode) insn;
        switch (fnode.type) {
        case -1:
        case 0:
            visitFrame(fnode.type, fnode.local.size(), fnode.local.toArray(), fnode.stack.size(),
                    fnode.stack.toArray());
            break;
        case 1:
            visitFrame(fnode.type, fnode.local.size(), fnode.local.toArray(), 0, null);
            break;
        case 2:
            visitFrame(fnode.type, fnode.local.size(), null, 0, null);
            break;
        case 3:
            visitFrame(fnode.type, 0, null, 0, null);
            break;
        case 4:
            visitFrame(fnode.type, 0, null, 1, fnode.stack.toArray());
        }
        break;
    case 15:
        LineNumberNode lnode = (LineNumberNode) insn;
        visitLineNumber(lnode.line, lnode.start.getLabel());
        break;
    }
}