| java.lang.Object bsh.org.objectweb.asm.CodeWriter
CodeWriter | public class CodeWriter implements CodeVisitor(Code) | | A
CodeVisitor CodeVisitor that generates Java bytecode instructions.
Each visit method of this class appends the bytecode corresponding to the
visited instruction to a byte vector, in the order these methods are called.
|
Method Summary | |
protected byte[] | getCode() Returns the current bytecode of this method. | protected int | getCodeSize() Returns the current size of the bytecode of this method. | static int | getNewOffset(int[] indexes, int[] sizes, int begin, int end) Computes the future value of a bytecode offset.
Note: it is possible to have several entries for the same instruction
in the indexes and sizes: two entries (index=a,size=b)
and (index=a,size=b') are equivalent to a single entry (index=a,size=b+b').
Parameters: indexes - current positions of the instructions to be resized. | final int | getSize() Returns the size of the bytecode of this method. | protected void | init(int access, String name, String desc, String[] exceptions) Initializes this CodeWriter to define the bytecode of the specified method.
Parameters: access - the method's access flags (see Constants). Parameters: name - the method's name. Parameters: desc - the method's descriptor (see Type Type). Parameters: exceptions - the internal names of the method's exceptions. | final void | put(ByteVector out) Puts the bytecode of this method in the given byte vector. | static int | readInt(byte[] b, int index) Reads a signed int value in the given byte array.
Parameters: b - a byte array. Parameters: index - the start index of the value to be read. | static short | readShort(byte[] b, int index) Reads a signed short value in the given byte array.
Parameters: b - a byte array. Parameters: index - the start index of the value to be read. | static int | readUnsignedShort(byte[] b, int index) Reads an unsigned short value in the given byte array.
Parameters: b - a byte array. Parameters: index - the start index of the value to be read. | protected int[] | resizeInstructions(int[] indexes, int[] sizes, int len) Resizes the designated instructions, while keeping jump offsets and
instruction addresses consistent. | public void | visitFieldInsn(int opcode, String owner, String name, String desc) | public void | visitIincInsn(int var, int increment) | public void | visitInsn(int opcode) | public void | visitIntInsn(int opcode, int operand) | public void | visitJumpInsn(int opcode, Label label) | public void | visitLabel(Label label) | public void | visitLdcInsn(Object cst) | public void | visitLineNumber(int line, Label start) | public void | visitLocalVariable(String name, String desc, Label start, Label end, int index) | public void | visitLookupSwitchInsn(Label dflt, int keys, Label labels) | public void | visitMaxs(int maxStack, int maxLocals) | public void | visitMethodInsn(int opcode, String owner, String name, String desc) | public void | visitMultiANewArrayInsn(String desc, int dims) | public void | visitTableSwitchInsn(int min, int max, Label dflt, Label labels) | public void | visitTryCatchBlock(Label start, Label end, Label handler, String type) | public void | visitTypeInsn(int opcode, String desc) | public void | visitVarInsn(int opcode, int var) | static void | writeShort(byte[] b, int index, int s) Writes a short value in the given byte array. |
CHECK | final static boolean CHECK(Code) | | true if preconditions must be checked at runtime or not.
|
CodeWriter | protected CodeWriter(ClassWriter cw, boolean computeMaxs)(Code) | | Constructs a CodeWriter.
Parameters: cw - the class writer in which the method must be added. Parameters: computeMaxs - true if the maximum stack size and number oflocal variables must be automatically computed. |
getCode | protected byte[] getCode()(Code) | | Returns the current bytecode of this method. This bytecode only contains
the instructions: it does not include the Exceptions, LocalVariableTable,
LineNumberTable, Synthetic and Deprecated attributes, if present.
the current bytecode of this method. The bytecode is containedbetween the index 0 (inclusive) and the index CodeWriter.getCodeSizegetCodeSize (exclusive). |
getCodeSize | protected int getCodeSize()(Code) | | Returns the current size of the bytecode of this method. This size just
includes the size of the bytecode instructions: it does not include the
size of the Exceptions, LocalVariableTable, LineNumberTable, Synthetic
and Deprecated attributes, if present.
the current size of the bytecode of this method. |
getNewOffset | static int getNewOffset(int[] indexes, int[] sizes, int begin, int end)(Code) | | Computes the future value of a bytecode offset.
Note: it is possible to have several entries for the same instruction
in the indexes and sizes: two entries (index=a,size=b)
and (index=a,size=b') are equivalent to a single entry (index=a,size=b+b').
Parameters: indexes - current positions of the instructions to be resized. Eachinstruction must be designated by the index of its last byte,plus one (or, in other words, by the index of the first byte ofthe next instruction). Parameters: sizes - the number of bytes to be added to the aboveinstructions. More precisely, for each i < len,sizes[i] bytes will be added at the end of the instructiondesignated by indexes[i] or, if sizes[i] isnegative, the last |sizes[i]| bytes of the instructionwill be removed (the instruction size must not become negativeor null). Parameters: begin - index of the first byte of the source instruction. Parameters: end - index of the first byte of the target instruction. the future value of the given bytecode offset. |
getSize | final int getSize()(Code) | | Returns the size of the bytecode of this method.
the size of the bytecode of this method. |
init | protected void init(int access, String name, String desc, String[] exceptions)(Code) | | Initializes this CodeWriter to define the bytecode of the specified method.
Parameters: access - the method's access flags (see Constants). Parameters: name - the method's name. Parameters: desc - the method's descriptor (see Type Type). Parameters: exceptions - the internal names of the method's exceptions. May benull. |
put | final void put(ByteVector out)(Code) | | Puts the bytecode of this method in the given byte vector.
Parameters: out - the byte vector into which the bytecode of this method must becopied. |
readInt | static int readInt(byte[] b, int index)(Code) | | Reads a signed int value in the given byte array.
Parameters: b - a byte array. Parameters: index - the start index of the value to be read. the read value. |
readShort | static short readShort(byte[] b, int index)(Code) | | Reads a signed short value in the given byte array.
Parameters: b - a byte array. Parameters: index - the start index of the value to be read. the read value. |
readUnsignedShort | static int readUnsignedShort(byte[] b, int index)(Code) | | Reads an unsigned short value in the given byte array.
Parameters: b - a byte array. Parameters: index - the start index of the value to be read. the read value. |
resizeInstructions | protected int[] resizeInstructions(int[] indexes, int[] sizes, int len)(Code) | | Resizes the designated instructions, while keeping jump offsets and
instruction addresses consistent. This may require to resize other existing
instructions, or even to introduce new instructions: for example,
increasing the size of an instruction by 2 at the middle of a method can
increases the offset of an IFEQ instruction from 32766 to 32768, in which
case IFEQ 32766 must be replaced with IFNEQ 8 GOTO_W 32765. This, in turn,
may require to increase the size of another jump instruction, and so on...
All these operations are handled automatically by this method.
This method must be called after all the method that is being built has
been visited. In particular, the
Label Label objects used to
construct the method are no longer valid after this method has been called.
Parameters: indexes - current positions of the instructions to be resized. Eachinstruction must be designated by the index of its last byte,plus one (or, in other words, by the index of the first byte ofthe next instruction). Parameters: sizes - the number of bytes to be added to the aboveinstructions. More precisely, for each i < len,sizes[i] bytes will be added at the end of the instructiondesignated by indexes[i] or, if sizes[i] isnegative, the last |sizes[i]| bytes of the instructionwill be removed (the instruction size must not become negativeor null). The gaps introduced by this method must be filled in"manually" in the array returned by the CodeWriter.getCode getCodemethod. Parameters: len - the number of instruction to be resized. Must be smaller than orequal to indexes.length and sizes.length. the indexes array, which now contains the new positions ofthe resized instructions (designated as above). |
visitIincInsn | public void visitIincInsn(int var, int increment)(Code) | | |
visitInsn | public void visitInsn(int opcode)(Code) | | |
visitIntInsn | public void visitIntInsn(int opcode, int operand)(Code) | | |
visitJumpInsn | public void visitJumpInsn(int opcode, Label label)(Code) | | |
visitLineNumber | public void visitLineNumber(int line, Label start)(Code) | | |
visitLookupSwitchInsn | public void visitLookupSwitchInsn(Label dflt, int keys, Label labels)(Code) | | |
visitMaxs | public void visitMaxs(int maxStack, int maxLocals)(Code) | | |
visitMultiANewArrayInsn | public void visitMultiANewArrayInsn(String desc, int dims)(Code) | | |
visitTableSwitchInsn | public void visitTableSwitchInsn(int min, int max, Label dflt, Label labels)(Code) | | |
visitTypeInsn | public void visitTypeInsn(int opcode, String desc)(Code) | | |
visitVarInsn | public void visitVarInsn(int opcode, int var)(Code) | | |
writeShort | static void writeShort(byte[] b, int index, int s)(Code) | | Writes a short value in the given byte array.
Parameters: b - a byte array. Parameters: index - where the first byte of the short value must be written. Parameters: s - the value to be written in the given byte array. |
|
|