Java 类org.objectweb.asm.tree.LocalVariableNode 实例源码

项目:DirectLeaks-AntiReleak-Remover    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:dead-code-detector    文件:LocalVariablesAnalyzer.java   
@SuppressWarnings(UNCHECKED)
Set<LocalVariableNode> analyzeMethod() {
    // si seulement 1 variable locale ("this") ou si seulement des "variables locales" pour les paramètres et pour "this",
    // alors on passe à la méthode suivante
    if (localVariables.isEmpty()) {
        return Collections.emptySet();
    }
    for (final Iterator<AbstractInsnNode> it = methodNode.instructions.iterator(); it
            .hasNext();) {
        analyzeInstruction(it.next());
        if (localVariables.isEmpty()) {
            // si toutes les variables ont été utilisées, inutile de continuer à lire les instructions
            return Collections.emptySet();
        }
    }
    return localVariables;
}
项目:dead-code-detector    文件:LocalVariablesAnalyzer.java   
@SuppressWarnings(UNCHECKED)
private Set<LocalVariableNode> extractLocalVariables() {
    if ((methodNode.access & (Opcodes.ACC_ABSTRACT | Opcodes.ACC_SYNTHETIC)) != 0) {
        return Collections.emptySet();
    }
    final int oneIfThisExists = (methodNode.access & Opcodes.ACC_STATIC) != 0 ? 0 : 1;
    if (methodNode.localVariables.size() <= oneIfThisExists || methodNode.localVariables
            .size() <= Type.getArgumentTypes(methodNode.desc).length + oneIfThisExists) {
        return Collections.emptySet();
    }
    final Set<LocalVariableNode> variables = new LinkedHashSet<>(methodNode.localVariables);
    // on ignore les variables locales "this" et celles des paramètres
    // (attention les variables ne sont pas forcément dans l'ordre des index, en eclipse 3.1 ou 3.2 ?)
    final int nbParameters = Type.getArgumentTypes(methodNode.desc).length + oneIfThisExists;
    for (final Iterator<LocalVariableNode> it = variables.iterator(); it.hasNext();) {
        final int index = it.next().index;
        if (index < nbParameters) {
            it.remove();
        }
    }
    return variables;
}
项目:dead-code-detector    文件:LocalVariablesAnalyzer.java   
@SuppressWarnings(UNCHECKED)
private void filterCatchVariables() {
    // on supprime les variables des blocs catchs (comme eclipse, etc...),
    // avant de supprimer les doublons car les blocs catchs provoquent parfois des variables de même index
    for (final TryCatchBlockNode tryCatchBlock : (List<TryCatchBlockNode>) methodNode.tryCatchBlocks) {
        // TODO est-ce qu'il y a un meilleur moyen d'identifier la variable de l'exception autrement que par son type ?
        final String type = tryCatchBlock.type;
        // type est null si finally
        if (type != null) {
            for (final Iterator<LocalVariableNode> it = localVariables.iterator(); it
                    .hasNext();) {
                final LocalVariableNode localVariable = it.next();
                final Type typeLocalVariable = Type.getType(localVariable.desc);
                if (typeLocalVariable.getSort() == Type.OBJECT
                        && type.equals(typeLocalVariable.getInternalName())) {
                    it.remove();
                    break;
                }
            }
        }
    }
}
项目:dead-code-detector    文件:LocalVariablesAnalyzer.java   
private void filterDuplicates() {
    // et on supprime les doublons,
    // qui arrivent avec le code suivant : final String s; if (b) s = "t"; else s = "f";,
    // Rq: du coup on peut avoir des faux négatifs avec le code suivant, mais tant pis :
    // if (b) { Object o = new Object(); test(o); } else { Object o = new Object(); }
    // (attention les variables ne sont pas forcément dans l'ordre des index, en eclipse 3.1 ou 3.2 ?)
    for (final Iterator<LocalVariableNode> it = localVariables.iterator(); it.hasNext();) {
        final LocalVariableNode localVariable = it.next();
        for (final LocalVariableNode localVariable2 : localVariables) {
            if (localVariable.index == localVariable2.index
                    && !localVariable.equals(localVariable2)) {
                it.remove();
                break;
            }
        }
    }
}
项目:anvil    文件:VeinCapTransformer.java   
@Override
public void transform(ClassNode clazz, MethodNode method, InsnMatcher matcher) {
    AbstractInsnNode[] match = Iterators.getOnlyElement(matcher.match("BIPUSH ISTORE", m -> {
        IntInsnNode push = (IntInsnNode) m[0];
        if (push.operand != 50) {
            return false;
        }

        VarInsnNode store = (VarInsnNode) m[1];
        LocalVariableNode node = AsmUtils.getLocalVariable(method, store.var, store);
        return node != null && node.name.equals("resource") && node.desc.equals("I");
    }));

    method.instructions.remove(match[0]);
    method.instructions.remove(match[1]);
}
项目:Spigot-Attribute-Remover    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:fastAOP    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:JAADAS    文件:AsmMethodSource.java   
private Local getLocal(int idx) {
    if (idx >= maxLocals)
        throw new IllegalArgumentException("Invalid local index: " + idx);
    Integer i = idx;
    Local l = locals.get(i);
    if (l == null) {
        String name;
        if (localVars != null) {
            name = null;
            for (LocalVariableNode lvn : localVars) {
                if (lvn.index == idx) {
                    name = lvn.name;
                    break;
                }
            }
            /* normally for try-catch blocks */
            if (name == null)
                name = "l" + idx;
        } else {
            name = "l" + idx;
        }
        l = Jimple.v().newLocal(name, UnknownType.v());
        locals.put(i, l);
    }
    return l;
}
项目:NeonObf    文件:LocalVariableNameObfuscator.java   
@Override
public void run() {
    if (mn.localVariables == null)
        return;
    for(int i = 0; i < mn.localVariables.size(); i++) {
        LocalVariableNode lvn = (LocalVariableNode) mn.localVariables.get(i);

        mn.localVariables.set (
            i,
            new LocalVariableNode (
                Main.getInstance().nameGen.get(i),
                lvn.desc,
                null,
                lvn.start,
                lvn.end,
                i
            )
        );
        hm.put(lvn.desc, Boolean.TRUE);
    }
}
项目:NyBatisCore    文件:ParameterNameReader.java   
private List<String> getNamesByAsm( Method method, ClassNode classNode ) {

        List<String> names      = new ArrayList<>();
        MethodNode   methodNode = getMethodNode( method, classNode );

        if( methodNode == null ) {
            return getNamesByReflection( method );
        }

        for( LocalVariableNode variableNode : (List<LocalVariableNode>) methodNode.localVariables ) {
            // if methodNode is not static, first local variable always be "this".
            if( "this".equals(variableNode.name) ) continue;
            names.add( variableNode.name );
        }

        return names;

    }
