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:de.tuberlin.uebb.jbop.optimizer.controlflow.ConstantIfInliner.java

License:Open Source License

private boolean checkNullInstruction(final AbstractInsnNode node1, final AbstractInsnNode currentNode,
        final InsnList list, final Iterator<AbstractInsnNode> iterator) throws JBOPClassException {
    final AbstractInsnNode node2 = NodeHelper.getPrevious(node1);
    if ((NodeHelper.getFieldname(node1) != null) && (NodeHelper.getVarIndex(node2) == 0)) {
        final Object currentValue = ClassAccessor.getCurrentValue(inputObject, NodeHelper.getFieldname(node1));
        if (currentValue != null) {
            return false;
        }//  w ww.  j a  va  2  s  .  c om
        removeNodes(currentNode, node1, node2, null, list, iterator, //
                evalSingleOpValue(null, currentNode.getOpcode()));
        return false;
    }
    return true;
}

From source file:de.tuberlin.uebb.jbop.optimizer.controlflow.ConstantIfInliner.java

License:Open Source License

private boolean evaluate(final AbstractInsnNode currentNode, final AbstractInsnNode node1, final Number op1,
        final Number op2) {
    final boolean eval;
    if (NodeHelper.isTwoValueIf(currentNode)) {
        eval = evalTwoOpValue(op2, op1, currentNode.getOpcode());
    } else {/* ww w . j  a v  a 2  s .c om*/
        final Number operator = calculateOparator(node1, op1, op2);
        eval = evalSingleOpValue(operator, currentNode.getOpcode());
    }
    return eval;
}

From source file:de.tuberlin.uebb.jbop.optimizer.controlflow.ConstantIfInliner.java

License:Open Source License

private Number calculateOparator(final AbstractInsnNode node1, final Number op1, final Number op2) {
    Number newNumber = op1;/*  w  ww.j av  a  2  s  .c  o m*/
    if (isCompare(node1)) {
        switch (node1.getOpcode()) {
        case Opcodes.DCMPG:
        case Opcodes.DCMPL:
            newNumber = Double.valueOf(op2.doubleValue() - op1.doubleValue());
            break;
        case Opcodes.FCMPG:
        case Opcodes.FCMPL:
            newNumber = Float.valueOf(op2.floatValue() - op1.floatValue());
            break;
        case Opcodes.LCMP:
            newNumber = Long.valueOf(op2.longValue() - op1.longValue());
            break;
        default:
            newNumber = op1;
        }
    }
    return newNumber;
}

From source file:de.tuberlin.uebb.jbop.optimizer.controlflow.ConstantIfInliner.java

License:Open Source License

private boolean isCompare(final AbstractInsnNode node1) {
    final int opcode = node1.getOpcode();
    if (opcode == Opcodes.DCMPG) {
        return true;
    }/*from w w  w  .ja  v  a 2 s .c  o  m*/
    if (opcode == Opcodes.DCMPL) {
        return true;
    }
    if (opcode == Opcodes.FCMPG) {
        return true;
    }
    if (opcode == Opcodes.FCMPL) {
        return true;
    }
    if (opcode == Opcodes.LCMP) {
        return true;
    }
    return false;
}

From source file:de.tuberlin.uebb.jbop.optimizer.controlflow.ConstantIfInliner.java

License:Open Source License

private void removeNodes(final AbstractInsnNode currentNode, final AbstractInsnNode node1,
        final AbstractInsnNode node3, final AbstractInsnNode node4, final InsnList list,
        final Iterator<AbstractInsnNode> iterator, //
        final boolean eval) {
    list.remove(node1);//w  ww . j a  v  a2 s.c o  m
    if ((node3 != null) && (node3 != node1)) {
        list.remove(node3);
    }
    if ((node4 != null) && (node4 != node1) && (node4 != node3)) {
        list.remove(node4);
    }
    AbstractInsnNode label = ((JumpInsnNode) currentNode).label;
    list.remove(currentNode);
    if (!eval) {
        final AbstractInsnNode previousOfLabel = NodeHelper.getPrevious(label);
        if (previousOfLabel.getOpcode() == Opcodes.GOTO) {
            while (iterator.hasNext()) {
                final AbstractInsnNode node = iterator.next();
                if (node == label) {
                    break;
                }
            }
            label = ((JumpInsnNode) previousOfLabel).label;
            list.remove(previousOfLabel);
        } else {
            return;
        }
    }

    while (iterator.hasNext()) {
        final AbstractInsnNode node = iterator.next();
        list.remove(node);
        if (node == label) {
            break;
        }
    }

}

From source file:de.tuberlin.uebb.jbop.optimizer.methodsplitter.Block.java

License:Open Source License

