Example usage for org.objectweb.asm.tree InsnList insertBefore

List of usage examples for org.objectweb.asm.tree InsnList insertBefore

Introduction

In this page you can find the example usage for org.objectweb.asm.tree InsnList insertBefore.

Prototype

public void insertBefore(final AbstractInsnNode nextInsn, final InsnList insnList) 

Source Link

Document

Inserts the given instructions before the specified instruction.

Usage

From source file:de.tuberlin.uebb.jbop.optimizer.array.LocalArrayValueInliner.java

License:Open Source License

@Override
protected boolean handleValues(final InsnList original, final Map<Integer, Object> knownArrays,
        final AbstractInsnNode currentNode) {

    AbstractInsnNode arrayload = currentNode;
    AbstractInsnNode indexNode;/* w  w w  .  j a v a2 s  .com*/
    final List<AbstractInsnNode> arrayloads = new ArrayList<>();
    final List<AbstractInsnNode> indexes = new ArrayList<>();
    do {
        if (!Predicates.IS_XALOAD.evaluate(arrayload)) {
            return false;
        }
        arrayloads.add(arrayload);
        indexNode = NodeHelper.getPrevious(arrayload);

        if (!NodeHelper.isNumberNode(indexNode)) {
            return false;
        }
        indexes.add(indexNode);
        arrayload = NodeHelper.getPrevious(indexNode);
        if (arrayload instanceof VarInsnNode) {
            break;
        }
    } while (true);

    final VarInsnNode previous2 = (VarInsnNode) arrayload;

    final Integer varIndex = Integer.valueOf(previous2.var);
    Object array = knownArrays.get(varIndex);

    if (array == null) {
        return false;
    }

    for (int i = indexes.size() - 1; i >= 0; --i) {
        final int indexInArray = NodeHelper.getNumberValue(indexes.get(i)).intValue();
        array = Array.get(array, indexInArray);
    }
    if (!(array instanceof Number)) {
        return false;
    }
    final AbstractInsnNode replacement = NodeHelper.getInsnNodeFor((Number) array);
    original.insertBefore(previous2, replacement);
    for (int i = 0; i < indexes.size(); ++i) {
        original.remove(indexes.get(i));
        original.remove(arrayloads.get(i));
    }
    original.remove(previous2);

    return true;
}

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

License:Open Source License

private boolean handleBuiltIn(final String descriptor, final InsnList original, final AbstractInsnNode next,
        final Object object, final List<AbstractInsnNode> nodes,
        final ListIterator<AbstractInsnNode> localIterator) {
    if (FinalFieldInliner.isBuiltIn(descriptor)) {
        correctIterator(localIterator);/*ww w .  java 2  s  .c  om*/
        original.insertBefore(next, NodeHelper.getInsnNodeFor(object));
        for (final AbstractInsnNode node : nodes) {
            original.remove(node);
        }
        iterator.previous();
        return true;
    }
    return false;
}

From source file:gemlite.core.internal.measurement.MeasureHelper.java

License:Apache License

