com.ibm.wala.shrikeBT.shrikeCT
Class ClassInstrumenter

java.lang.Object
  extended by com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter

public final class ClassInstrumenter
extends java.lang.Object

This class provides a convenient way to instrument every method in a class. It assumes you are using ShrikeCT to read and write classes. It's stateful; initially every method is set to the original code read from the class, but you can then go in and modify the methods.


Nested Class Summary
static interface ClassInstrumenter.MethodExaminer
          Implement this interface to instrument every method of a class using visitMethods() below.
 
Constructor Summary
ClassInstrumenter(byte[] bytes)
          Create a class instrumenter from raw bytes.
ClassInstrumenter(ClassReader cr)
          Create a class instrumenter from a preinitialized class reader.
 
Method Summary
 MethodData createEmptyMethodData(java.lang.String name, java.lang.String sig, int access)
           
 void deleteMethod(int i)
          Indicate that the method should be deleted from the class.
 ClassWriter emitClass()
          Create a class which is a copy of the original class but with the new method code.
 void enableFakeLineNumbers(int offset)
          Calling this means that methods without line numbers get fake line numbers added: each bytecode instruction is treated as at line 'offset' + the offset of the instruction.
 CodeReader getMethodCode(int i)
          Get the original code resource for the method.
 ClassReader getReader()
           
 boolean isChanged()
          Check whether any methods in the class have actually been changed.
 void newMethod(MethodData md, ClassWriter classWriter, ClassWriter.Element rawLines)
           
 void newMethod(java.lang.String name, java.lang.String sig, java.util.ArrayList<Instruction> instructions, int access, ClassWriter classWriter, ClassWriter.Element rawLines)
          Xiangyu
 void replaceMethod(int i, MethodData md)
          Replace the code for method i with new code.
 void resetMethod(int i)
          Reset method i back to the code from the original class, and "undelete" it if it was marked for deletion.
 MethodData visitMethod(int i)
          Get the current state of method i.
 void visitMethods(ClassInstrumenter.MethodExaminer me)
          Do something to every method in the class.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ClassInstrumenter

public ClassInstrumenter(byte[] bytes)
                  throws InvalidClassFileException
Create a class instrumenter from raw bytes.

Throws:
InvalidClassFileException

ClassInstrumenter

public ClassInstrumenter(ClassReader cr)
                  throws InvalidClassFileException
Create a class instrumenter from a preinitialized class reader.

Throws:
java.lang.IllegalArgumentException - if cr is null
InvalidClassFileException
Method Detail

enableFakeLineNumbers

public void enableFakeLineNumbers(int offset)
Calling this means that methods without line numbers get fake line numbers added: each bytecode instruction is treated as at line 'offset' + the offset of the instruction.


getReader

public ClassReader getReader()
Returns:
the reader for the class

deleteMethod

public void deleteMethod(int i)
Indicate that the method should be deleted from the class.

Parameters:
i - the index of the method to delete

createEmptyMethodData

public MethodData createEmptyMethodData(java.lang.String name,
                                        java.lang.String sig,
                                        int access)

newMethod

public void newMethod(java.lang.String name,
                      java.lang.String sig,
                      java.util.ArrayList<Instruction> instructions,
                      int access,
                      ClassWriter classWriter,
                      ClassWriter.Element rawLines)
Xiangyu

Throws:
java.lang.IllegalArgumentException - if classWriter is null
java.lang.IllegalArgumentException - if instructions is null

newMethod

public void newMethod(MethodData md,
                      ClassWriter classWriter,
                      ClassWriter.Element rawLines)

visitMethods

public void visitMethods(ClassInstrumenter.MethodExaminer me)
                  throws InvalidClassFileException
Do something to every method in the class. This will visit all methods, including those already marked for deletion.

Parameters:
me - the visitor to apply to each method
Throws:
InvalidClassFileException

visitMethod

public MethodData visitMethod(int i)
                       throws InvalidClassFileException
Get the current state of method i. This can be edited using a MethodEditor.

Parameters:
i - the index of the method to inspect
Throws:
InvalidClassFileException

getMethodCode

public CodeReader getMethodCode(int i)
                         throws InvalidClassFileException
Get the original code resource for the method.

Parameters:
i - the index of the method to inspect
Throws:
InvalidClassFileException

resetMethod

public void resetMethod(int i)
Reset method i back to the code from the original class, and "undelete" it if it was marked for deletion.

Parameters:
i - the index of the method to reset

replaceMethod

public void replaceMethod(int i,
                          MethodData md)
Replace the code for method i with new code. This also "undeletes" the method if it was marked for deletion.

Parameters:
i - the index of the method to replace
Throws:
java.lang.IllegalArgumentException - if md is null

isChanged

public boolean isChanged()
Check whether any methods in the class have actually been changed.


emitClass

public ClassWriter emitClass()
                      throws InvalidClassFileException
Create a class which is a copy of the original class but with the new method code. We return the ClassWriter used, so more methods and fields (and other changes) can still be added. We fix up any debug information to be consistent with the changes to the code.

Throws:
InvalidClassFileException