Search in sources :

Example 1 with AnalyzerException

use of org.apache.tapestry5.internal.plastic.asm.tree.analysis.AnalyzerException in project tapestry-5 by apache.

the class Analyzer method findSubroutine.

/**
 * Follows the control flow graph of the currently analyzed method, starting at the given
 * instruction index, and stores a copy of the given subroutine in {@link #subroutines} for each
 * encountered instruction. Jumps to nested subroutines are <i>not</i> followed: instead, the
 * corresponding instructions are put in the given list.
 *
 * @param insnIndex an instruction index.
 * @param subroutine a subroutine.
 * @param jsrInsns where the jsr instructions for nested subroutines must be put.
 * @throws AnalyzerException if the control flow graph can fall off the end of the code.
 */
private void findSubroutine(final int insnIndex, final Subroutine subroutine, final List<AbstractInsnNode> jsrInsns) throws AnalyzerException {
    ArrayList<Integer> instructionIndicesToProcess = new ArrayList<>();
    instructionIndicesToProcess.add(insnIndex);
    while (!instructionIndicesToProcess.isEmpty()) {
        int currentInsnIndex = instructionIndicesToProcess.remove(instructionIndicesToProcess.size() - 1);
        if (currentInsnIndex < 0 || currentInsnIndex >= insnListSize) {
            throw new AnalyzerException(null, "Execution can fall off the end of the code");
        }
        if (subroutines[currentInsnIndex] != null) {
            continue;
        }
        subroutines[currentInsnIndex] = new Subroutine(subroutine);
        AbstractInsnNode currentInsn = insnList.get(currentInsnIndex);
        // Push the normal successors of currentInsn onto instructionIndicesToProcess.
        if (currentInsn instanceof JumpInsnNode) {
            if (currentInsn.getOpcode() == JSR) {
                // Do not follow a jsr, it leads to another subroutine!
                jsrInsns.add(currentInsn);
            } else {
                JumpInsnNode jumpInsn = (JumpInsnNode) currentInsn;
                instructionIndicesToProcess.add(insnList.indexOf(jumpInsn.label));
            }
        } else if (currentInsn instanceof TableSwitchInsnNode) {
            TableSwitchInsnNode tableSwitchInsn = (TableSwitchInsnNode) currentInsn;
            findSubroutine(insnList.indexOf(tableSwitchInsn.dflt), subroutine, jsrInsns);
            for (int i = tableSwitchInsn.labels.size() - 1; i >= 0; --i) {
                LabelNode labelNode = tableSwitchInsn.labels.get(i);
                instructionIndicesToProcess.add(insnList.indexOf(labelNode));
            }
        } else if (currentInsn instanceof LookupSwitchInsnNode) {
            LookupSwitchInsnNode lookupSwitchInsn = (LookupSwitchInsnNode) currentInsn;
            findSubroutine(insnList.indexOf(lookupSwitchInsn.dflt), subroutine, jsrInsns);
            for (int i = lookupSwitchInsn.labels.size() - 1; i >= 0; --i) {
                LabelNode labelNode = lookupSwitchInsn.labels.get(i);
                instructionIndicesToProcess.add(insnList.indexOf(labelNode));
            }
        }
        // Push the exception handler successors of currentInsn onto instructionIndicesToProcess.
        List<TryCatchBlockNode> insnHandlers = handlers[currentInsnIndex];
        if (insnHandlers != null) {
            for (TryCatchBlockNode tryCatchBlock : insnHandlers) {
                instructionIndicesToProcess.add(insnList.indexOf(tryCatchBlock.handler));
            }
        }
        // Push the next instruction, if the control flow can go from currentInsn to the next.
        switch(currentInsn.getOpcode()) {
            case GOTO:
            case RET:
            case TABLESWITCH:
            case LOOKUPSWITCH:
            case IRETURN:
            case LRETURN:
            case FRETURN:
            case DRETURN:
            case ARETURN:
            case RETURN:
            case ATHROW:
                break;
            default:
                instructionIndicesToProcess.add(currentInsnIndex + 1);
                break;
        }
    }
}
Also used : LabelNode(org.apache.tapestry5.internal.plastic.asm.tree.LabelNode) TryCatchBlockNode(org.apache.tapestry5.internal.plastic.asm.tree.TryCatchBlockNode) TableSwitchInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.TableSwitchInsnNode) ArrayList(java.util.ArrayList) AbstractInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.AbstractInsnNode) JumpInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.JumpInsnNode) LookupSwitchInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.LookupSwitchInsnNode)

