Jode 1.90-CVS
Build Aug 6, 2004

net.sf.jode.bytecode
Class BasicBlocks

java.lang.Object
  extended bynet.sf.jode.bytecode.BinaryInfo
      extended bynet.sf.jode.bytecode.BasicBlocks
All Implemented Interfaces:
Opcodes

public class BasicBlocks
extends BinaryInfo
implements Opcodes

Represents the byte code of a method in form of basic blocks. A basic block is a bunch of instructions, that must always execute in sequential order. Every basic block is represented by an Block object.

All jump instructions must be at the end of the block, and the jump instructions doesn't have to remember where they jump to. Instead this information is stored inside the blocks. See Block for details.

Exception Handlers are represented by the Handler class. Their start/end range must span over some consecutive BasicBlocks and there handler must be another basic block.

When the code is written to a class file, the blocks are written in the given order. Goto and return instructions are inserted as necessary, you don't need to care about that.

Creating new BasicBlocks

If you want to create a new BasicBlocks object, first create the Block objects, then initialize them (you need to have all successor blocks created for this). Afterwards create a new BasicBlock and fill its sub blocks:

   MethodInfo myMethod = new MethodInfo("foo", "()V", PUBLIC);
   Block blocks = new Block[10];
   for (int i = 0; i < 10; i++) blocks[i] = new Block();
   blocks[0].setCode(new Instruction[] {...}, 
                     new Block[] {blocks[3], blocks[1]});
   ...
   Handler[] excHandlers = new Handler[1];
   excHandlers[0] = new Handler(blocks[2], blocks[5], blocks[6],
                                "java.lang.NullPointerException");
   BasicBlocks bb = new BasicBlocks(myMethod);
   bb.setCode(blocks, blocks[0], excHandlers);
   classInfo.setMethods(new MethodInfo[] { myMethod });
 

See Also:
Block, Instruction

Field Summary
 
Fields inherited from class net.sf.jode.bytecode.BinaryInfo
ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE
 
Fields inherited from interface net.sf.jode.bytecode.Opcodes
constants, newArrayTypes, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_breakpoint, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_impdep1, opc_impdep2, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc_w, opc_ldc2_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, opcodeString
 
Constructor Summary
BasicBlocks(MethodInfo mi)
           
 
Method Summary
 void dumpCode(java.io.PrintWriter output)
           
protected  int getAttributeCount()
          Returns the number of attributes of this class.
 Block[] getBlocks()
           
 Handler[] getExceptionHandlers()
           
 int getMaxLocals()
           
 int getMaxStack()
           
 MethodInfo getMethodInfo()
           
 int getParamCount()
           
 LocalVariableInfo getParamInfo(int i)
           
 Block getStartBlock()
           
protected  void readAttribute(java.lang.String name, int length, ConstantPool cp, java.io.DataInputStream input, int howMuch)
          Reads in an attributes of this class.
 void setBlocks(Block[] blocks, Block startBlock, Handler[] handlers)
           
 void setParamInfo(LocalVariableInfo info)
          Sets the name and type of a method parameter.
 java.lang.String toString()
           
 void updateMaxStackLocals()
          Updates the maxStack and maxLocals according to the current code.
protected  void writeAttributes(GrowableConstantPool gcp, java.io.DataOutputStream output)
          Writes the attributes to the output stream.
 
Methods inherited from class net.sf.jode.bytecode.BinaryInfo
addAttribute, drop, findAttribute, getAttributes, getAttributeSize, prepareAttributes, removeAllAttributes, removeAttribute
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

BasicBlocks

public BasicBlocks(MethodInfo mi)
Method Detail

getMaxStack

public int getMaxStack()

getMaxLocals

public int getMaxLocals()

getMethodInfo

public MethodInfo getMethodInfo()

getStartBlock

public Block getStartBlock()

getBlocks

public Block[] getBlocks()

getExceptionHandlers

public Handler[] getExceptionHandlers()
Returns:
the exception handlers, or null if the method has no exception handlers.

getParamInfo

public LocalVariableInfo getParamInfo(int i)

getParamCount

public int getParamCount()

updateMaxStackLocals

public void updateMaxStackLocals()
Updates the maxStack and maxLocals according to the current code. Call this every time you change the code.


setBlocks

public void setBlocks(Block[] blocks,
                      Block startBlock,
                      Handler[] handlers)

setParamInfo

public void setParamInfo(LocalVariableInfo info)
Sets the name and type of a method parameter. This overwrites any previously set parameter info for this slot.

Parameters:
info - a local variable info mapping a slot nr to a name and a type.

readAttribute

protected void readAttribute(java.lang.String name,
                             int length,
                             ConstantPool cp,
                             java.io.DataInputStream input,
                             int howMuch)
                      throws java.io.IOException
Description copied from class: BinaryInfo
Reads in an attributes of this class. Overwrite this method if you want to handle your own attributes. If you don't know how to handle an attribute call this method for the super class.

Overrides:
readAttribute in class BinaryInfo
Parameters:
name - the attribute name.
length - the length of the attribute.
cp - the constant pool of the class.
input - a data input stream where you can read the attribute from. It will protect you to read more over the attribute boundary.
howMuch - the constant that was given to the ClassInfo.load(int) function when loading this class.
Throws:
java.io.IOException

getAttributeCount

protected int getAttributeCount()
Description copied from class: BinaryInfo
Returns the number of attributes of this class. Overwrite this method if you want to add your own attributes by providing a writeAttributes method. You should call this method for the super class and add the number of your own attributes to the returned value.

Overrides:
getAttributeCount in class BinaryInfo
Returns:
the number of attributes of this class.

writeAttributes

protected void writeAttributes(GrowableConstantPool gcp,
                               java.io.DataOutputStream output)
                        throws java.io.IOException
Description copied from class: BinaryInfo

Writes the attributes to the output stream. Overwrite this method if you want to add your own attributes. All constants you need from the growable constant pool must have been previously registered by the BinaryInfo.prepareAttributes(net.sf.jode.bytecode.GrowableConstantPool) method. This method must not add new constants to the pool

First call the method of the super class. Afterwrites write each of your own attributes including the attribute header (name and length entry).

Overrides:
writeAttributes in class BinaryInfo
Parameters:
gcp - The growable constant pool, which is not growable anymore (see above).
output - the data output stream. You must write exactly as many bytes to it as you have told with the BinaryInfo.getAttributeSize() method.
Throws:
java.io.IOException

dumpCode

public void dumpCode(java.io.PrintWriter output)

toString

public java.lang.String toString()

Jode 1.90-CVS
Build Aug 6, 2004

Copyright © 1998-2004 by Jochen Hoenicke.