Package org.objectweb.asm.tree

Examples of org.objectweb.asm.tree.LabelNode


     *
     */
    void genPostCall(MethodVisitor mv) {
        loadVar(mv, TOBJECT, methodWeaver.getFiberVar());
        mv.visitMethodInsn(INVOKEVIRTUAL, FIBER_CLASS, "up", "()I");
        LabelNode restoreLabel = new LabelNode();
        LabelNode saveLabel = new LabelNode();
        LabelNode unwindLabel = new LabelNode();
        LabelNode[] labels = new LabelNode[] { resumeLabel, restoreLabel, saveLabel,
                unwindLabel };
        new TableSwitchInsnNode(0, 3, resumeLabel, labels).accept(mv);
        genSave(mv, saveLabel);
        genUnwind(mv, unwindLabel);
View Full Code Here


                    from = bb.startPos + 1; // first instruction is consumed
                } // else no different from any other block
            }
            int to = bb.endPos;
            for (int i = from; i <= to; i++) {
                LabelNode l = mf.getLabelAt(i);
                if (l != null) {
                    l.accept(mv);
                }
                bb.getInstruction(i).accept(mv);
            }
            lastBB = bb;
        }
        if (lastBB != null) {
            LabelNode l = methodFlow.getLabelAt(lastBB.endPos+1);
            if (l != null) {
                l.accept(mv);
            }
        }
    }
View Full Code Here

        // The prelude doesn't need more than two words in the stack.
        // The callweaver gen* methods may need more.
        ensureMaxStack(2);

        // switch stmt
        LabelNode startLabel = mf.getOrCreateLabelAtPos(0);
        LabelNode errLabel = new LabelNode();
       
        LabelNode[] labels = new LabelNode[callWeavers.size() + 1];
        labels[0] = startLabel;
        for (int i = 0; i < callWeavers.size(); i++) {
            labels[i + 1] = new LabelNode();
        }
        new TableSwitchInsnNode(0, callWeavers.size(), errLabel, labels).accept(mv);
       
        errLabel.accept(mv);
        mv.visitVarInsn(ALOAD, getFiberVar());
        mv.visitMethodInsn(INVOKEVIRTUAL, FIBER_CLASS, "wrongPC", "()V");
        // Generate pass through down code, one for each pausable method
        // invocation
        int last = callWeavers.size() - 1;
View Full Code Here

     *
     * NORMAL_EXCEPTION_HANDLING:
     */
    private void genException(MethodVisitor mv, BasicBlock bb, List<CallWeaver> cwList) {
        bb.startLabel.accept(mv);
        LabelNode resumeLabel = new LabelNode();
        VMType.loadVar(mv, VMType.TOBJECT, getFiberVar());
        mv.visitMethodInsn(INVOKEVIRTUAL, FIBER_CLASS, "upEx", "()I");
        // fiber.pc is on stack
        LabelNode[] labels = new LabelNode[cwList.size()];
        int[] keys = new int[cwList.size()];
        for (int i = 0; i < cwList.size(); i++) {
            labels[i] = new LabelNode();
            keys[i] = callWeavers.indexOf(cwList.get(i)) + 1;
        }
       
        new LookupSwitchInsnNode(resumeLabel, keys, labels).accept(mv);
        int i = 0;
        for (CallWeaver cw: cwList) {
            if (i > 0) {
                // This is the jump (to normal exception handling) for the previous
                // switch case.
                mv.visitJumpInsn(GOTO, resumeLabel.getLabel());
            }
            labels[i].accept(mv);
            cw.genRestoreEx(mv, labels[i]);
            i++;
        }
       
        // Consume the first instruction because we have already consumed the
        // corresponding label. (The standard visitInstructions code does a
        // visitLabel before visiting the instruction itself)
        resumeLabel.accept(mv);
        bb.getInstruction(bb.startPos).accept(mv);
    }