Example 2 with AnalyzerException

use of org.apache.tapestry5.internal.plastic.asm.tree.analysis.AnalyzerException in project tapestry-5 by apache.

the class BasicVerifier method naryOperation.

@Override
public BasicValue naryOperation(final AbstractInsnNode insn, final List<? extends BasicValue> values) throws AnalyzerException {
    int opcode = insn.getOpcode();
    if (opcode == MULTIANEWARRAY) {
        for (BasicValue value : values) {
            if (!BasicValue.INT_VALUE.equals(value)) {
                throw new AnalyzerException(insn, null, BasicValue.INT_VALUE, value);
            }
        }
    } else {
        int i = 0;
        int j = 0;
        if (opcode != INVOKESTATIC && opcode != INVOKEDYNAMIC) {
            Type owner = Type.getObjectType(((MethodInsnNode) insn).owner);
            if (!isSubTypeOf(values.get(i++), newValue(owner))) {
                throw new AnalyzerException(insn, "Method owner", newValue(owner), values.get(0));
            }
        }
        String methodDescriptor = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc : ((MethodInsnNode) insn).desc;
        Type[] args = Type.getArgumentTypes(methodDescriptor);
        while (i < values.size()) {
            BasicValue expected = newValue(args[j++]);
            BasicValue actual = values.get(i++);
            if (!isSubTypeOf(actual, expected)) {
                throw new AnalyzerException(insn, "Argument " + j, expected, actual);
            }
        }
    }
    return super.naryOperation(insn, values);
}
Also used : Type(org.apache.tapestry5.internal.plastic.asm.Type)

Example 3 with AnalyzerException

use of org.apache.tapestry5.internal.plastic.asm.tree.analysis.AnalyzerException in project tapestry-5 by apache.

the class BasicVerifier method binaryOperation.

@Override
public BasicValue binaryOperation(final AbstractInsnNode insn, final BasicValue value1, final BasicValue value2) throws AnalyzerException {
    BasicValue expected1;
    BasicValue expected2;
    switch(insn.getOpcode()) {
        case IALOAD:
            expected1 = newValue(Type.getType("[I"));
            expected2 = BasicValue.INT_VALUE;
            break;
        case BALOAD:
            if (isSubTypeOf(value1, newValue(Type.getType("[Z")))) {
                expected1 = newValue(Type.getType("[Z"));
            } else {
                expected1 = newValue(Type.getType("[B"));
            }
            expected2 = BasicValue.INT_VALUE;
            break;
        case CALOAD:
            expected1 = newValue(Type.getType("[C"));
            expected2 = BasicValue.INT_VALUE;
            break;
        case SALOAD:
            expected1 = newValue(Type.getType("[S"));
            expected2 = BasicValue.INT_VALUE;
            break;
        case LALOAD:
            expected1 = newValue(Type.getType("[J"));
            expected2 = BasicValue.INT_VALUE;
            break;
        case FALOAD:
            expected1 = newValue(Type.getType("[F"));
            expected2 = BasicValue.INT_VALUE;
            break;
        case DALOAD:
            expected1 = newValue(Type.getType("[D"));
            expected2 = BasicValue.INT_VALUE;
            break;
        case AALOAD:
            expected1 = newValue(Type.getType("[Ljava/lang/Object;"));
            expected2 = BasicValue.INT_VALUE;
            break;
        case IADD:
        case ISUB:
        case IMUL:
        case IDIV:
        case IREM:
        case ISHL:
        case ISHR:
        case IUSHR:
        case IAND:
        case IOR:
        case IXOR:
        case IF_ICMPEQ:
        case IF_ICMPNE:
        case IF_ICMPLT:
        case IF_ICMPGE:
        case IF_ICMPGT:
        case IF_ICMPLE:
            expected1 = BasicValue.INT_VALUE;
            expected2 = BasicValue.INT_VALUE;
            break;
        case FADD:
        case FSUB:
        case FMUL:
        case FDIV:
        case FREM:
        case FCMPL:
        case FCMPG:
            expected1 = BasicValue.FLOAT_VALUE;
            expected2 = BasicValue.FLOAT_VALUE;
            break;
        case LADD:
        case LSUB:
        case LMUL:
        case LDIV:
        case LREM:
        case LAND:
        case LOR:
        case LXOR:
        case LCMP:
            expected1 = BasicValue.LONG_VALUE;
            expected2 = BasicValue.LONG_VALUE;
            break;
        case LSHL:
        case LSHR:
        case LUSHR:
            expected1 = BasicValue.LONG_VALUE;
            expected2 = BasicValue.INT_VALUE;
            break;
        case DADD:
        case DSUB:
        case DMUL:
        case DDIV:
        case DREM:
        case DCMPL:
        case DCMPG:
            expected1 = BasicValue.DOUBLE_VALUE;
            expected2 = BasicValue.DOUBLE_VALUE;
            break;
        case IF_ACMPEQ:
        case IF_ACMPNE:
            expected1 = BasicValue.REFERENCE_VALUE;
            expected2 = BasicValue.REFERENCE_VALUE;
            break;
        case PUTFIELD:
            FieldInsnNode fieldInsn = (FieldInsnNode) insn;
            expected1 = newValue(Type.getObjectType(fieldInsn.owner));
            expected2 = newValue(Type.getType(fieldInsn.desc));
            break;
        default:
            throw new AssertionError();
    }
    if (!isSubTypeOf(value1, expected1)) {
        throw new AnalyzerException(insn, "First argument", expected1, value1);
    } else if (!isSubTypeOf(value2, expected2)) {
        throw new AnalyzerException(insn, "Second argument", expected2, value2);
    }
    if (insn.getOpcode() == AALOAD) {
        return getElementValue(value1);
    } else {
        return super.binaryOperation(insn, value1, value2);
    }
}
Also used : FieldInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.FieldInsnNode)

