|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
java.lang.Objectorg.objectweb.asm.tree.MemberNode
org.objectweb.asm.tree.MethodNode
org.objectweb.asm.commons.JSRInlinerAdapter
public class JSRInlinerAdapter
A MethodAdapter that removes JSR instructions and
inlines the referenced subroutines.
Explanation of how it works TODO
| Nested Class Summary | |
|---|---|
private class |
JSRInlinerAdapter.Instantiation
A class that represents an instantiation of a subroutine. |
protected static class |
JSRInlinerAdapter.Subroutine
|
| Field Summary | |
|---|---|
private java.util.BitSet |
dualCitizens
This BitSet contains the index of every instruction that belongs to more than one subroutine. |
private static boolean |
LOGGING
|
private JSRInlinerAdapter.Subroutine |
mainSubroutine
This subroutine instance denotes the line of execution that is not contained within any subroutine; i.e., the "subroutine" that is executing when a method first begins. |
private MethodVisitor |
mv
The visitor to which we will emit a translation of this method without internal subroutines. |
private java.util.Map |
subroutineHeads
For each label that is jumped to by a JSR, we create a Subroutine instance. |
| Fields inherited from class org.objectweb.asm.tree.MethodNode |
|---|
access, annotationDefault, desc, exceptions, instructions, invisibleParameterAnnotations, localVariables, maxLocals, maxStack, name, signature, tryCatchBlocks, visibleParameterAnnotations |
| Fields inherited from class org.objectweb.asm.tree.MemberNode |
|---|
attrs, invisibleAnnotations, visibleAnnotations |
| Constructor Summary | |
|---|---|
JSRInlinerAdapter(MethodVisitor mv,
int access,
java.lang.String name,
java.lang.String desc,
java.lang.String signature,
java.lang.String[] exceptions)
Creates a new JSRInliner. |
|
| Method Summary | |
|---|---|
private void |
emitCode()
Creates the new instructions, inlining each instantiation of each subroutine until the code is fully elaborated. |
private void |
emitSubroutine(JSRInlinerAdapter.Instantiation instant,
java.util.List worklist,
InsnList newInstructions,
java.util.List newTryCatchBlocks,
java.util.List newLocalVariables)
Emits one instantiation of one subroutine, specified by instant. |
private static void |
log(java.lang.String str)
|
private void |
markSubroutines()
Walks the method and determines which internal subroutine(s), if any, each instruction is a method of. |
private void |
markSubroutineWalk(JSRInlinerAdapter.Subroutine sub,
int index,
java.util.BitSet anyvisited)
Performs a depth first search walking the normal byte code path starting at index, and adding each instruction encountered into
the subroutine sub. |
private void |
markSubroutineWalkDFS(JSRInlinerAdapter.Subroutine sub,
int index,
java.util.BitSet anyvisited)
Performs a simple DFS of the instructions, assigning each to the subroutine sub. |
void |
visitEnd()
If any JSRs were seen, triggers the inlining process. |
void |
visitJumpInsn(int opcode,
Label lbl)
Detects a JSR instruction and sets a flag to indicate we will need to do inlining. |
| Methods inherited from class org.objectweb.asm.tree.MethodNode |
|---|
accept, accept, getLabelNode, visitAnnotationDefault, visitCode, visitFieldInsn, visitFrame, visitIincInsn, visitInsn, visitIntInsn, visitLabel, visitLdcInsn, visitLineNumber, visitLocalVariable, visitLookupSwitchInsn, visitMaxs, visitMethodInsn, visitMultiANewArrayInsn, visitParameterAnnotation, visitTableSwitchInsn, visitTryCatchBlock, visitTypeInsn, visitVarInsn |
| Methods inherited from class org.objectweb.asm.tree.MemberNode |
|---|
visitAnnotation, visitAttribute |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Methods inherited from interface org.objectweb.asm.MethodVisitor |
|---|
visitAnnotation, visitAttribute |
| Field Detail |
|---|
private static final boolean LOGGING
private final MethodVisitor mv
private final java.util.Map subroutineHeads
private final JSRInlinerAdapter.Subroutine mainSubroutine
private final java.util.BitSet dualCitizens
| Constructor Detail |
|---|
public JSRInlinerAdapter(MethodVisitor mv,
int access,
java.lang.String name,
java.lang.String desc,
java.lang.String signature,
java.lang.String[] exceptions)
mv - the MethodVisitor to send the resulting inlined
method code to (use null for none).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.desc - the method's descriptor (see Type).signature - the method's signature. May be null.exceptions - the internal names of the method's exception classes
(see getInternalName). May be
null.| Method Detail |
|---|
public void visitJumpInsn(int opcode,
Label lbl)
visitJumpInsn in interface MethodVisitorvisitJumpInsn in class MethodNodeopcode - 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.lbl - 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()
visitEnd in interface MethodVisitorvisitEnd in class MemberNodeprivate void markSubroutines()
private void markSubroutineWalk(JSRInlinerAdapter.Subroutine sub,
int index,
java.util.BitSet anyvisited)
index, and adding each instruction encountered into
the subroutine sub. After this walk is complete, iterates
over the exception handlers to ensure that we also include those byte
codes which are reachable through an exception that may be thrown during
the execution of the subroutine. Invoked from
markSubroutines().
sub - the subroutine whose instructions must be computed.index - an instruction of this subroutine.anyvisited - indexes of the already visited instructions, i.e.
marked as part of this subroutine or any previously computed
subroutine.
private void markSubroutineWalkDFS(JSRInlinerAdapter.Subroutine sub,
int index,
java.util.BitSet anyvisited)
sub. Starts from index.
Invoked only by markSubroutineWalk().
sub - the subroutine whose instructions must be computed.index - an instruction of this subroutine.anyvisited - indexes of the already visited instructions, i.e.
marked as part of this subroutine or any previously computed
subroutine.private void emitCode()
private void emitSubroutine(JSRInlinerAdapter.Instantiation instant,
java.util.List worklist,
InsnList newInstructions,
java.util.List newTryCatchBlocks,
java.util.List newLocalVariables)
instant. May add new instantiations that are invoked by
this one to the worklist parameter, and new try/catch
blocks to newTryCatchBlocks.
instant - 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.private static void log(java.lang.String str)
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||