项目:JReFrameworker    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:JReFrameworker    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:evosuite    文件:TestRuntimeValuesDeterminer.java   
private LocalVariableNode getLocalVariableNode(int varIdx, AbstractInsnNode insnNode, MethodNode methodNode) {
    int instrIdx = getInstructionIndex(insnNode);
    List<?> localVariables = methodNode.localVariables;
    for (int idx = 0; idx < localVariables.size(); idx++) {
        LocalVariableNode localVariableNode = (LocalVariableNode) localVariables.get(idx);
        if (localVariableNode.index == varIdx) {
            int scopeEndInstrIdx = getInstructionIndex(localVariableNode.end);
            if (scopeEndInstrIdx >= instrIdx) {
                // still valid for current line
                return localVariableNode;
            }
        }
    }
    throw new RuntimeException("Variable with index " + varIdx + " and end >= " + currentLine
            + " not found for method " + fullyQualifiedTargetClass + "#" + methodNode.name + "!");
}
项目:evosuite    文件:TestRuntimeValuesDeterminer.java   
private InsnList localVarValue(AbstractInsnNode insnNode, int opositeOpcode, String param) {
    int varIdx = -1;
    if (insnNode instanceof VarInsnNode) {
        varIdx = ((VarInsnNode) insnNode).var;
    } else if (insnNode instanceof IincInsnNode) {
        varIdx = ((IincInsnNode) insnNode).var;
    } else {
        throw new RuntimeException("Not implemented for type " + insnNode.getClass());
    }
    InsnList instrumentation = new InsnList();
    MethodNode methodNode = (MethodNode) mv;
    if (methodNode.localVariables.size() <= varIdx) {
        throw new RuntimeException("varInsnNode is pointing outside of local variables!");
    }
    LocalVariableNode localVariableNode = getLocalVariableNode(varIdx, insnNode, methodNode);
    instrumentation.add(new VarInsnNode(opositeOpcode, varIdx));
    instrumentation.add(new LdcInsnNode(localVariableNode.name));
    instrumentation.add(new LdcInsnNode(currentLine));
    instrumentation.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
            "org/evosuite/junit/TestRuntimeValuesDeterminer", "localVarValueChanged", "(" + param
                    + "Ljava/lang/String;I)V"));
    logger.debug("Adding localVarValueChanged for var {} in line {}.", localVariableNode.name, currentLine);
    return instrumentation;
}
项目:evosuite    文件:ReplaceArithmeticOperator.java   
/**
 * <p>getNextIndex</p>
 *
 * @param mn a {@link org.objectweb.asm.tree.MethodNode} object.
 * @return a int.
 */
