Example usage for org.objectweb.asm.tree LabelNode getPrevious

List of usage examples for org.objectweb.asm.tree LabelNode getPrevious

Introduction

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

Prototype

public AbstractInsnNode getPrevious() 

Source Link

Document

Returns the previous instruction in the list to which this instruction belongs, if any.

Usage

From source file:de.tuberlin.uebb.jbop.optimizer.utils.LoopMatcher.java

License:Open Source License

private static Loop getTypeOneLoop(final AbstractInsnNode counter, final AbstractInsnNode jump) {
    final LabelNode labelOfJump = ((JumpInsnNode) jump).label;
    final AbstractInsnNode target = labelOfJump.getNext();
    final AbstractInsnNode label = jump.getNext();
    if (!(label instanceof LabelNode)) {
        return null;
    }/* ww  w  .j  a  v  a2  s  .co m*/

    final AbstractInsnNode ifNode = findIf(target, label);
    if (ifNode == null) {
        return null;
    }

    AbstractInsnNode previous = NodeHelper.getPrevious(ifNode);
    AbstractInsnNode endValue = previous.getPrevious();

    final int varIndex = NodeHelper.getVarIndex(counter);
    int varIndex2 = NodeHelper.getVarIndex(previous);
    if (varIndex2 == -1) {
        previous = target;
        endValue = previous.getNext();
        varIndex2 = NodeHelper.getVarIndex(counter);

    }
    if (varIndex != varIndex2) {
        return null;
    }

    final AbstractInsnNode iinc = labelOfJump.getPrevious();
    if (endValue instanceof LabelNode) {
        endValue = NodeHelper.getInsnNodeFor(0);
    }
    final AbstractInsnNode startValue = counter.getPrevious();

    final AbstractInsnNode firstOfBody = ((JumpInsnNode) ifNode).label.getNext();
    return new Loop(ifNode, startValue, endValue, iinc, firstOfBody, ifNode, counter);
}

From source file:de.tuberlin.uebb.jbop.optimizer.var.LocalVarInliner.java

License:Open Source License

private AbstractInsnNode handleIf(final AbstractInsnNode currentNode, final Map<Integer, Object> knownValues,
        final InsnList original, final MethodNode methodNode) {
    if (LoopMatcher.isIfOfLoop(currentNode)) {
        return skipVars(currentNode, knownValues);
    }//from   w w  w  .j ava  2 s.  com
    final LabelNode endIf = ((JumpInsnNode) currentNode).label;
    final AbstractInsnNode end1 = endIf.getNext();
    handleNodes(currentNode.getNext(), endIf, original, new HashMap<>(knownValues), methodNode);
    AbstractInsnNode end2 = null;
    final List<Integer> stores = getStores(currentNode.getNext(), end1);
    if (endIf.getPrevious() instanceof JumpInsnNode) {
        end2 = ((JumpInsnNode) endIf.getPrevious()).label.getNext();
        handleNodes(end1, end2, original, new HashMap<>(knownValues), methodNode);
        stores.addAll(getStores(endIf, end2));
    }
    for (final Integer var : stores) {
        knownValues.remove(var);
    }
    if (end2 != null) {
        return end2;
    }
    return end1;
}