public final static void instrumentCheckPoint(String className, MethodNode mn) {
    if (LogUtil.getCoreLog().isTraceEnabled())
        LogUtil.getCoreLog().trace("Found check point, class:" + className + " method:" + mn.name);

    InsnList insn = mn.instructions;
    List<AbstractInsnNode> returnIndex = new ArrayList<>();
    // return//from   w  w w  .  j  a  v  a  2s.c  o  m
    int localVarCount = mn.localVariables.size();
    for (int i = 0; i < insn.size(); i++) {
        AbstractInsnNode insnNode = (AbstractInsnNode) insn.get(i);
        switch (insnNode.getOpcode()) {
        case Opcodes.ARETURN:
        case Opcodes.IRETURN:
        case Opcodes.DRETURN:
        case Opcodes.LRETURN:
        case Opcodes.FRETURN:
            returnIndex.add(insnNode.getPrevious());
            break;
        case Opcodes.RETURN:
            returnIndex.add(insnNode);
            break;
        }
    }
    // 
    insn.insert(new VarInsnNode(Opcodes.LSTORE, localVarCount + 2));
    insn.insert(
            new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false));
    // ?
    for (AbstractInsnNode insnNode : returnIndex) {
        insn.insertBefore(insnNode, new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/System",
                "currentTimeMillis", "()J", false));
        insn.insertBefore(insnNode, new VarInsnNode(Opcodes.LSTORE, localVarCount + 4));

        insn.insertBefore(insnNode, new LdcInsnNode(className));
        insn.insertBefore(insnNode, new LdcInsnNode(mn.name));
        insn.insertBefore(insnNode, new VarInsnNode(Opcodes.LLOAD, localVarCount + 2));
        insn.insertBefore(insnNode, new VarInsnNode(Opcodes.LLOAD, localVarCount + 4));
        insn.insertBefore(insnNode,
                new MethodInsnNode(Opcodes.INVOKESTATIC, "gemlite/core/internal/measurement/MeasureHelper",
                        "recordCheckPoint", "(Ljava/lang/String;Ljava/lang/String;JJ)V", false));
    }
}

From source file:ht.misc.injectsocks.InjectSockstTransformerImpl.java

License:Apache License

public byte[] inject(byte[] classfileBuffer) {
    try {/* www. java 2s  . c  o  m*/
        ClassReader cr = new ClassReader(classfileBuffer);
        ClassNode cn = new ClassNode();
        cr.accept(cn, 0);

        ArrayList<AbstractInsnNode> injectPos = new ArrayList<AbstractInsnNode>();

        @SuppressWarnings("unchecked")
        List<MethodNode> methods = (List<MethodNode>) cn.methods;
        for (int i = 0; i < methods.size(); ++i) {
            MethodNode method = methods.get(i);
            InsnList instructions = method.instructions;
            if (instructions.size() <= 0)
                continue;

            //System.out.println("Method: "+method.name+" ");
            for (int j = 0; j < instructions.size(); ++j) {
                AbstractInsnNode insn = (AbstractInsnNode) instructions.get(j);
                //System.out.println("\tInsn: opc="+OpcodeUtil.getOpcode(insn.getOpcode())+", type="+insn.getType());
                if (insn.getType() == AbstractInsnNode.METHOD_INSN) {
                    MethodInsnNode min = (MethodInsnNode) insn;
                    //System.out.printf("\t\towner=%s, name=%s, desc=%s\n", min.owner, min.name, min.desc);

                    if (min.owner.equals("java/net/Socket") && min.name.equals("<init>")
                            && min.desc.equals("()V")) {
                        min.desc = "(Ljava/net/Proxy;)V";
                        injectPos.add(min);
                    }
                }
            }

            for (int k = 0; k < injectPos.size(); k++) {
                AbstractInsnNode pos = injectPos.get(k);
                MethodInsnNode newMin = new MethodInsnNode(Opcodes.INVOKESTATIC,
                        "ht/misc/injectsocks/ProxyManager", "getProxy", "()Ljava/net/Proxy;", false);
                instructions.insertBefore(pos, newMin);
            }

        }

        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        cn.accept(cw);
        byte[] injectedClassfileBuffer = cw.toByteArray();
        System.out.printf("INFO: classfileBuffer.legnth=%d, injectedClassfileBuffer.length=%d\n",
                classfileBuffer.length, injectedClassfileBuffer.length);

        return injectedClassfileBuffer;
    } catch (Throwable e) {
        e.printStackTrace();
        return classfileBuffer;
    }
}

From source file:jaspex.speculation.newspec.FlowFrame.java

License:Open Source License

/** Adiciona as frames geradas pelo Analyzer ao MethodNode, para serem usadas
  * pelo DelayGetFutureMethodVisitor./*from   w  ww  .  jav a  2s . c  om*/
  **/