Example 4 with AnalyzerException

use of org.apache.tapestry5.internal.plastic.asm.tree.analysis.AnalyzerException in project tapestry-5 by apache.

the class CheckClassAdapter method verify.

/**
 * Checks the given class.
 *
 * @param classReader the class to be checked.
 * @param loader a <code>ClassLoader</code> which will be used to load referenced classes. May be
 *     {@literal null}.
 * @param printResults whether to print the results of the bytecode verification.
 * @param printWriter where the results (or the stack trace in case of error) must be printed.
 */
public static void verify(final ClassReader classReader, final ClassLoader loader, final boolean printResults, final PrintWriter printWriter) {
    ClassNode classNode = new ClassNode();
    classReader.accept(new CheckClassAdapter(/*latest*/
    Opcodes.ASM10_EXPERIMENTAL, classNode, false) {
    }, ClassReader.SKIP_DEBUG);
    Type syperType = classNode.superName == null ? null : Type.getObjectType(classNode.superName);
    List<MethodNode> methods = classNode.methods;
    List<Type> interfaces = new ArrayList<>();
    for (String interfaceName : classNode.interfaces) {
        interfaces.add(Type.getObjectType(interfaceName));
    }
    for (MethodNode method : methods) {
        SimpleVerifier verifier = new SimpleVerifier(Type.getObjectType(classNode.name), syperType, interfaces, (classNode.access & Opcodes.ACC_INTERFACE) != 0);
        Analyzer<BasicValue> analyzer = new Analyzer<>(verifier);
        if (loader != null) {
            verifier.setClassLoader(loader);
        }
        try {
            analyzer.analyze(classNode.name, method);
        } catch (AnalyzerException e) {
            e.printStackTrace(printWriter);
        }
        if (printResults) {
            printAnalyzerResult(method, analyzer, printWriter);
        }
    }
    printWriter.flush();
}
Also used : ClassNode(org.apache.tapestry5.internal.plastic.asm.tree.ClassNode) AnalyzerException(org.apache.tapestry5.internal.plastic.asm.tree.analysis.AnalyzerException) SimpleVerifier(org.apache.tapestry5.internal.plastic.asm.tree.analysis.SimpleVerifier) ArrayList(java.util.ArrayList) Analyzer(org.apache.tapestry5.internal.plastic.asm.tree.analysis.Analyzer) BasicValue(org.apache.tapestry5.internal.plastic.asm.tree.analysis.BasicValue) Type(org.apache.tapestry5.internal.plastic.asm.Type) MethodNode(org.apache.tapestry5.internal.plastic.asm.tree.MethodNode)

Example 5 with AnalyzerException

