类 JSRInlinerAdapter
java.lang.Object
cn.taketoday.bytecode.MethodVisitor
cn.taketoday.bytecode.tree.MethodNode
cn.taketoday.bytecode.commons.JSRInlinerAdapter
- 所有已实现的接口:
Opcodes
A
MethodVisitor that removes JSR instructions and inlines the
referenced subroutines.- 作者:
- Niko Matsakis
-
嵌套类概要
嵌套类 -
字段概要
字段修饰符和类型字段说明private final BitSetThe instructions that belong to the main "subroutine".(专用程序包) final BitSetThe instructions that belong to more that one subroutine.The instructions that belong to each subroutine.从类继承的字段 cn.taketoday.bytecode.tree.MethodNode
access, annotationDefault, attrs, desc, exceptions, instructions, invisibleAnnotableParameterCount, invisibleAnnotations, invisibleLocalVariableAnnotations, invisibleParameterAnnotations, invisibleTypeAnnotations, localVariables, maxLocals, maxStack, name, parameters, signature, tryCatchBlocks, visibleAnnotableParameterCount, visibleAnnotations, visibleLocalVariableAnnotations, visibleParameterAnnotations, visibleTypeAnnotations从类继承的字段 cn.taketoday.bytecode.MethodVisitor
mv从接口继承的字段 cn.taketoday.bytecode.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JAVA_VERSION, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PRIVATE_FINAL_STATIC, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, SWITCH_STYLE_HASH, SWITCH_STYLE_HASHONLY, SWITCH_STYLE_TRIE, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V9 -
构造器概要
构造器构造器说明JSRInlinerAdapter(MethodVisitor methodVisitor, int access, String name, String descriptor, String signature, String[] exceptions) Constructs a newJSRInlinerAdapter. -
方法概要
修饰符和类型方法说明private voidemitCode()Creates the new instructions, inlining each instantiation of each subroutine until the code is fully elaborated.private voidemitInstantiation(JSRInlinerAdapter.Instantiation instantiation, List<JSRInlinerAdapter.Instantiation> worklist, InsnList newInstructions, List<TryCatchBlockNode> newTryCatchBlocks, List<LocalVariableNode> newLocalVariables) Emits an instantiation of a subroutine, specified byinstantiation.private voidfindReachableInsns(int insnIndex, BitSet subroutineInsns, BitSet visitedInsns) Finds the instructions that are reachable from the given instruction, without following any JSR instruction nor any exception handler.private voidfindSubroutineInsns(int startInsnIndex, BitSet subroutineInsns, BitSet visitedInsns) Finds the instructions that belong to the subroutine starting at the given instruction index.private voidDetermines, for each instruction, to which subroutine(s) it belongs.voidvisitEnd()Visits the end of the method.voidvisitJumpInsn(int opcode, Label label) Visits a jump instruction.从类继承的方法 cn.taketoday.bytecode.tree.MethodNode
accept, accept, getLabelNode, visitAnnotableParameterCount, visitAnnotation, visitAnnotationDefault, visitAttribute, visitCode, visitFieldInsn, visitFrame, visitIincInsn, visitInsn, visitInsnAnnotation, visitIntInsn, visitInvokeDynamicInsn, visitLabel, visitLdcInsn, visitLineNumber, visitLocalVariable, visitLocalVariableAnnotation, visitLookupSwitchInsn, visitMaxs, visitMethodInsn, visitMultiANewArrayInsn, visitParameter, visitParameterAnnotation, visitTableSwitchInsn, visitTryCatchAnnotation, visitTryCatchBlock, visitTypeAnnotation, visitTypeInsn, visitVarInsn从类继承的方法 cn.taketoday.bytecode.MethodVisitor
visitMethodInsn
-
字段详细资料
-
mainSubroutineInsns
The instructions that belong to the main "subroutine". Bit i is set iff instruction at index i belongs to this main "subroutine". -
subroutinesInsns
The instructions that belong to each subroutine. For each label which is the target of a JSR instruction, bit i of the corresponding BitSet in this map is set iff instruction at index i belongs to this subroutine.
-
-
构造器详细资料
-
JSRInlinerAdapter
public JSRInlinerAdapter(MethodVisitor methodVisitor, int access, String name, String descriptor, String signature, String[] exceptions) Constructs a newJSRInlinerAdapter.- 参数:
methodVisitor- the method visitor to send the resulting inlined method code to, ornull.access- the method's access flags.name- the method's name.descriptor- the method's descriptor.signature- the method's signature. May be null.exceptions- the internal names of the method's exception classes. May be null.
-
-
方法详细资料
-
visitJumpInsn
从类复制的说明:MethodVisitorVisits a jump instruction. A jump instruction is an instruction that may jump to another instruction.- 覆盖:
visitJumpInsn在类中MethodNode- 参数:
opcode- the opcode of the type instruction to be visited. This opcode is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.label- the operand of the instruction to be visited. This operand is a label that designates the instruction to which the jump instruction may jump.
-
visitEnd
public void visitEnd()从类复制的说明:MethodVisitorVisits the end of the method. This method, which is the last one to be called, is used to inform the visitor that all the annotations and attributes of the method have been visited.- 覆盖:
visitEnd在类中MethodNode
-
findSubroutinesInsns
private void findSubroutinesInsns()Determines, for each instruction, to which subroutine(s) it belongs. -
findSubroutineInsns
Finds the instructions that belong to the subroutine starting at the given instruction index. For this the control flow graph is visited with a depth first search (this includes the normal control flow and the exception handlers).- 参数:
startInsnIndex- the index of the first instruction of the subroutine.subroutineInsns- where the indices of the instructions of the subroutine must be stored.visitedInsns- the indices of the instructions that have been visited so far (including in previous calls to this method). This bitset is updated by this method each time a new instruction is visited. It is used to make sure each instruction is visited at most once.
-
findReachableInsns
Finds the instructions that are reachable from the given instruction, without following any JSR instruction nor any exception handler. For this the control flow graph is visited with a depth first search.- 参数:
insnIndex- the index of an instruction of the subroutine.subroutineInsns- where the indices of the instructions of the subroutine must be stored.visitedInsns- the indices of the instructions that have been visited so far (including in previous calls to this method). This bitset is updated by this method each time a new instruction is visited. It is used to make sure each instruction is visited at most once.
-
emitCode
private void emitCode()Creates the new instructions, inlining each instantiation of each subroutine until the code is fully elaborated. -
emitInstantiation
private void emitInstantiation(JSRInlinerAdapter.Instantiation instantiation, List<JSRInlinerAdapter.Instantiation> worklist, InsnList newInstructions, List<TryCatchBlockNode> newTryCatchBlocks, List<LocalVariableNode> newLocalVariables) Emits an instantiation of a subroutine, specified byinstantiation. May add new instantiations that are invoked by this one to theworklist, and new try/catch blocks tonewTryCatchBlocks.- 参数:
instantiation- the instantiation that must be performed.worklist- list of the instantiations that remain to be done.newInstructions- the instruction list to which the instantiated code must be appended.newTryCatchBlocks- the exception handler list to which the instantiated handlers must be appended.newLocalVariables- the local variables list to which the instantiated local variables must be appended.
-