View Full Code Here

    public void restoreNonInstructionNodes() {
        InsnList newinsns = new InsnList();
        int sz = instructions.size();
        for (int i = 0; i < sz; i++) {
            LabelNode l = getLabelAt(i);
            if (l != null) {
                newinsns.add(l);
            }
            LineNumberNode ln = lineNumberNodes.get(i);
            if (ln != null) {
                newinsns.add(ln);
            }
            AbstractInsnNode ain = instructions.get(i);
            newinsns.add(ain);
        }
       
        LabelNode l = getLabelAt(sz);
        if (l != null) {
            newinsns.add(l);
        }
        LineNumberNode ln = lineNumberNodes.get(sz);
        if (ln != null) {
View Full Code Here

        setLabel(instructions.size(), super.getLabelNode(label));
    }
   
    @Override
    public void visitLineNumber(int line, Label start) {
        LabelNode ln = getLabelNode(start);
        lineNumberNodes.put(instructions.size(), new LineNumberNode(line, ln));
    }
View Full Code Here

        // preparatory phase
        int numInstructions = instructions.size();
        basicBlocks = new BBList();
        // Note: i modified within the loop
        for (int i = 0; i < numInstructions; i++) {
            LabelNode l = getOrCreateLabelAtPos(i);
            BasicBlock bb = getOrCreateBasicBlock(l);
            i = bb.initialize(i); // i now points to the last instruction in bb.
            basicBlocks.add(bb);
        }
    }
View Full Code Here

        posToLabelMap.set(pos, l);
        labelToPosMap.put(l, pos);
    }
   
    LabelNode getOrCreateLabelAtPos(int pos) {
        LabelNode ret = null;
        if (pos < posToLabelMap.size()) {
            ret = posToLabelMap.get(pos);
        }
        if (ret == null) {
            ret = new LabelNode();
            setLabel(pos, ret);
        }
        return ret;
    }
View Full Code Here

    return this.classFlow.detector();
}

    public void resetLabels() {
        for (int i = 0; i < posToLabelMap.size(); i++) {
            LabelNode ln = posToLabelMap.get(i);
            if (ln != null) {
                ln.resetLabel();
            }
        }
       
    }
View Full Code Here

                case IF_ICMPLE:
                case IF_ACMPEQ:
                case IF_ACMPNE:
                case JSR:
                case GOTO:
                    LabelNode l = ((JumpInsnNode) ain).label;
                    bb = flow.getOrCreateBasicBlock(l);
                    if (opcode == JSR) {
                        bb.setFlag(IS_SUBROUTINE);
                        hasFollower = false;
                    }
                    addSuccessor(bb);
                    if (opcode == GOTO) {
                        hasFollower = false;
                    }
                    endOfBB = true;
                    break;

                case RET:
                case IRETURN:
                case LRETURN:
                case FRETURN:
                case DRETURN:
                case ARETURN:
                case RETURN:
                case ATHROW:
                    hasFollower = false;
                    endOfBB = true;
                    break;

                case TABLESWITCH:
                case LOOKUPSWITCH:
                    LabelNode defaultLabel;
                    List<LabelNode> otherLabels;
                    if (opcode == TABLESWITCH) {
                        defaultLabel = ((TableSwitchInsnNode) ain).dflt;
                        otherLabels = ((TableSwitchInsnNode) ain).labels;
                    } else {
                        defaultLabel = ((LookupSwitchInsnNode) ain).dflt;
                        otherLabels = ((LookupSwitchInsnNode) ain).labels;
                    }
                    for (Iterator<LabelNode> it = otherLabels.iterator(); it.hasNext();) {
                        l = it.next();
                        addSuccessor(flow.getOrCreateBasicBlock(l));
                    }
                    addSuccessor(flow.getOrCreateBasicBlock(defaultLabel));
                    endOfBB = true;
                    hasFollower = false;
                    break;

                case INVOKEVIRTUAL:
                case INVOKESTATIC:
                case INVOKEINTERFACE:
                case INVOKESPECIAL:
                    if (flow.isPausableMethodInsn((MethodInsnNode) ain)) {
                        LabelNode il = flow.getOrCreateLabelAtPos(pos);
                        if (pos == startPos) {
                            setFlag(PAUSABLE);
                        } else {
                            bb = flow.getOrCreateBasicBlock(il);
                            bb.setFlag(PAUSABLE);
                            addSuccessor(bb);
                            pos--; // don't consume this instruction
                            hasFollower = true;
                            endOfBB = true;
                        }
                    }
                    break;

                default:
                  if (opcode >= 26 && opcode <= 45)
                      throw new IllegalStateException("instruction variants not expected here");
                 
                    break;
            }

            if (endOfBB) break;
        }
        endPos = pos;
        if (hasFollower && (pos + 1) < flow.instructions.size()) {
            // add the following basic block as a successor
            LabelNode l = flow.getOrCreateLabelAtPos(pos + 1);
            bb = flow.getOrCreateBasicBlock(l);
            addFollower(bb);
        }

        return pos;
View Full Code Here

TOP

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

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.