public static void injectFrames(MethodNode mn, Frame<BasicValue>[] frames) {
    InsnList insnList = mn.instructions;

    AbstractInsnNode node = insnList.getFirst();
    int pos = 0;
    while (node != null) {
        Frame<BasicValue> currentFrame = frames[pos++];
        if (currentFrame != null && !(node instanceof FrameNode)) {
            Object[] locals = locals(currentFrame);
            Object[] stack = stack(currentFrame);
            insnList.insertBefore(node, new FrameNode(F_NEW, locals.length, locals, stack.length, stack));
        }
        node = node.getNext();
    }
}

From source file:jaspex.speculation.newspec.FlowFrame.java

License:Open Source License

/** Obtm label antes da instruco. Se j existir uma,  reutilizada, cc uma nova  criada. **/
public static LabelNode labelBefore(InsnList il, AbstractInsnNode insn) {
    if (!(insn.getPrevious() instanceof LabelNode)) {
        il.insertBefore(insn, new LabelNode());
    }//  www.  j  a v a2  s  . com

    return (LabelNode) insn.getPrevious();
}

From source file:org.brutusin.instrumentation.Instrumentator.java

License:Apache License

private void addTraceReturn() {

    InsnList il = this.mn.instructions;

    Iterator<AbstractInsnNode> it = il.iterator();
    while (it.hasNext()) {
        AbstractInsnNode abstractInsnNode = it.next();

        switch (abstractInsnNode.getOpcode()) {
        case Opcodes.RETURN:
            il.insertBefore(abstractInsnNode, getVoidReturnTraceInstructions());
            break;
        case Opcodes.IRETURN:
        case Opcodes.LRETURN:
        case Opcodes.FRETURN:
        case Opcodes.ARETURN:
        case Opcodes.DRETURN:
            il.insertBefore(abstractInsnNode, getReturnTraceInstructions());
        }//from  www .  ja v  a  2 s  .c o  m
    }
}

From source file:org.brutusin.instrumentation.Instrumentator.java

License:Apache License

private void addTraceThrow() {

    InsnList il = this.mn.instructions;

    Iterator<AbstractInsnNode> it = il.iterator();
    while (it.hasNext()) {
        AbstractInsnNode abstractInsnNode = it.next();

        switch (abstractInsnNode.getOpcode()) {
        case Opcodes.ATHROW:
            il.insertBefore(abstractInsnNode, getThrowTraceInstructions());
            break;
        }/*from  w ww  . j  a v  a2 s .  co  m*/
    }

}

From source file:org.coldswap.asm.method.PublicFloatMethodReplacer.java

License:Open Source License

