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

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

Introduction

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

Prototype

InsnList

Source Link

Usage

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

License:Apache License

static InsnList unbox_float(int varIndex, int typeSort) {
    if (typeSort != Type.FLOAT) {
        throw new CoroutineGenerationException("unbox_float:Not a float");
    }//from  w  w w. j a v a  2 s  .  c  o  m
    InsnList insn = new InsnList();
    insn.add(new TypeInsnNode(CHECKCAST, "java/lang/Float"));
    insn.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F"));
    if (varIndex >= 0) {
        insn.add(new VarInsnNode(FSTORE, varIndex));
    }
    return insn;
}

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

License:Apache License

static InsnList unbox_int(int varIndex, int typeSort) {
    InsnList insn = new InsnList();
    switch (typeSort) {
    /*// ww w . ja v a 2 s  . c om
     * case Type.BOOLEAN: insn.add(new TypeInsnNode(CHECKCAST,
     * "java/lang/Boolean")); insn.add(new MethodInsnNode(INVOKEVIRTUAL,
     * "java/lang/Boolean", "booleanValue", "()Z")); break; case
     * Type.CHAR: insn.add(new TypeInsnNode(CHECKCAST,
     * "java/lang/Character")); insn.add(new
     * MethodInsnNode(INVOKEVIRTUAL, "java/lang/Character", "charValue",
     * "()C")); break; case Type.BYTE: insn.add(new
     * TypeInsnNode(CHECKCAST, "java/lang/Byte")); insn.add(new
     * MethodInsnNode(INVOKEVIRTUAL, "java/lang/Byte", "byteValue",
     * "()B")); break; case Type.SHORT: insn.add(new
     * TypeInsnNode(CHECKCAST, "java/lang/Short")); insn.add(new
     * MethodInsnNode(INVOKEVIRTUAL, "java/lang/Short", "shortValue",
     * "()S")); break;
     */
    case Type.BOOLEAN:
    case Type.CHAR:
    case Type.BYTE:
    case Type.SHORT:
    case Type.INT:
        insn.add(new TypeInsnNode(CHECKCAST, "java/lang/Integer"));
        insn.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I"));
        break;
    default:
        throw new CoroutineGenerationException("unbox_int:Not an int");
    }
    if (varIndex >= 0) {
        insn.add(new VarInsnNode(ISTORE, varIndex));
    }
    return insn;
}

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

License:Apache License

static InsnList unbox_long(int varIndex, int typeSort) {
    if (typeSort != Type.LONG) {
        throw new CoroutineGenerationException("unbox_long:Not a long");
    }/*from  w  w  w. j a  v  a2s  .  co  m*/
    InsnList insn = new InsnList();
    insn.add(new TypeInsnNode(CHECKCAST, "java/lang/Long"));
    insn.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J"));
    if (varIndex >= 0) {
        insn.add(new VarInsnNode(LSTORE, varIndex));
    }
    return insn;
}

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

License:Apache License

private static InsnList loadstack(int frameIndex, Type[] stackTypes, int stackTop) {
    InsnList insn = new InsnList();
    int top = stackTypes.length - 1;
    insn.add(new VarInsnNode(ALOAD, frameIndex));
    insn.add(new MethodInsnNode(INVOKEVIRTUAL, FRAME_NAME, "getOperands", "()[Ljava/lang/Object;"));
    for (int i = top; i >= stackTop; i--) {
        Type stackType = stackTypes[i];
        int typeSort = stackType.getSort();
        if (typeSort == Type.VOID) {
            insn.add(new InsnNode(ACONST_NULL));
            insn.add(new InsnNode(SWAP));
            continue;
        }//w ww  .  ja v a 2 s.  c o m
        insn.add(new InsnNode(DUP));
        // stack: array array
        insn.add(makeInt(i - stackTop));
        insn.add(new InsnNode(AALOAD));
        // stack: array element
        switch (typeSort) {
        case Type.BOOLEAN:
        case Type.CHAR:
        case Type.BYTE:
        case Type.SHORT:
        case Type.INT:
            insn.add(unbox_int(typeSort));
            insn.add(new InsnNode(SWAP));
            break;
        case Type.FLOAT:
            insn.add(unbox_float(typeSort));
            insn.add(new InsnNode(SWAP));
            break;
        case Type.LONG:
            insn.add(unbox_long(typeSort));
            insn.add(new InsnNode(DUP2_X1));
            insn.add(new InsnNode(POP2));
            break;
        case Type.DOUBLE:
            insn.add(unbox_double(typeSort));
            insn.add(new InsnNode(DUP2_X1));
            insn.add(new InsnNode(POP2));
            break;
        case Type.ARRAY:
        case Type.OBJECT:
            insn.add(new TypeInsnNode(CHECKCAST, stackType.getInternalName()));
            insn.add(new InsnNode(SWAP));
            break;
        }
        // stack: element array
    }
    insn.add(new InsnNode(POP));
    return insn;
}

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