/**
 * Objects that are not parameters and not written before
 * these can be:/*from  w ww  .ja  v a2  s.  c  o m*/
 * getField
 * getStatic
 * new
 * new array
 * new multi array
 * return type of method call
 */
private Type resolveType(final AbstractInsnNode node) {
    int arrayCount = 0;
    AbstractInsnNode currentNode = NodeHelper.getPrevious(node);
    while (currentNode != null) {
        final int opcode2 = currentNode.getOpcode();
        if (opcode2 == Opcodes.NEWARRAY) {
            final int operand = ((IntInsnNode) currentNode).operand;
            return getObjectType(operand);
        } else if (opcode2 == Opcodes.ANEWARRAY) {
            return getObjectType(((TypeInsnNode) currentNode).desc);
        } else if (opcode2 == Opcodes.MULTIANEWARRAY) {
            return getObjectType(((MultiANewArrayInsnNode) currentNode).desc);
        } else if (opcode2 == Opcodes.NEW) {
            final String desc = ((TypeInsnNode) currentNode).desc;
            return getObjectType(desc);
        } else if ((opcode2 >= Opcodes.IALOAD) && (opcode2 <= Opcodes.AALOAD)) {
            arrayCount++;
        } else if ((opcode2 == Opcodes.GETFIELD) || (opcode2 == Opcodes.GETSTATIC)) {
            final String desc = ((FieldInsnNode) currentNode).desc;
            return getObjectType(removeArrayType(desc, arrayCount));
        } else if ((opcode2 == Opcodes.ALOAD)) {
            final Type type2 = readers.getFirstVar(((VarInsnNode) currentNode).var).getParameterType();
            return getObjectType(removeArrayType(type2.getDescriptor(), arrayCount));
        } else if ((opcode2 >= Opcodes.INVOKEVIRTUAL) && (opcode2 <= Opcodes.INVOKEDYNAMIC)) {
            return Type.getReturnType(((MethodInsnNode) currentNode).desc);
        }
        currentNode = NodeHelper.getPrevious(currentNode);
    }
    return Type.VOID_TYPE;
}

From source file:de.tuberlin.uebb.jbop.optimizer.methodsplitter.Block.java

License:Open Source License

private Type getTypeIfSimpleType(final AbstractInsnNode node) {
    final int opcode = node.getOpcode();
    if ((opcode == Opcodes.ILOAD) || (opcode == Opcodes.ISTORE) || (opcode == Opcodes.IRETURN)) {
        return Type.INT_TYPE;
    }/*w  w w .  j  a  v a  2  s. c o  m*/
    if ((opcode == Opcodes.FLOAD) || (opcode == Opcodes.FSTORE) || (opcode == Opcodes.FRETURN)) {
        return Type.FLOAT_TYPE;
    }
    if ((opcode == Opcodes.LLOAD) || (opcode == Opcodes.LSTORE) || (opcode == Opcodes.LRETURN)) {
        return Type.LONG_TYPE;
    }
    if ((opcode == Opcodes.DLOAD) || (opcode == Opcodes.DSTORE) || (opcode == Opcodes.DRETURN)) {
        return Type.DOUBLE_TYPE;
    }
    return null;
}

From source file:de.tuberlin.uebb.jbop.optimizer.methodsplitter.Block.java

License:Open Source License

private static boolean isLoad(final AbstractInsnNode currentNode) {
    if (currentNode == null) {
        return false;
    }/*from  w ww .  j  av  a  2s.  c o  m*/
    if ((currentNode.getOpcode() >= Opcodes.ILOAD) && (currentNode.getOpcode() <= Opcodes.ALOAD)) {
        return true;
    }
    return false;
}

From source file:de.tuberlin.uebb.jbop.optimizer.methodsplitter.Block.java

License:Open Source License

private static boolean isStore(final AbstractInsnNode currentNode) {
    if (currentNode == null) {
        return false;
    }/*w w  w.j a v  a2  s .c om*/
    if ((currentNode.getOpcode() >= Opcodes.ISTORE) && (currentNode.getOpcode() <= Opcodes.ASTORE)) {
        return true;
    }
    if ((currentNode.getOpcode() >= Opcodes.IRETURN) && (currentNode.getOpcode() <= Opcodes.RETURN)) {
        return true;
    }
    return false;
}

From source file:de.tuberlin.uebb.jbop.optimizer.methodsplitter.MethodSplitter.java

License:Open Source License

private InsnList clean(final InsnList original) {
    final ListIterator<AbstractInsnNode> iterator = original.iterator();

    while (iterator.hasNext()) {
        final AbstractInsnNode next = iterator.next();
        if ((next instanceof SplitMarkNode) || (next.getOpcode() == NOP)) {
            original.remove(next);//from   w ww .  j ava2 s  .c  om
        }
    }
    return original;
}