private InsnList replaceReturn(InsnList insnList, Type retType) {
    final Type rretType = retType;
    int retOpcode = MethodUtil.getRetOpcodeToReplace(retType);
    for (int i = 0; i < insnList.size(); i++) {
        AbstractInsnNode absIns = insnList.get(i);
        int opcode = absIns.getOpcode();
        if (opcode == retOpcode) {
            // if tries to return a Reference type into a primitive then
            // remove the unbox( we return an Object). If a primitive is returned
            // into a  primitive then we must try to box from primitive to Object/Integer, etc..

            // check if an unbox takes place before return
            final boolean[] isBoxUnbox = { false, false };
            AbstractInsnNode valueOf = null;
            AbstractInsnNode primitiveValue = null;
            if (i > 1) {
                valueOf = insnList.get(i - 1);
                primitiveValue = insnList.get(i - 2);
                if (valueOf.getOpcode() == Opcodes.INVOKESTATIC) {
                    valueOf.accept(new MethodVisitor(Opcodes.ASM5) {
                        @Override
                        public void visitMethodInsn(int i, String s, String s2, String s3) {
                            if (AutoBoxing.isPrimitive(rretType.getDescriptor())) {
                                if ((AutoBoxing.getBoxClassName(rretType) + ".valueOf").equals(s + s2)) {
                                    isBoxUnbox[0] = true;
                                }/* w  w  w  .  j ava  2s.co  m*/
                            }
                            super.visitMethodInsn(i, s, s2, s3);
                        }
                    });
                }

                if (isBoxUnbox[0] && primitiveValue.getOpcode() == Opcodes.INVOKEVIRTUAL) {
                    primitiveValue.accept(new MethodVisitor(Opcodes.ASM5) {
                        @Override
                        public void visitMethodInsn(int i, String s, String s2, String s3) {
                            if ((s + s2).equals(AutoBoxing.getUnBoxInvoke(rretType))) {
                                isBoxUnbox[1] = true;
                            }
                            super.visitMethodInsn(i, s, s2, s3);
                        }
                    });
                }
            }

            if (isBoxUnbox[0] && isBoxUnbox[1]) {
                // remove indexes
                insnList.remove(valueOf);
                insnList.remove(primitiveValue);
            } else {
                InsnList iList = new InsnList();
                iList.add(AutoBoxing.box(retType));
                iList.add(new InsnNode(Opcodes.ARETURN));
                insnList.insertBefore(absIns, iList);
                insnList.remove(absIns);

            }
        }
    }
    return insnList;
}

From source file:org.coldswap.asm.method.PublicObjectMethodReplacer.java

License:Open Source License

private InsnList replaceReturn(InsnList insnList, Type retType) {
    final Type rretType = retType;
    int retOpcode = MethodUtil.getRetOpcodeToReplace(retType);
    for (int i = 0; i < insnList.size(); i++) {
        AbstractInsnNode absIns = insnList.get(i);
        int opcode = absIns.getOpcode();
        if (opcode == retOpcode) {
            // if tries to return a Reference type into a primitive then
            // remove the unbox( we return an Object). If a primitive is returned
            // into a  primitive then we must try to box from primitive to Object/Integer, etc..

            // check if an unbox takes place before return
            final boolean[] isBoxUnbox = { false, false };
            AbstractInsnNode valueOf = null;
            AbstractInsnNode primitiveValue = null;
            if (i > 1) {
                valueOf = insnList.get(i - 1);
                primitiveValue = insnList.get(i - 2);
                if (valueOf.getOpcode() == Opcodes.INVOKESTATIC) {
                    valueOf.accept(new MethodVisitor(Opcodes.ASM5) {
                        @Override
                        public void visitMethodInsn(int i, String s, String s2, String s3) {
                            if (AutoBoxing.isPrimitive(rretType.getDescriptor())) {
                                if ((AutoBoxing.getBoxClassName(rretType) + ".valueOf").equals(s + s2)) {
                                    isBoxUnbox[0] = true;
                                }//ww  w.jav a2 s. c o m
                            }
                            super.visitMethodInsn(i, s, s2, s3);
                        }
                    });
                }

                if (isBoxUnbox[0] && primitiveValue.getOpcode() == Opcodes.INVOKEVIRTUAL) {
                    primitiveValue.accept(new MethodVisitor(Opcodes.ASM5) {
                        @Override
                        public void visitMethodInsn(int i, String s, String s2, String s3) {
                            if ((s + s2).equals(AutoBoxing.getUnBoxInvoke(rretType))) {
                                isBoxUnbox[1] = true;
                            }
                            super.visitMethodInsn(i, s, s2, s3);
                        }
                    });
                }
            }

            if (isBoxUnbox[0] && isBoxUnbox[1]) {
                // remove indexes
                insnList.remove(valueOf);
                insnList.remove(primitiveValue);
            } else {
                InsnList iList = new InsnList();
                iList.add(AutoBoxing.box(retType));
                iList.add(new InsnNode(Opcodes.ARETURN));
                insnList.insertBefore(absIns, iList);
                insnList.remove(absIns);
            }
        }
    }
    return insnList;
}