public class JSRInlinerAdapter extends MethodNode implements Opcodes
MethodVisitor
that removes JSR instructions and inlines the
referenced subroutines.Modifier and Type | Class and Description |
---|---|
private class |
JSRInlinerAdapter.Instantiation
An instantiation of a subroutine.
|
Modifier and Type | Field and Description |
---|---|
private java.util.BitSet |
mainSubroutineInsns
The instructions that belong to the main "subroutine".
|
(package private) java.util.BitSet |
sharedSubroutineInsns
The instructions that belong to more that one subroutine.
|
private java.util.Map<LabelNode,java.util.BitSet> |
subroutinesInsns
The instructions that belong to each subroutine.
|
access, annotationDefault, attrs, desc, exceptions, instructions, invisibleAnnotableParameterCount, invisibleAnnotations, invisibleLocalVariableAnnotations, invisibleParameterAnnotations, invisibleTypeAnnotations, localVariables, maxLocals, maxStack, name, parameters, signature, tryCatchBlocks, visibleAnnotableParameterCount, visibleAnnotations, visibleLocalVariableAnnotations, visibleParameterAnnotations, visibleTypeAnnotations
api, mv
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_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, ASM4, ASM5, ASM6, ASM7, 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, 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, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, 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, V9
Modifier | Constructor and Description |
---|---|
protected |
JSRInlinerAdapter(int api,
MethodVisitor methodVisitor,
int access,
java.lang.String name,
java.lang.String descriptor,
java.lang.String signature,
java.lang.String[] exceptions)
Constructs a new
JSRInlinerAdapter . |
|
JSRInlinerAdapter(MethodVisitor methodVisitor,
int access,
java.lang.String name,
java.lang.String descriptor,
java.lang.String signature,
java.lang.String[] exceptions)
Constructs a new
JSRInlinerAdapter . |
Modifier and Type | Method and Description |
---|---|
private void |
emitCode()
Creates the new instructions, inlining each instantiation of each subroutine until the code is
fully elaborated.
|
private void |
emitInstantiation(JSRInlinerAdapter.Instantiation instantiation,
java.util.List<JSRInlinerAdapter.Instantiation> worklist,
InsnList newInstructions,
java.util.List<TryCatchBlockNode> newTryCatchBlocks,
java.util.List<LocalVariableNode> newLocalVariables)
Emits an instantiation of a subroutine, specified by
instantiation . |
private void |
findReachableInsns(int insnIndex,
java.util.BitSet subroutineInsns,
java.util.BitSet visitedInsns)
Finds the instructions that are reachable from the given instruction, without following any JSR
instruction nor any exception handler.
|
private void |
findSubroutineInsns(int startInsnIndex,
java.util.BitSet subroutineInsns,
java.util.BitSet visitedInsns)
Finds the instructions that belong to the subroutine starting at the given instruction index.
|
private void |
findSubroutinesInsns()
Determines, for each instruction, to which subroutine(s) it belongs.
|
void |
visitEnd()
Visits the end of the method.
|
void |
visitJumpInsn(int opcode,
Label label)
Visits a jump instruction.
|
accept, accept, check, 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
visitMethodInsn
private final java.util.BitSet mainSubroutineInsns
private final java.util.Map<LabelNode,java.util.BitSet> subroutinesInsns
final java.util.BitSet sharedSubroutineInsns
public JSRInlinerAdapter(MethodVisitor methodVisitor, int access, java.lang.String name, java.lang.String descriptor, java.lang.String signature, java.lang.String[] exceptions)
JSRInlinerAdapter
. Subclasses must not use this constructor.
Instead, they must use the JSRInlinerAdapter(int, MethodVisitor, int, String, String,
String, String[])
version.methodVisitor
- the method visitor to send the resulting inlined method code to, or
null
.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.java.lang.IllegalStateException
- if a subclass calls this constructor.protected JSRInlinerAdapter(int api, MethodVisitor methodVisitor, int access, java.lang.String name, java.lang.String descriptor, java.lang.String signature, java.lang.String[] exceptions)
JSRInlinerAdapter
.api
- the ASM API version implemented by this visitor. Must be one of Opcodes.ASM4
, Opcodes.ASM5
, Opcodes.ASM6
or Opcodes.ASM7
.methodVisitor
- the method visitor to send the resulting inlined method code to, or
null
.access
- the method's access flags (see Opcodes
). This parameter also indicates if
the method is synthetic and/or deprecated.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.public void visitJumpInsn(int opcode, Label label)
MethodVisitor
visitJumpInsn
in class 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.public void visitEnd()
MethodVisitor
visitEnd
in class MethodNode
private void findSubroutinesInsns()
private void findSubroutineInsns(int startInsnIndex, java.util.BitSet subroutineInsns, java.util.BitSet visitedInsns)
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.private void findReachableInsns(int insnIndex, java.util.BitSet subroutineInsns, java.util.BitSet visitedInsns)
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.private void emitCode()
private void emitInstantiation(JSRInlinerAdapter.Instantiation instantiation, java.util.List<JSRInlinerAdapter.Instantiation> worklist, InsnList newInstructions, java.util.List<TryCatchBlockNode> newTryCatchBlocks, java.util.List<LocalVariableNode> newLocalVariables)
instantiation
. May add new
instantiations that are invoked by this one to the worklist
, and new try/catch
blocks to newTryCatchBlocks
.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.