Example usage for org.objectweb.asm Opcodes DUP

List of usage examples for org.objectweb.asm Opcodes DUP

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes DUP.

Prototype

int DUP

To view the source code for org.objectweb.asm Opcodes DUP.

Click Source Link

Usage

From source file:org.spongepowered.asm.mixin.injection.callback.CallbackInjector.java

License:MIT License

/**
 * If this is a ReturnEventInfo AND we are right before a RETURN opcode (so
 * we can expect the *original* return value to be on the stack, then we dup
 * the return value into a local var so we can push it later when we invoke
 * the ReturnEventInfo ctor//from  w  w w.ja v  a2 s .c  om
 * 
 * @param callback callback handle
 */
private void dupReturnValue(final Callback callback) {
    if (!callback.isAtReturn) {
        return;
    }

    callback.add(new InsnNode(Opcodes.DUP));
    callback.add(new VarInsnNode(callback.target.returnType.getOpcode(Opcodes.ISTORE), callback.marshallVar));
}

From source file:org.summer.aop.ltw.AuxiliaryWeaver.java

License:Open Source License

private int storeArgumentAt(int index, int localSlot) {
    visitInsn(Opcodes.DUP);
    pushInteger(index);/*from   www.ja v  a 2s  .  c om*/
    switch (argTypes[index].getSort()) {
    case Type.BYTE:
        visitVarInsn(ILOAD, localSlot);
        visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
        break;
    case Type.SHORT:
        visitVarInsn(ILOAD, localSlot);
        visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
        break;
    case Type.INT:
        visitVarInsn(ILOAD, localSlot);
        visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
        break;
    case Type.BOOLEAN:
        visitVarInsn(ILOAD, localSlot);
        visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
        break;
    case Type.CHAR:
        visitVarInsn(ILOAD, localSlot);
        visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;");
        break;
    case Type.LONG:
        visitVarInsn(LLOAD, localSlot);
        ++localSlot;
        visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
        break;
    case Type.FLOAT:
        visitVarInsn(FLOAD, localSlot);
        visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
        break;
    case Type.DOUBLE:
        visitVarInsn(DLOAD, localSlot);
        ++localSlot;
        visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
        break;
    default:
        visitVarInsn(ALOAD, localSlot);
    }
    visitInsn(AASTORE);
    return localSlot + 1;
}

From source file:org.teavm.flavour.regex.bytecode.MatcherClassBuilder.java

License:Apache License

private void buildForkMethod(ClassVisitor cv, String className) {
    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC, "fork", "()" + Type.getDescriptor(Matcher.class),
            null, null);//from   w w  w .j ava  2s .c  o m
    mv.visitCode();

    mv.visitTypeInsn(Opcodes.NEW, className);
    mv.visitInsn(Opcodes.DUP);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, className, "<init>", "()V", false);

    mv.visitInsn(Opcodes.DUP);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitFieldInsn(Opcodes.GETFIELD, className, "domain", "I");
    mv.visitFieldInsn(Opcodes.PUTFIELD, className, "domain", "I");

    mv.visitInsn(Opcodes.DUP);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitFieldInsn(Opcodes.GETFIELD, className, "state", "I");
    mv.visitFieldInsn(Opcodes.PUTFIELD, className, "state", "I");

    mv.visitInsn(Opcodes.DUP);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitFieldInsn(Opcodes.GETFIELD, className, "index", "I");
    mv.visitFieldInsn(Opcodes.PUTFIELD, className, "index", "I");

    mv.visitInsn(Opcodes.ARETURN);

    mv.visitMaxs(2, 1);
    mv.visitEnd();
}

From source file:org.teavm.flavour.regex.bytecode.MatcherClassBuilder.java

License:Apache License

private void generateLengthGuard(MethodVisitor mv) {
    mv.visitVarInsn(Opcodes.ILOAD, 3);//from   ww  w. ja v a 2 s  .  co m
    mv.visitVarInsn(Opcodes.ILOAD, 2);
    mv.visitInsn(Opcodes.ISUB);
    mv.visitJumpInsn(Opcodes.IFLE, saveLabel);

    mv.visitVarInsn(Opcodes.ALOAD, 1);
    mv.visitVarInsn(Opcodes.ILOAD, 2);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "charAt", "(I)C", false);
    mv.visitVarInsn(Opcodes.ISTORE, 6);

    if (debugMode) {
        mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", Type.getDescriptor(PrintStream.class));
        mv.visitInsn(Opcodes.DUP);
        mv.visitLdcInsn("DFA <- ");
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "print", "(Ljava/lang/String;)V",
                false);
        mv.visitInsn(Opcodes.DUP);
        mv.visitVarInsn(Opcodes.ILOAD, 6);
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "print", "(C)V", false);
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "()V", false);
    }
}

From source file:org.zoeey.ztpl.compiler.ByteCodeHelper.java

License:LGPL

/**
 *  template// w  w w.  java  2 s.c om
 */
public void callClass(String className) {
    className = ZtplConstant.CLASS_URI + className;
    mv.visitTypeInsn(Opcodes.NEW, className);
    mv.visitInsn(Opcodes.DUP);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, className, "<init>", "()V");
    //
    mv.visitVarInsn(Opcodes.ALOAD, VAR_INDEX_WRITER);
    mv.visitVarInsn(Opcodes.ALOAD, VAR_INDEX_PARAMSMAP);
    mv.visitVarInsn(Opcodes.ALOAD, VAR_INDEX_ZTPL);
    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, ZtplConstant.TEMPLATE_INTERFACE//
            , "publish", "(Ljava/io/Writer;Ljava/util/Map;Lorg/zoeey/ztpl/Ztpl;)V");
}