@SuppressWarnings("rawtypes")
public static int getNextIndex(MethodNode mn) {
    Iterator it = mn.localVariables.iterator();
    int max = 0;
    int next = 0;
    while (it.hasNext()) {
        LocalVariableNode var = (LocalVariableNode) it.next();
        int index = var.index;
        if (index >= max) {
            max = index;
            next = max + Type.getType(var.desc).getSize();
        }
    }
    if (next == 0)
        next = getNextIndexFromLoad(mn);
    return next;
}
项目:evosuite    文件:ReplaceVariable.java   
private LocalVariableNode getLocal(MethodNode mn, AbstractInsnNode node, int index)
        throws VariableNotFoundException {
    int currentId = mn.instructions.indexOf(node);
    for (Object v : mn.localVariables) {
        LocalVariableNode localVar = (LocalVariableNode) v;
        int startId = mn.instructions.indexOf(localVar.start);
        int endId = mn.instructions.indexOf(localVar.end);
        logger.info("Checking " + localVar.index + " in scope " + startId + " - "
                + endId);
        if (currentId >= startId && currentId <= endId && localVar.index == index)
            return localVar;
    }

    throw new VariableNotFoundException("Could not find local variable " + index
            + " at position " + currentId + ", have variables: "
            + mn.localVariables.size());
}
项目:ea-async    文件:Transformer.java   
private String guessName(final MethodNode method, final SwitchEntry se, final int local)
{
    if (se != null)
    {
        for (LocalVariableNode node : method.localVariables)
        {
            if (node.index == local
                    && method.instructions.indexOf(node.start) <= se.index
                    && method.instructions.indexOf(node.end) >= se.index)
            {
                return node.name;
            }
        }
    }
    return "_local$" + local;
}
项目:coroutines    文件:SearchUtilsTest.java   
@Test
public void mustFindLocalVariableNodeForInstruction() {
    MethodNode methodNode = findMethodsWithName(classNode.methods, "localVariablesTest").get(0);
    List<AbstractInsnNode> insns = findInvocationsOf(methodNode.instructions,
            MethodUtils.getAccessibleMethod(PrintStream.class, "println", String.class));

    AbstractInsnNode insnNode = insns.get(0);

    LocalVariableNode lvn0 = findLocalVariableNodeForInstruction(methodNode.localVariables, methodNode.instructions, insnNode, 0);
    LocalVariableNode lvn1 = findLocalVariableNodeForInstruction(methodNode.localVariables, methodNode.instructions, insnNode, 1);
    LocalVariableNode lvn2 = findLocalVariableNodeForInstruction(methodNode.localVariables, methodNode.instructions, insnNode, 2);

    assertEquals(lvn0.name, "this");
    assertEquals(lvn1.name, "val1");
    assertEquals(lvn2.name, "val2");
}
项目:BitPlus    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:Bramspr    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:jumbune    文件:MethodByteCodeUtil.java   
private static AbstractInsnNode getParamStartNodeOfUDClassMethodCall(MethodInsnNode node, List<LocalVariableNode> locaVariables) {
    String owner = node.owner;

    List<Integer> descriptionMatchingLocalVariables = new ArrayList<Integer>();
    for (LocalVariableNode localVar : locaVariables) {
        if (localVar.desc.contains(owner)) {
            descriptionMatchingLocalVariables.add(localVar.index);
        }
    }
    boolean isOtherClassVariableFound = false;
    AbstractInsnNode previousNode = node.getPrevious();
    while (previousNode != null && !isOtherClassVariableFound) {
        if (previousNode instanceof VarInsnNode) {
            VarInsnNode varInsnNode = (VarInsnNode) previousNode;
            Integer indexOfUDC = descriptionMatchingLocalVariables.indexOf(varInsnNode.var);
            if (indexOfUDC != -1) {
                return previousNode;
            }
            previousNode = previousNode.getPrevious();
            return previousNode;
        }
    }
    return null;
}
项目:grappa    文件:VarFramingGenerator.java   
private static void createVarFieldArray(final CodeBlock block,
    final RuleMethod method)
{
    final int count = method.getLocalVarVariables().size();

    block.bipush(count).anewarray(CodegenUtils.p(Var.class));

    LocalVariableNode var;
    String varName;

    for (int i = 0; i < count; i++) {
        var = method.getLocalVarVariables().get(i);
        varName = method.name + ':' + var.name;

        block.dup()
            .bipush(i)
            .aload(var.index)
            .dup()
            .ldc(varName)
            .invokevirtual(CodegenUtils.p(Var.class), "setName",
                CodegenUtils.sig(void.class, String.class))
            .aastore();
    }
}
项目:CubesEdge    文件:EntityRendererTransformer.java   
private static void patchRenderHandMethod(MethodNode mn) {

        System.out.println("\tPatching method renderHand in EntityRenderer");
        InsnList newList = new InsnList();

        mn.localVariables = new ArrayList<LocalVariableNode>(5);

        newList.add(new VarInsnNode(Opcodes.FLOAD, 1));
        newList.add(new VarInsnNode(Opcodes.ILOAD, 2));
        newList.add(new VarInsnNode(Opcodes.ALOAD, 0));
        newList.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
                "fr/zak/cubesedge/coremod/Patch",
                "entityRendererRenderHandPatch", "(FIL" + className + ";)V", false));
        newList.add(new InsnNode(Opcodes.RETURN));

        mn.instructions = newList;
    }
