List of usage examples for org.objectweb.asm.tree InsnList InsnList
InsnList
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; }