use of org.apache.tapestry5.internal.plastic.asm.tree.analysis.AnalyzerException in project tapestry-5 by apache.

the class Analyzer method analyze.

/**
 * Analyzes the given method.
 *
 * @param owner the internal name of the class to which 'method' belongs.
 * @param method the method to be analyzed. The maxStack and maxLocals fields must have correct
 *     values.
 * @return the symbolic state of the execution stack frame at each bytecode instruction of the
 *     method. The size of the returned array is equal to the number of instructions (and labels)
 *     of the method. A given frame is {@literal null} if and only if the corresponding
 *     instruction cannot be reached (dead code).
 * @throws AnalyzerException if a problem occurs during the analysis.
 */
@SuppressWarnings("unchecked")
public Frame<V>[] analyze(final String owner, final MethodNode method) throws AnalyzerException {
    if ((method.access & (ACC_ABSTRACT | ACC_NATIVE)) != 0) {
        frames = (Frame<V>[]) new Frame<?>[0];
        return frames;
    }
    insnList = method.instructions;
    insnListSize = insnList.size();
    handlers = (List<TryCatchBlockNode>[]) new List<?>[insnListSize];
    frames = (Frame<V>[]) new Frame<?>[insnListSize];
    subroutines = new Subroutine[insnListSize];
    inInstructionsToProcess = new boolean[insnListSize];
    instructionsToProcess = new int[insnListSize];
    numInstructionsToProcess = 0;
    // fact that execution can flow from this instruction to the exception handler.
    for (int i = 0; i < method.tryCatchBlocks.size(); ++i) {
        TryCatchBlockNode tryCatchBlock = method.tryCatchBlocks.get(i);
        int startIndex = insnList.indexOf(tryCatchBlock.start);
        int endIndex = insnList.indexOf(tryCatchBlock.end);
        for (int j = startIndex; j < endIndex; ++j) {
            List<TryCatchBlockNode> insnHandlers = handlers[j];
            if (insnHandlers == null) {
                insnHandlers = new ArrayList<>();
                handlers[j] = insnHandlers;
            }
            insnHandlers.add(tryCatchBlock);
        }
    }
    // For each instruction, compute the subroutine to which it belongs.
    // Follow the main 'subroutine', and collect the jsr instructions to nested subroutines.
    Subroutine main = new Subroutine(null, method.maxLocals, null);
    List<AbstractInsnNode> jsrInsns = new ArrayList<>();
    findSubroutine(0, main, jsrInsns);
    // Follow the nested subroutines, and collect their own nested subroutines, until all
    // subroutines are found.
    Map<LabelNode, Subroutine> jsrSubroutines = new HashMap<>();
    while (!jsrInsns.isEmpty()) {
        JumpInsnNode jsrInsn = (JumpInsnNode) jsrInsns.remove(0);
        Subroutine subroutine = jsrSubroutines.get(jsrInsn.label);
        if (subroutine == null) {
            subroutine = new Subroutine(jsrInsn.label, method.maxLocals, jsrInsn);
            jsrSubroutines.put(jsrInsn.label, subroutine);
            findSubroutine(insnList.indexOf(jsrInsn.label), subroutine, jsrInsns);
        } else {
            subroutine.callers.add(jsrInsn);
        }
    }
    // intermediate step above to find the real ones).
    for (int i = 0; i < insnListSize; ++i) {
        if (subroutines[i] != null && subroutines[i].start == null) {
            subroutines[i] = null;
        }
    }
    // Initializes the data structures for the control flow analysis.
    Frame<V> currentFrame = computeInitialFrame(owner, method);
    merge(0, currentFrame, null);
    init(owner, method);
    // Control flow analysis.
    while (numInstructionsToProcess > 0) {
        // Get and remove one instruction from the list of instructions to process.
        int insnIndex = instructionsToProcess[--numInstructionsToProcess];
        Frame<V> oldFrame = frames[insnIndex];
        Subroutine subroutine = subroutines[insnIndex];
        inInstructionsToProcess[insnIndex] = false;
        // Simulate the execution of this instruction.
        AbstractInsnNode insnNode = null;
        try {
            insnNode = method.instructions.get(insnIndex);
            int insnOpcode = insnNode.getOpcode();
            int insnType = insnNode.getType();
            if (insnType == AbstractInsnNode.LABEL || insnType == AbstractInsnNode.LINE || insnType == AbstractInsnNode.FRAME) {
                merge(insnIndex + 1, oldFrame, subroutine);
                newControlFlowEdge(insnIndex, insnIndex + 1);
            } else {
                currentFrame.init(oldFrame).execute(insnNode, interpreter);
                subroutine = subroutine == null ? null : new Subroutine(subroutine);
                if (insnNode instanceof JumpInsnNode) {
                    JumpInsnNode jumpInsn = (JumpInsnNode) insnNode;
                    if (insnOpcode != GOTO && insnOpcode != JSR) {
                        currentFrame.initJumpTarget(insnOpcode, /* target = */
                        null);
                        merge(insnIndex + 1, currentFrame, subroutine);
                        newControlFlowEdge(insnIndex, insnIndex + 1);
                    }
                    int jumpInsnIndex = insnList.indexOf(jumpInsn.label);
                    currentFrame.initJumpTarget(insnOpcode, jumpInsn.label);
                    if (insnOpcode == JSR) {
                        merge(jumpInsnIndex, currentFrame, new Subroutine(jumpInsn.label, method.maxLocals, jumpInsn));
                    } else {
                        merge(jumpInsnIndex, currentFrame, subroutine);
                    }
                    newControlFlowEdge(insnIndex, jumpInsnIndex);
                } else if (insnNode instanceof LookupSwitchInsnNode) {
                    LookupSwitchInsnNode lookupSwitchInsn = (LookupSwitchInsnNode) insnNode;
                    int targetInsnIndex = insnList.indexOf(lookupSwitchInsn.dflt);
                    currentFrame.initJumpTarget(insnOpcode, lookupSwitchInsn.dflt);
                    merge(targetInsnIndex, currentFrame, subroutine);
                    newControlFlowEdge(insnIndex, targetInsnIndex);
                    for (int i = 0; i < lookupSwitchInsn.labels.size(); ++i) {
                        LabelNode label = lookupSwitchInsn.labels.get(i);
                        targetInsnIndex = insnList.indexOf(label);
                        currentFrame.initJumpTarget(insnOpcode, label);
                        merge(targetInsnIndex, currentFrame, subroutine);
                        newControlFlowEdge(insnIndex, targetInsnIndex);
                    }
                } else if (insnNode instanceof TableSwitchInsnNode) {
                    TableSwitchInsnNode tableSwitchInsn = (TableSwitchInsnNode) insnNode;
                    int targetInsnIndex = insnList.indexOf(tableSwitchInsn.dflt);
                    currentFrame.initJumpTarget(insnOpcode, tableSwitchInsn.dflt);
                    merge(targetInsnIndex, currentFrame, subroutine);
                    newControlFlowEdge(insnIndex, targetInsnIndex);
                    for (int i = 0; i < tableSwitchInsn.labels.size(); ++i) {
                        LabelNode label = tableSwitchInsn.labels.get(i);
                        currentFrame.initJumpTarget(insnOpcode, label);
                        targetInsnIndex = insnList.indexOf(label);
                        merge(targetInsnIndex, currentFrame, subroutine);
                        newControlFlowEdge(insnIndex, targetInsnIndex);
                    }
                } else if (insnOpcode == RET) {
                    if (subroutine == null) {
                        throw new AnalyzerException(insnNode, "RET instruction outside of a subroutine");
                    }
                    for (int i = 0; i < subroutine.callers.size(); ++i) {
                        JumpInsnNode caller = subroutine.callers.get(i);
                        int jsrInsnIndex = insnList.indexOf(caller);
                        if (frames[jsrInsnIndex] != null) {
                            merge(jsrInsnIndex + 1, frames[jsrInsnIndex], currentFrame, subroutines[jsrInsnIndex], subroutine.localsUsed);
                            newControlFlowEdge(insnIndex, jsrInsnIndex + 1);
                        }
                    }
                } else if (insnOpcode != ATHROW && (insnOpcode < IRETURN || insnOpcode > RETURN)) {
                    if (subroutine != null) {
                        if (insnNode instanceof VarInsnNode) {
                            int var = ((VarInsnNode) insnNode).var;
                            subroutine.localsUsed[var] = true;
                            if (insnOpcode == LLOAD || insnOpcode == DLOAD || insnOpcode == LSTORE || insnOpcode == DSTORE) {
                                subroutine.localsUsed[var + 1] = true;
                            }
                        } else if (insnNode instanceof IincInsnNode) {
                            int var = ((IincInsnNode) insnNode).var;
                            subroutine.localsUsed[var] = true;
                        }
                    }
                    merge(insnIndex + 1, currentFrame, subroutine);
                    newControlFlowEdge(insnIndex, insnIndex + 1);
                }
            }
            List<TryCatchBlockNode> insnHandlers = handlers[insnIndex];
            if (insnHandlers != null) {
                for (TryCatchBlockNode tryCatchBlock : insnHandlers) {
                    Type catchType;
                    if (tryCatchBlock.type == null) {
                        catchType = Type.getObjectType("java/lang/Throwable");
                    } else {
                        catchType = Type.getObjectType(tryCatchBlock.type);
                    }
                    if (newControlFlowExceptionEdge(insnIndex, tryCatchBlock)) {
                        Frame<V> handler = newFrame(oldFrame);
                        handler.clearStack();
                        handler.push(interpreter.newExceptionValue(tryCatchBlock, handler, catchType));
                        merge(insnList.indexOf(tryCatchBlock.handler), handler, subroutine);
                    }
                }
            }
        } catch (AnalyzerException e) {
            throw new AnalyzerException(e.node, "Error at instruction " + insnIndex + ": " + e.getMessage(), e);
        } catch (RuntimeException e) {
            // DontCheck(IllegalCatch): can't be fixed, for backward compatibility.
            throw new AnalyzerException(insnNode, "Error at instruction " + insnIndex + ": " + e.getMessage(), e);
        }
    }
    return frames;
}
Also used : LabelNode(org.apache.tapestry5.internal.plastic.asm.tree.LabelNode) TryCatchBlockNode(org.apache.tapestry5.internal.plastic.asm.tree.TryCatchBlockNode) TableSwitchInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.TableSwitchInsnNode) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) AbstractInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.AbstractInsnNode) Type(org.apache.tapestry5.internal.plastic.asm.Type) JumpInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.JumpInsnNode) IincInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.IincInsnNode) ArrayList(java.util.ArrayList) InsnList(org.apache.tapestry5.internal.plastic.asm.tree.InsnList) List(java.util.List) LookupSwitchInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.LookupSwitchInsnNode) VarInsnNode(org.apache.tapestry5.internal.plastic.asm.tree.VarInsnNode)