From source file:org.zoeey.ztpl.compiler.ByteCodeHelper.java

License:LGPL

/**
 * /*from w ww .ja  v  a 2  s .  c o  m*/
 * @param className ??
 * @param paramsPos ?
 * @param pos
 */
public void callFunction(String className, int paramsPos) {
    String classPath = className.replace('.', '/');
    /**
     * ?
     */
    mv.visitTypeInsn(Opcodes.NEW, classPath);
    mv.visitInsn(Opcodes.DUP);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, classPath, "<init>", "()V");
    // invoke call()
    mv.visitVarInsn(Opcodes.ALOAD, paramsPos);
    mv.visitVarInsn(Opcodes.ALOAD, VAR_INDEX_ZTPL);
    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, FunctionAble.class.getName().replace('.', '/'), "call", //
            "(Lorg/zoeey/ztpl/ParamsMap;Lorg/zoeey/ztpl/Ztpl;)Ljava/lang/String;");
}

From source file:org.zoeey.ztpl.compiler.ByteCodeHelper.java

License:LGPL

/**
 * ?<br />/*from w w  w. j a v a2s.c  o  m*/
 * ? var paramsMap_* = new ParamsMap();<br />
 * ex. {echo varA="a" varB="b"} <br />
 * ?? map{"varA":"a","varB":"b"}
 *
 */
public int newMap() {
    int pos = tracker.next();
    mv.visitTypeInsn(Opcodes.NEW, "org/zoeey/ztpl/ParamsMap");
    mv.visitInsn(Opcodes.DUP);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "org/zoeey/ztpl/ParamsMap", "<init>", "()V");
    mv.visitVarInsn(Opcodes.ASTORE, pos);
    return pos;
}

From source file:pl.clareo.coroutines.core.ClassTransformer.java

License:Apache License

@SuppressWarnings("unchecked")
private static InsnList createDebugFrame(MethodNode coroutine) {
    InsnList insn = new InsnList();
    int nLocals = coroutine.maxLocals;
    String[] names = new String[nLocals];
    List<LocalVariableNode> locals = coroutine.localVariables;
    fillVariableNames(names, locals);/*from   ww w  . j  av a  2  s .  c  o  m*/
    insn.add(new TypeInsnNode(Opcodes.NEW, FRAME_NAME));
    insn.add(new InsnNode(Opcodes.DUP));
    insn.add(makeInt(nLocals));
    insn.add(makeInt(nLocals));
    insn.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/String"));
    for (LocalVariableNode local : locals) {
        int i = local.index;
        String name = names[i];
        insn.add(new InsnNode(Opcodes.DUP));
        insn.add(makeInt(i));
        if (name != null) {
            insn.add(new LdcInsnNode(name));
        } else {
            insn.add(new InsnNode(Opcodes.ACONST_NULL));
        }
        insn.add(new InsnNode(Opcodes.AASTORE));
    }
    insn.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, FRAME_NAME, "<init>", "(I[Ljava/lang/String;)V"));
    return insn;
}

From source file:pl.clareo.coroutines.core.ClassTransformer.java

License:Apache License

private static InsnList createFrame(MethodNode coroutine) {
    InsnList insn = new InsnList();
    insn.add(new TypeInsnNode(Opcodes.NEW, FRAME_NAME));
    insn.add(new InsnNode(Opcodes.DUP));
    insn.add(makeInt(coroutine.maxLocals));
    insn.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, FRAME_NAME, "<init>", "(I)V"));
    return insn;/* w w w .  j  av  a 2  s  .c o  m*/
}

From source file:pl.clareo.coroutines.core.ClassTransformer.java

License:Apache License

private static InsnList loggingInstructions(String ownerName, String loggerField, Level level,
        Object... messages) {//from   w  w  w .  jav  a2  s  .com
    InsnList insn = new InsnList();
    insn.add(new FieldInsnNode(Opcodes.GETSTATIC, ownerName, loggerField, "Ljava/util/logging/Logger;"));
    insn.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/util/logging/Level", level.getName(),
            "Ljava/util/logging/Level;"));
    // stack: * *
    insn.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/util/logging/Logger", "isLoggable",
            "(Ljava/util/logging/Level;)Z"));
    // stack: *
    LabelNode exitBranch = new LabelNode();
    insn.add(new JumpInsnNode(Opcodes.IFEQ, exitBranch));
    // stack:
    insn.add(new FieldInsnNode(Opcodes.GETSTATIC, ownerName, loggerField, "Ljava/util/logging/Logger;"));
    insn.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/util/logging/Level", level.getName(),
            "Ljava/util/logging/Level;"));
    // stack: * *
    insn.add(new TypeInsnNode(Opcodes.NEW, "java/lang/StringBuilder"));
    insn.add(new InsnNode(Opcodes.DUP));
    // stack: * * * *
    String message0 = messages[0].toString();
    insn.add(new LdcInsnNode(message0));
    // stack: * * * * *
    insn.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>",
            "(Ljava/lang/String;)V"));
    // stack: * * *
    for (int m = 1; m < messages.length; m++) {
        Object message = messages[m];
        if (message instanceof Number) {
            insn.add(new VarInsnNode(Opcodes.ALOAD, ((Number) message).intValue()));
        } else {
            insn.add(new LdcInsnNode(message.toString()));
        }
        // stack: * * * *
        insn.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/Object;)Ljava/lang/StringBuilder;"));
        // stack: * * *
    }
    insn.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString",
            "()Ljava/lang/String;"));
    insn.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/util/logging/Logger", "log",
            "(Ljava/util/logging/Level;Ljava/lang/String;)V"));
    // stack:
    insn.add(exitBranch);
    return insn;
}