项目:CubesEdge    文件:EntityTransformer.java   
private static void patchSetAnglesMethod(MethodNode mn) {

        System.out.println("\tPatching method setAngles in Entity");
        InsnList newList = new InsnList();

        mn.localVariables = new ArrayList<LocalVariableNode>(5);

        newList.add(new VarInsnNode(Opcodes.FLOAD, 1));
        newList.add(new VarInsnNode(Opcodes.FLOAD, 2));
        newList.add(new VarInsnNode(Opcodes.ALOAD, 0));
        newList.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
                "fr/zak/cubesedge/coremod/Patch", "entitySetAnglesPatch",
                "(FFL" + className + ";)V", false));
        newList.add(new InsnNode(Opcodes.RETURN));

        mn.instructions = newList;
    }
项目:asm-legacy-svn-clone    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:phosphor    文件:TaintAdapter.java   
/**
 * Stores the top n stack elements as local variables. Returns an array of
 * all of the lv indices. return[0] is the top element.
 * 
 * @param n
 * @return
 */
protected LocalVariableNode[] storeToLocals(int n) {
    LocalVariableNode[] ret = new LocalVariableNode[n];
    //      System.out.println("Store to locals top " + n);
    //      System.out.println(analyzer.stack);
    for (int i = 0; i < n; i++) {
        Type elType = null;
        if (analyzer.stack.get(analyzer.stack.size() - 1) == Opcodes.TOP)
            elType = getTypeForStackType(analyzer.stack.get(analyzer.stack.size() - 2));
        else
            elType = getTypeForStackType(analyzer.stack.get(analyzer.stack.size() - 1));
        Boolean istagged = topCarriesTaint();
        ret[i] = new LocalVariableNode(null, elType.getDescriptor(), istagged.toString(), null, null, lvs.getTmpLV());
        super.visitVarInsn(elType.getOpcode(ISTORE), ret[i].index);
    }
    return ret;
}
项目:phosphor    文件:TaintPassingMV.java   
/**
 * Will insert a NULL after the nth element from the top of the stack
 * 
 * @param n
 */