Aggregations

ArrayList (java.util.ArrayList)3 Type (org.apache.tapestry5.internal.plastic.asm.Type)3 AbstractInsnNode (org.apache.tapestry5.internal.plastic.asm.tree.AbstractInsnNode)2 JumpInsnNode (org.apache.tapestry5.internal.plastic.asm.tree.JumpInsnNode)2 LabelNode (org.apache.tapestry5.internal.plastic.asm.tree.LabelNode)2 LookupSwitchInsnNode (org.apache.tapestry5.internal.plastic.asm.tree.LookupSwitchInsnNode)2 TableSwitchInsnNode (org.apache.tapestry5.internal.plastic.asm.tree.TableSwitchInsnNode)2 TryCatchBlockNode (org.apache.tapestry5.internal.plastic.asm.tree.TryCatchBlockNode)2 HashMap (java.util.HashMap)1 List (java.util.List)1 ClassNode (org.apache.tapestry5.internal.plastic.asm.tree.ClassNode)1 FieldInsnNode (org.apache.tapestry5.internal.plastic.asm.tree.FieldInsnNode)1 IincInsnNode (org.apache.tapestry5.internal.plastic.asm.tree.IincInsnNode)1 InsnList (org.apache.tapestry5.internal.plastic.asm.tree.InsnList)1 MethodNode (org.apache.tapestry5.internal.plastic.asm.tree.MethodNode)1 VarInsnNode (org.apache.tapestry5.internal.plastic.asm.tree.VarInsnNode)1 Analyzer (org.apache.tapestry5.internal.plastic.asm.tree.analysis.Analyzer)1 AnalyzerException (org.apache.tapestry5.internal.plastic.asm.tree.analysis.AnalyzerException)1 BasicValue (org.apache.tapestry5.internal.plastic.asm.tree.analysis.BasicValue)1 SimpleVerifier (org.apache.tapestry5.internal.plastic.asm.tree.analysis.SimpleVerifier)1