License:Apache License

private static InsnList savestack(int frameIndex, Type[] stack, int stackTop) {
    InsnList insn = new InsnList();
    int top = stack.length - 1;
    insn.add(makeInt(stack.length - stackTop));
    insn.add(new TypeInsnNode(ANEWARRAY, "java/lang/Object"));
    // stack: element array
    for (int i = stackTop; i <= top; i++) {
        Type stackType = stack[i];
        int typeSort = stackType.getSort();
        switch (typeSort) {
        case Type.BOOLEAN:
        case Type.CHAR:
        case Type.BYTE:
        case Type.SHORT:
        case Type.INT:
            insn.add(new InsnNode(DUP_X1));
            insn.add(new InsnNode(SWAP));
            insn.add(box_int(typeSort));
            break;
        case Type.FLOAT:
            insn.add(new InsnNode(DUP_X1));
            insn.add(new InsnNode(SWAP));
            insn.add(box_float(typeSort));
            break;
        case Type.LONG:
            insn.add(new InsnNode(DUP_X2));
            insn.add(new InsnNode(DUP_X2));
            insn.add(new InsnNode(POP));
            insn.add(box_long(typeSort));
            break;
        case Type.DOUBLE:
            insn.add(new InsnNode(DUP_X2));
            insn.add(new InsnNode(DUP_X2));
            insn.add(new InsnNode(POP));
            insn.add(box_double(typeSort));
            break;
        case Type.ARRAY:
        case Type.OBJECT:
        case Type.VOID:
            insn.add(new InsnNode(DUP_X1));
            insn.add(new InsnNode(SWAP));
            break;
        }/*from w  w w  .jav  a2s  .co m*/
        // stack: array array element
        insn.add(makeInt(i - stackTop));
        insn.add(new InsnNode(SWAP));
        // stack: array array int element
        insn.add(new InsnNode(AASTORE));
    }
    insn.add(new VarInsnNode(ALOAD, frameIndex));
    insn.add(new InsnNode(SWAP));
    insn.add(new MethodInsnNode(INVOKEVIRTUAL, FRAME_NAME, "setOperands", "([Ljava/lang/Object;)V"));
    return insn;
}

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

License:Apache License

private InsnList codeAfter() {
    InsnList insn = new InsnList();
    insn.add(yieldLabel);/*from   w  ww . j  a va 2s . co m*/
    insn.add(emitCleanFrame());
    insn.add(new VarInsnNode(ALOAD, in));
    insn.add(new InsnNode(ARETURN));
    insn.add(new FrameNode(F_SAME, 0, EMPTY_LOCALS, 0, EMPTY_STACK));
    insn.add(throwex(INVALID_COROUTINE_EXCEPTION));
    return insn;
}

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

License:Apache License