void insertNullAt(int n) {
    switch (n) {
    case 0:
        super.visitInsn(ACONST_NULL);
        break;
    case 1:
        super.visitInsn(ACONST_NULL);
        super.visitInsn(SWAP);
        break;
    case 2:
        super.visitInsn(ACONST_NULL);
        super.visitInsn(DUP_X2);
        super.visitInsn(POP);
        break;
    default:
        LocalVariableNode[] d = storeToLocals(n);
        super.visitInsn(ACONST_NULL);
        for (int i = n - 1; i >= 0; i--) {
            loadLV(i, d);
        }
        freeLVs(d);

    }
}
项目:bytecodelib    文件:MethodResolver.java   
private void nameArguments() {
    //Labels before and after all real instructions.
    List<LabelNode> beginLabels = new ArrayList<>(), endLabels = new ArrayList<>();
    for (AbstractInsnNode n = methodNode.instructions.getFirst(); n != null && n.getOpcode() == -1; n = n.getNext())
        if (n instanceof LabelNode)
            beginLabels.add((LabelNode)n);
    for (AbstractInsnNode n = methodNode.instructions.getLast(); n != null && n.getOpcode() == -1; n = n.getPrevious())
        if (n instanceof LabelNode)
            endLabels.add((LabelNode)n);

    //Get the initial frame state, which has the arguments in the proper
    //locals positions, and set names.
    Value[] locals = blocks.get(0).entryState.locals;
    for (LocalVariableNode lvn : methodNode.localVariables)
        if (beginLabels.contains(lvn.start) && endLabels.contains(lvn.end) && (!method.isConstructor() || lvn.index != 0))
            locals[lvn.index].setName(lvn.name);
}
项目:bytecodelib    文件:MethodUnresolver.java   
private void buildLocalVariableTable() {
    LabelNode first = new LabelNode(), last = new LabelNode();
    methodNode.instructions.insert(first);
    methodNode.instructions.add(last);
    methodNode.localVariables = new ArrayList<>(registers.size());
    for (Map.Entry<Value, Integer> r : registers.entrySet()) {
        RegularType type = r.getKey() instanceof LocalVariable ?
                ((LocalVariable)r.getKey()).getType().getFieldType() :
                (RegularType)r.getKey().getType();
        methodNode.localVariables.add(new LocalVariableNode(
                r.getKey().getName(),
                type.getDescriptor(),
                null,
                first,
                last,
                r.getValue()));
    }
}
项目:jooby    文件:BytecodeRouteParser.java   
@SuppressWarnings("unchecked")
static java.lang.reflect.Type localVariable(final ClassLoader loader, final MethodNode m,
    final VarInsnNode varInsn) {
  if (varInsn.getOpcode() == Opcodes.ALOAD) {
    List<LocalVariableNode> vars = m.localVariables;
    LocalVariableNode var = vars.stream()
        .filter(v -> v.index == varInsn.var)
        .findFirst()
        .orElse(null);
    if (var != null) {
      String signature = "()" + Optional.ofNullable(var.signature).orElse(var.desc);
      return TypeDescriptorParser.parse(loader, signature);
    }
  }
  return Object.class;
}
项目:javaslicer    文件:TracingMethodInstrumenter.java   
public TracingMethodInstrumenter(final Tracer tracer, final ReadMethod readMethod, final ClassNode classNode, final MethodNode methodNode) {
    this.tracer = tracer;
    this.readMethod = readMethod;
    this.classNode = classNode;
    this.methodNode = methodNode;
    int usedLocalVars = ((readMethod.getAccess() & Opcodes.ACC_STATIC) == 0 ? 1 : 0);
    for (final Type t: Type.getArgumentTypes(readMethod.getDesc()))
        usedLocalVars += t.getSize();
    if (methodNode.localVariables != null) {
        for (final Object locVarNode: methodNode.localVariables) {
            final LocalVariableNode locVar = (LocalVariableNode)locVarNode;
            final int index = locVar.index + Type.getType(locVar.desc).getSize();
            if (usedLocalVars < index)
                usedLocalVars = index;
        }
    }
    this.tracerLocalVarIndex = usedLocalVars;
    ++statsMethods;
    if (lastClass != readMethod.getReadClass()) {
        lastClass = readMethod.getReadClass();
        ++statsClasses;
    }
}
项目:ow2-asm    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:objectweb-asm-4.0    文件:JSRInlinerAdapter.java   
/**
 * Creates the new instructions, inlining each instantiation of each
 * subroutine until the code is fully elaborated.
 */
