List of usage examples for org.objectweb.asm.tree AbstractInsnNode getOpcode
public int getOpcode()
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; }