private InsnList codeBefore(List<LabelNode> gotos) {
    InsnList insn = new InsnList();
    /*/*from w w w . j a v a  2 s  .c o m*/
     * int state = frame.getState(); Object[] locals = frame.getLocals();
     */
    {
        insn.add(new VarInsnNode(ALOAD, frame));
        insn.add(new MethodInsnNode(INVOKEVIRTUAL, FRAME_NAME, "getState", "()I"));
        insn.add(new VarInsnNode(ISTORE, state));
        insn.add(new VarInsnNode(ALOAD, frame));
        insn.add(new MethodInsnNode(INVOKEVIRTUAL, FRAME_NAME, "getLocals", "()[Ljava/lang/Object;"));
        insn.add(new VarInsnNode(ASTORE, localsArray));
    }
    /*
     * if (chkclosed) throw closed;
     */
    {
        insn.add(new VarInsnNode(ILOAD, state));
        insn.add(new InsnNode(ICONST_M1));
        LabelNode exitBranch = new LabelNode();
        insn.add(new JumpInsnNode(IF_ICMPNE, exitBranch));
        insn.add(throwex(COROUTINE_CLOSED_EXCEPTION));
        insn.add(exitBranch);
        // frame: [(this)?, frame, in, out, state, locals]
        insn.add(new FrameNode(F_APPEND, 2, new Object[] { INTEGER, "[Ljava/lang/Object;" }, 0, EMPTY_STACK));
    }
    /*
     * switch(state){case 0: break; case n: goto yield; case _wrong_: throw
     * invalid;} arg1, arg2, arg3 = locals[i..j] if (chkexit) throw closed;
     */
    {
        insn.add(new VarInsnNode(ILOAD, state));
        LabelNode defaultBranch = new LabelNode();
        gotos.add(0, new LabelNode());
        int sz = gotos.size();
        LabelNode[] handlers = new LabelNode[sz];
        for (int i = 0; i < sz; i++) {
            handlers[i] = new LabelNode();
        }
        insn.add(new TableSwitchInsnNode(0, sz - 1, defaultBranch, handlers));
        for (int i = 0; i < sz; i++) {
            LabelNode li = handlers[i];
            LabelNode gotoi = gotos.get(i);
            insn.add(li);
            insn.add(new FrameNode(F_SAME, 0, EMPTY_LOCALS, 0, EMPTY_STACK));
            insn.add(new JumpInsnNode(GOTO, gotoi));
        }
        insn.add(defaultBranch);
        insn.add(new FrameNode(F_SAME, 0, EMPTY_LOCALS, 0, EMPTY_STACK));
        insn.add(throwex(INVALID_COROUTINE_EXCEPTION));
        insn.add(gotos.get(0));
        insn.add(new FrameNode(F_SAME, 0, EMPTY_LOCALS, 0, EMPTY_STACK));
        insn.add(getlocs(localsArray, localsStartIndex, isStatic ? 0 : 1, methodArguments));
        insn.add(new VarInsnNode(ALOAD, frame));
        insn.add(new MethodInsnNode(INVOKEVIRTUAL, FRAME_NAME, "isCoroutineClosed", "()Z"));
        LabelNode continueHere = new LabelNode();
        insn.add(new JumpInsnNode(IFEQ, continueHere));
        insn.add(throwex(COROUTINE_CLOSED_EXCEPTION));
        insn.add(continueHere);
        insn.add(mergeFrames(methodArguments));
        // add NOP in case that user code contains stack map here
        insn.add(new InsnNode(NOP));
        gotos.remove(0);
    }
    return insn;
}

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

License:Apache License

private InsnList input(Type type) {
    InsnList insn = new InsnList();
    if (type != null) {
        int typeSort = type.getSort();
        switch (typeSort) {
        case Type.BOOLEAN:
        case Type.CHAR:
        case Type.BYTE:
        case Type.SHORT:
        case Type.INT:
            insn.add(box_int(typeSort));
            break;
        case Type.FLOAT:
            insn.add(box_float(typeSort));
            break;
        case Type.LONG:
            insn.add(box_long(typeSort));
            break;
        case Type.DOUBLE:
            insn.add(box_double(typeSort));
            break;
        case Type.ARRAY:
        case Type.OBJECT:
        case Type.VOID:
            break;
        }//from   ww w  .ja  va2  s.  c o m
    }
    insn.add(new VarInsnNode(ASTORE, in));
    return insn;
}

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

License:Apache License

private InsnList restoreLocals(Type[] locals) {
    // restore saved locals
    int varIndex = isStatic ? 0 : 1;
    int nLocals = locals.length;
    InsnList insn = new InsnList();
    while (varIndex < nLocals) {
        Type t = locals[varIndex];
        if (t != null) {
            insn.add(getloc(localsArray, varIndex + variableIndexOffset, varIndex, t));
            varIndex += t.getSize();/*from w ww  .  ja v a2 s . c  om*/
        } else {
            varIndex += 1;
        }
    }
    return insn;
}

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

License:Apache License

private InsnList saveLocals(Type[] locals) {
    InsnList insn = new InsnList();
    int nLocals = locals.length;
    for (int i = 0; i < nLocals; i++) {
        Type local = locals[i];/* www. j  a  va  2  s.  c o  m*/
        if (local != null && !finals[i]) {
            insn.add(saveloc(localsArray, i + variableIndexOffset, i, local));
            finals[i] = true;
        }
    }
    return insn;
}