private void emitCode() {
    LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
    // Create an instantiation of the "root" subroutine, which is just the
    // main routine
    worklist.add(new Instantiation(null, mainSubroutine));

    // Emit instantiations of each subroutine we encounter, including the
    // main subroutine
    InsnList newInstructions = new InsnList();
    List<TryCatchBlockNode> newTryCatchBlocks = new ArrayList<TryCatchBlockNode>();
    List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
    while (!worklist.isEmpty()) {
        Instantiation inst = worklist.removeFirst();
        emitSubroutine(inst,
                worklist,
                newInstructions,
                newTryCatchBlocks,
                newLocalVariables);
    }
    instructions = newInstructions;
    tryCatchBlocks = newTryCatchBlocks;
    localVariables = newLocalVariables;
}
项目:MineCamera    文件:Transformer.java   
public int getIndexOfVar(MethodNode m, String desc, String signature) {
    desc = patchDESC(desc);
    signature = signature == null ? null : patchDESC(signature);

    for (Iterator<LocalVariableNode> iterator = m.localVariables.iterator(); iterator.hasNext();) {
        LocalVariableNode local = iterator.next();
        if (local.desc.equals(desc) && (signature == null || signature.equals(local.signature)))
            return local.index;
    }
    return -1;
}
项目:r8    文件:JarSourceCode.java   
private static Map<LocalVariableNode, DebugLocalInfo> computeLocals(
    List localNodes, JarApplicationReader application) {
  Map<DebugLocalInfo, DebugLocalInfo> canonical = new HashMap<>(localNodes.size());
  Map<LocalVariableNode, DebugLocalInfo> localVariables = new HashMap<>(localNodes.size());
  for (Object o : localNodes) {
    LocalVariableNode node = (LocalVariableNode) o;
    localVariables.computeIfAbsent(node, n -> canonicalizeLocal(n, canonical, application));
  }
  return localVariables;
}
项目:r8    文件:JarSourceCode.java   
private static DebugLocalInfo canonicalizeLocal(
    LocalVariableNode node,
    Map<DebugLocalInfo, DebugLocalInfo> canonicalLocalVariables,
    JarApplicationReader application) {
  DebugLocalInfo info = new DebugLocalInfo(
      application.getString(node.name),
      application.getTypeFromDescriptor(node.desc),
      node.signature == null ? null : application.getString(node.signature));
  DebugLocalInfo canonical = canonicalLocalVariables.putIfAbsent(info, info);
  return canonical != null ? canonical : info;
}
项目:r8    文件:JarState.java   
public JarState(int maxLocals, Map<LocalVariableNode, DebugLocalInfo> localVariables) {
  int localsRegistersSize = maxLocals * 3;
  localsSize = maxLocals;
  locals = new Local[localsRegistersSize];
  startOfStack = localsRegistersSize;
  topOfStack = startOfStack;
  this.localVariables = localVariables;
  localVariableStartPoints = HashMultimap.create();
  localVariableEndPoints = HashMultimap.create();
  populateLocalTables();
}
项目:r8    文件:JarState.java   
private void populateLocalTables() {
  for (LocalVariableNode node : localVariables.keySet()) {
    if (node.start != node.end) {
      localVariableStartPoints.put(node.start, node);
      localVariableEndPoints.put(node.end, node);
    }
  }
}
项目:r8    文件:JarState.java   
public List<Local> openLocals(LabelNode label) {
  Collection<LocalVariableNode> nodes = localVariableStartPoints.get(label);
  ArrayList<Local> locals = new ArrayList<>(nodes.size());
  for (LocalVariableNode node : nodes) {
    locals.add(setLocalInfo(node.index, Type.getType(node.desc), localVariables.get(node)));
  }
  // Sort to ensure deterministic instruction ordering (correctness is unaffected).
  locals.sort(Comparator.comparingInt(local -> local.slot.register));
  return locals;
}