Class BBlock

java.lang.Object
org.jboss.byteman.agent.adapter.cfg.BBlock

public class BBlock extends Object
A Basic Block represents a segment of bytecode in a control flow graph. Basic blocks divide up the code at control flow branch points and hence there is no normal control flow internal to a block. Normal control flow will only transfer control from the end of one basic block to the start of another basic block or to the caller (via a return or throw). If the block overlaps a try/catch region then exception control flow may transfer control from any instruction lying within the try/catch region to the the start of another basic block which handles the instruction. So, exception control flow may exit a block at a location preceding the block end but may only enter at block start.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    details of all try catch blocks which are active inside this block.
    private int
    an index for the block allocated by the CFG starting from 0 in block order
    private CFG
     
    a list of all try catch blocks whose handlers start in this block
    the sequence of instructions contained in this basic block
    a stack (reverse order list) containing the locations of all monitor enter instructions contained in this block excluding those which have been closed by a corresponding exit in this block
    a list of the location of all monitor exit instructions contained in this block
    private FanOut
     
    a list of all try catch blocks which end in this block
    details of all try catch blocks which start in this block
  • Constructor Summary

    Constructors
    Constructor
    Description
    BBlock(CFG cfg, org.objectweb.asm.Label start, int blockIdx)
    construct a new basic block
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    record details of a try catch block handler which starts in this block
    void
    record details of a try catch block which ends in this block
    void
    record details of a try catch block which starts in this block
    int
    append(int instruction)
    add an instruction to the sequence in the block
    int
    append(int instruction, int operand)
    add an instruction with one int operand to thhe sequence in the block
    int
    append(int instruction, int[] operands)
    add an instruction with an arbitrary number of int operands to thhe sequence in the block
    int
    append(int instruction, int operand1, int operand2)
    add an instruction with two int operands to the sequence in the block
    int
    append(int instruction, int operand1, int operand2, int operand3)
    add an instruction with three int operands to thhe sequence in the block
    int
    append(int instruction, int operand1, int operand2, int operand3, int operand4)
    add an instruction with four int operands to the sequence in the block
    void
    append(org.objectweb.asm.Label label)
    install an outgoing normal control flow link
    org.objectweb.asm.Label
    return the label of the first normal control flow link
    retrieve details of all try catch blocks which are capable of generating an exception in this block
    int
    retrieve the index of this block in the block sequence.
    obtain the control flow graph to which this block belongs
    retrieve details of all try catch block handlers whcih start in this block
    int
    getInstruction(int index)
    return the instruction at a given index.
    int
    getInstructionArg(int index, int argIndex)
    retrieve the integer operand or encoded name associated with a particular instruction
    int
    return the number of instructions in the blocks instructuion sequence equivalent to the index of the next instruction added to the block.
    org.objectweb.asm.Label
    get the primary label which idenitfies this block.
    int
    retrieve a count of all monitor enter instruction locations occurring in this block
    retrieve a list of all monitor enter instruction locations occurring in this block
    int
    retrieve a count of all monitor exit instruction locations occuring in this block
    retrieve a list of all monitor exit instruction locations occurring in this block
    retrieve details of all try catch blocks which end in this block
    org.objectweb.asm.Label
    return the label of the next block in line in the block sequence in bytecode order.
    private int
    nextBCPos(int opcode, int insnIdx, int currentPos)
     
    int
    return a count of the normal control flow links from this block.
    org.objectweb.asm.Label
    nthOut(int n)
    return the label of the nth normal control flow link
    void
    printLabelOffset(StringBuffer buf, org.objectweb.asm.Label l, boolean appendBlockPos, Object altText)
     
    (package private) void
    write a string representation of this block to the buffer
    org.objectweb.asm.Label
    return the label of the second normal control flow link
    void
    set the list of try starts which are active somewhere in this block.
    return a string representation of this block

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • Field Details

    • cfg

      private CFG cfg
    • instructions

      private InstructionSequence instructions
      the sequence of instructions contained in this basic block
    • outGoing

      private FanOut outGoing
    • blockIdx

      private int blockIdx
      an index for the block allocated by the CFG starting from 0 in block order
    • activeTryStarts

      private List<TryCatchDetails> activeTryStarts
      details of all try catch blocks which are active inside this block. n.b. this must omit try catch blocks which are open when the block is created then subsequently closed at offset 0.
    • tryStarts

      private List<TryCatchDetails> tryStarts
      details of all try catch blocks which start in this block
    • tryEnds

      private List<TryCatchDetails> tryEnds
      a list of all try catch blocks which end in this block
    • handlerStarts

      private List<TryCatchDetails> handlerStarts
      a list of all try catch blocks whose handlers start in this block
    • monitorEnters

      private LinkedList<CodeLocation> monitorEnters
      a stack (reverse order list) containing the locations of all monitor enter instructions contained in this block excluding those which have been closed by a corresponding exit in this block
    • monitorExits

      private LinkedList<CodeLocation> monitorExits
      a list of the location of all monitor exit instructions contained in this block
  • Constructor Details

    • BBlock

      public BBlock(CFG cfg, org.objectweb.asm.Label start, int blockIdx)
      construct a new basic block
      Parameters:
      cfg - the control flow graph it belongs to
      start - the label for the start of the block
      blockIdx - the index of the block which respects the order of the bytecode segments contained in each block.
  • Method Details

    • getCFG

      public CFG getCFG()
      obtain the control flow graph to which this block belongs
      Returns:
      the control flow graph
    • getLabel

      public org.objectweb.asm.Label getLabel()
      get the primary label which idenitfies this block. It will be located in the block at offset 0.
      Returns:
      the primary label
    • getBlockIdx

      public int getBlockIdx()
      retrieve the index of this block in the block sequence.
      Returns:
      the block index
    • append

      public int append(int instruction)
      add an instruction to the sequence in the block
      Parameters:
      instruction - an Opcode
      Returns:
      the index of the newly added instruction
    • append

      public int append(int instruction, int operand)
      add an instruction with one int operand to thhe sequence in the block
      Parameters:
      instruction - an Opcode
      operand - an int operand or the code for a String operand lcoated in the cfg name table
      Returns:
      the index of the newly added instruction
    • append

      public int append(int instruction, int operand1, int operand2)
      add an instruction with two int operands to the sequence in the block
      Parameters:
      instruction - an Opcode
      operand1 - an int operand or the code for a String operand lcoated in the cfg name table
      operand2 - an int operand or the code for a String operand lcoated in the cfg name table
      Returns:
      the index of the newly added instruction
    • append

      public int append(int instruction, int operand1, int operand2, int operand3)
      add an instruction with three int operands to thhe sequence in the block
      Parameters:
      instruction - an Opcode
      operand1 - an int operand or the code for a String operand lcoated in the cfg name table
      operand2 - an int operand or the code for a String operand lcoated in the cfg name table
      operand3 - an int operand or the code for a String operand lcoated in the cfg name table
      Returns:
      the index of the newly added instruction
    • append

      public int append(int instruction, int operand1, int operand2, int operand3, int operand4)
      add an instruction with four int operands to the sequence in the block
      Parameters:
      instruction - an Opcode
      operand1 - an int operand or the code for a String operand lcoated in the cfg name table
      operand2 - an int operand or the code for a String operand lcoated in the cfg name table
      operand3 - an int operand or the code for a String operand lcoated in the cfg name table
      operand4 - an int operand or the code for a String operand lcoated in the cfg name table
      Returns:
      the index of the newly added instruction
    • append

      public int append(int instruction, int[] operands)
      add an instruction with an arbitrary number of int operands to thhe sequence in the block
      Parameters:
      instruction - an Opcode
      operands - an array containing int operands or codes for String operands lcoated in the cfg name table
      Returns:
      the index of the newly added instruction
    • addTryStarts

      public void addTryStarts(List<TryCatchDetails> details)
      record details of a try catch block which starts in this block
      Parameters:
      details - list of try catch block details
    • addTryEnds

      public void addTryEnds(List<TryCatchDetails> details)
      record details of a try catch block which ends in this block
      Parameters:
      details - list of try catch block details
    • addHandlerStarts

      public void addHandlerStarts(List<TryCatchDetails> details)
      record details of a try catch block handler which starts in this block
      Parameters:
      details - list of try catch block details
    • setActiveTryStarts

      public void setActiveTryStarts(List<TryCatchDetails> active)
      set the list of try starts which are active somewhere in this block.
      Parameters:
      active - list of active try catch block details
    • getTryEnds

      public Iterator<TryCatchDetails> getTryEnds()
      retrieve details of all try catch blocks which end in this block
      Returns:
      list of try catch block details
    • getHandlerStarts

      public Iterator<TryCatchDetails> getHandlerStarts()
      retrieve details of all try catch block handlers whcih start in this block
      Returns:
      list of try catch block details
    • getActiveTryStarts

      public List<TryCatchDetails> getActiveTryStarts()
      retrieve details of all try catch blocks which are capable of generating an exception in this block
      Returns:
      list of active try catch block details
    • getMonitorEnters

      public Iterator<CodeLocation> getMonitorEnters()
      retrieve a list of all monitor enter instruction locations occurring in this block
      Returns:
      list of monitor enter locations
    • getMonitorExits

      public Iterator<CodeLocation> getMonitorExits()
      retrieve a list of all monitor exit instruction locations occurring in this block
      Returns:
      list of monitor exit locations
    • getMonitorEnterCount

      public int getMonitorEnterCount()
      retrieve a count of all monitor enter instruction locations occurring in this block
      Returns:
      count of monitor enter locations
    • getMonitorExitCount

      public int getMonitorExitCount()
      retrieve a count of all monitor exit instruction locations occuring in this block
      Returns:
      count of monitor exit locations
    • getInstructionCount

      public int getInstructionCount()
      return the number of instructions in the blocks instructuion sequence equivalent to the index of the next instruction added to the block.
      Returns:
      the next instruction count
    • getInstruction

      public int getInstruction(int index)
      return the instruction at a given index.
      Parameters:
      index - the index for the instruction
      Returns:
      the instruction at index
    • getInstructionArg

      public int getInstructionArg(int index, int argIndex)
      retrieve the integer operand or encoded name associated with a particular instruction
      Parameters:
      index - the index of the instruction in the block
      argIndex - the index of the argument in the sequence of arguments presented when the instruction was inserted into the block.
      Returns:
      the arg
    • append

      public void append(org.objectweb.asm.Label label)
      install an outgoing normal control flow link
      Parameters:
      label - the control flow destination
    • next

      public org.objectweb.asm.Label next()
      return the label of the next block in line in the block sequence in bytecode order.
      Returns:
      the label of the next block
    • firstOut

      public org.objectweb.asm.Label firstOut()
      return the label of the first normal control flow link
      Returns:
      the label
    • secondOut

      public org.objectweb.asm.Label secondOut()
      return the label of the second normal control flow link
      Returns:
      the label
    • nthOut

      public org.objectweb.asm.Label nthOut(int n)
      return the label of the nth normal control flow link
      Parameters:
      n - the index of the link
      Returns:
      the label
    • nOuts

      public int nOuts()
      return a count of the normal control flow links from this block.
      Returns:
      the number of outgoingnormalcontrol flow links. n.b. iterations over the links should count from 1 to nOuts() inclusive. this is the size of a 1-based collection
    • toString

      public String toString()
      return a string representation of this block
      Overrides:
      toString in class Object
      Returns:
      a string representation
    • printLabelOffset

      public void printLabelOffset(StringBuffer buf, org.objectweb.asm.Label l, boolean appendBlockPos, Object altText)
    • printTo

      void printTo(StringBuffer buf)
      write a string representation of this block to the buffer
      Parameters:
      buf - the buffer to be written to
    • nextBCPos

      private int nextBCPos(int opcode, int insnIdx, int currentPos)