com.ibm.wala.classLoader
Class ShrikeBTMethod

java.lang.Object
  extended by com.ibm.wala.classLoader.ShrikeBTMethod
All Implemented Interfaces:
IMember, IMethod, ContextItem, IClassHierarchyDweller, BytecodeConstants
Direct Known Subclasses:
ShrikeCTMethod

public abstract class ShrikeBTMethod
extends java.lang.Object
implements IMethod, BytecodeConstants

A wrapper around a Shrike object that represents a method


Nested Class Summary
protected static class ShrikeBTMethod.BytecodeInfo
           
 
Field Summary
protected  IClass declaringClass
          A wrapper around the declaring class.
 
Fields inherited from interface com.ibm.wala.shrikeBT.BytecodeConstants
JBC_aaload, JBC_aastore, JBC_aconst_null, JBC_aload, JBC_aload_0, JBC_aload_1, JBC_aload_2, JBC_aload_3, JBC_anewarray, JBC_areturn, JBC_arraylength, JBC_astore, JBC_astore_0, JBC_astore_1, JBC_astore_2, JBC_astore_3, JBC_athrow, JBC_baload, JBC_bastore, JBC_bipush, JBC_caload, JBC_castore, JBC_checkcast, JBC_d2f, JBC_d2i, JBC_d2l, JBC_dadd, JBC_daload, JBC_dastore, JBC_dcmpg, JBC_dcmpl, JBC_dconst_0, JBC_dconst_1, JBC_ddiv, JBC_dload, JBC_dload_0, JBC_dload_1, JBC_dload_2, JBC_dload_3, JBC_dmul, JBC_dneg, JBC_drem, JBC_dreturn, JBC_dstore, JBC_dstore_0, JBC_dstore_1, JBC_dstore_2, JBC_dstore_3, JBC_dsub, JBC_dup, JBC_dup_x1, JBC_dup_x2, JBC_dup2, JBC_dup2_x1, JBC_dup2_x2, JBC_f2d, JBC_f2i, JBC_f2l, JBC_fadd, JBC_faload, JBC_fastore, JBC_fcmpg, JBC_fcmpl, JBC_fconst_0, JBC_fconst_1, JBC_fconst_2, JBC_fdiv, JBC_fload, JBC_fload_0, JBC_fload_1, JBC_fload_2, JBC_fload_3, JBC_fmul, JBC_fneg, JBC_frem, JBC_freturn, JBC_fstore, JBC_fstore_0, JBC_fstore_1, JBC_fstore_2, JBC_fstore_3, JBC_fsub, JBC_getfield, JBC_getstatic, JBC_goto, JBC_goto_w, JBC_i2d, JBC_i2f, JBC_i2l, JBC_iadd, JBC_iaload, JBC_iand, JBC_iastore, JBC_iconst_0, JBC_iconst_1, JBC_iconst_2, JBC_iconst_3, JBC_iconst_4, JBC_iconst_5, JBC_iconst_m1, JBC_idiv, JBC_if_acmpeq, JBC_if_acmpne, JBC_if_icmpeq, JBC_if_icmpge, JBC_if_icmpgt, JBC_if_icmple, JBC_if_icmplt, JBC_if_icmpne, JBC_ifeq, JBC_ifge, JBC_ifgt, JBC_ifle, JBC_iflt, JBC_ifne, JBC_ifnonnull, JBC_ifnull, JBC_iinc, JBC_iload, JBC_iload_0, JBC_iload_1, JBC_iload_2, JBC_iload_3, JBC_impdep1, JBC_impdep2, JBC_imul, JBC_ineg, JBC_instanceof, JBC_int2byte, JBC_int2char, JBC_int2short, JBC_invokeinterface, JBC_invokespecial, JBC_invokestatic, JBC_invokevirtual, JBC_ior, JBC_irem, JBC_ireturn, JBC_ishl, JBC_ishr, JBC_istore, JBC_istore_0, JBC_istore_1, JBC_istore_2, JBC_istore_3, JBC_isub, JBC_iushr, JBC_ixor, JBC_jsr, JBC_jsr_w, JBC_l2d, JBC_l2f, JBC_l2i, JBC_ladd, JBC_laload, JBC_land, JBC_lastore, JBC_lcmp, JBC_lconst_0, JBC_lconst_1, JBC_ldc, JBC_ldc_w, JBC_ldc2_w, JBC_ldiv, JBC_length, JBC_lload, JBC_lload_0, JBC_lload_1, JBC_lload_2, JBC_lload_3, JBC_lmul, JBC_lneg, JBC_lookupswitch, JBC_lor, JBC_lrem, JBC_lreturn, JBC_lshl, JBC_lshr, JBC_lstore, JBC_lstore_0, JBC_lstore_1, JBC_lstore_2, JBC_lstore_3, JBC_lsub, JBC_lushr, JBC_lxor, JBC_monitorenter, JBC_monitorexit, JBC_multianewarray, JBC_name, JBC_new, JBC_newarray, JBC_nop, JBC_pop, JBC_pop2, JBC_putfield, JBC_putstatic, JBC_ret, JBC_return, JBC_saload, JBC_sastore, JBC_sipush, JBC_swap, JBC_tableswitch, JBC_wide, JBC_xxxunusedxxx
 
Constructor Summary
ShrikeBTMethod(IClass klass)
           
 
Method Summary
 void clearCaches()
          Clear all optional cached data associated with this class.
 boolean equals(java.lang.Object obj)
           
 java.util.Iterator getArraysRead()
           
 java.util.Iterator<TypeReference> getArraysWritten()
           
protected  ShrikeBTMethod.BytecodeInfo getBCInfo()
           
 int getBytecodeIndex(int instructionIndex)
          Return the program counter (bytecode index) for a particular Shrike instruction index.
protected abstract  byte[] getBytecodes()
           
 BytecodeStream getBytecodeStream()
          Method getBytecodeStream.
 java.util.Collection<CallSiteReference> getCallSites()
           
 java.util.Iterator getCastTypes()
           
 java.util.Set<TypeReference> getCaughtExceptionTypes()
           
 TypeReference[] getDeclaredExceptions()
          Clients should not modify the returned array.
protected abstract  java.lang.String[] getDeclaredExceptionTypeNames()
           
 IClass getDeclaringClass()
          Return the object that represents the declaring class for this member.
 Descriptor getDescriptor()
          something like: (IILjava.lang.String;SLjava.sql.Date;)Ljava.lang.Integer;
 java.util.Iterator<FieldReference> getFieldsRead()
           
 java.util.Iterator<FieldReference> getFieldsWritten()
           
 ExceptionHandler[][] getHandlers()
           
 java.util.Collection<TypeReference> getImplicitExceptionTypes()
           
 IInstruction[] getInstructions()
           
 int getLineNumber(int bcIndex)
           
abstract  java.lang.String getLocalVariableName(int bcIndex, int localNumber)
           
abstract  int getMaxLocals()
           
abstract  int getMaxStackHeight()
           
protected abstract  java.lang.String getMethodName()
           
protected abstract  java.lang.String getMethodSignature()
           
protected abstract  int getModifiers()
           
 Atom getName()
           
 int getNumberOfParameters()
          Method getNumberOfParameters.
 int getNumShrikeInstructions()
          Return the number of Shrike instructions for this method.
 TypeReference getParameterType(int i)
          By convention, for a non-static method, getParameterType(0) is the this pointer
 MethodReference getReference()
           
 Selector getSelector()
          something like: foo(Ljava/langString;)Ljava/lang/Class;
 java.lang.String getSignature()
          something like: com.foo.bar.createLargeOrder(IILjava.lang.String;SLjava.sql.Date;)Ljava.lang.Integer;
abstract  boolean hasExceptionHandler()
           
 int hashCode()
           
abstract  boolean hasLocalVariableTable()
           
 boolean hasMonitorOp()
           
 boolean isAbstract()
          Is this method abstract?
 boolean isBridge()
          Is this method a bridge method? See JLS 3rd Edition 15.12.4.5
 boolean isClinit()
          Is this method a class initializer?
 boolean isFinal()
          Is this method final?
 boolean isInit()
          Is this method an object initializer?
 boolean isNative()
          Is this method native?
 boolean isPrivate()
          Is this method private?
 boolean isProtected()
          Is this method protected?
 boolean isPublic()
          Is this method public?
 boolean isStatic()
          Is this member static?
 boolean isSynchronized()
          Is this method synchronized?
 boolean isSynthetic()
          Did someone synthesize this method? (As opposed to reading it from a class file)
protected abstract  Decoder makeDecoder()
          Find the decoder object for this method, or create one if necessary.
protected abstract  void processDebugInfo(ShrikeBTMethod.BytecodeInfo bcInfo)
          Walk through the bytecodes and collect trivial information.
 java.lang.String toString()
           
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface com.ibm.wala.classLoader.IMethod
getReturnType
 
Methods inherited from interface com.ibm.wala.ipa.cha.IClassHierarchyDweller
getClassHierarchy
 

Field Detail

declaringClass

protected final IClass declaringClass
A wrapper around the declaring class.

Constructor Detail

ShrikeBTMethod

public ShrikeBTMethod(IClass klass)
Method Detail

getBCInfo

protected ShrikeBTMethod.BytecodeInfo getBCInfo()
                                         throws InvalidClassFileException
Throws:
InvalidClassFileException

getBytecodeIndex

public int getBytecodeIndex(int instructionIndex)
                     throws InvalidClassFileException
Return the program counter (bytecode index) for a particular Shrike instruction index.

Throws:
InvalidClassFileException

getNumShrikeInstructions

public int getNumShrikeInstructions()
                             throws InvalidClassFileException
Return the number of Shrike instructions for this method.

Throws:
InvalidClassFileException

getCallSites

public java.util.Collection<CallSiteReference> getCallSites()
                                                     throws InvalidClassFileException
Throws:
InvalidClassFileException

getImplicitExceptionTypes

public java.util.Collection<TypeReference> getImplicitExceptionTypes()
                                                              throws InvalidClassFileException
Returns:
Set , the exceptions that statements in this method may throw,
Throws:
InvalidClassFileException

hasMonitorOp

public boolean hasMonitorOp()
                     throws InvalidClassFileException
Returns:
true iff this method has a monitorenter or monitorexit
Throws:
InvalidClassFileException

getFieldsWritten

public java.util.Iterator<FieldReference> getFieldsWritten()
                                                    throws InvalidClassFileException
Returns:
Set of FieldReference
Throws:
InvalidClassFileException

getFieldsRead

public java.util.Iterator<FieldReference> getFieldsRead()
                                                 throws InvalidClassFileException
Returns:
Iterator of FieldReference
Throws:
InvalidClassFileException

getArraysRead

public java.util.Iterator getArraysRead()
                                 throws InvalidClassFileException
Returns:
Iterator of TypeReference
Throws:
InvalidClassFileException

getArraysWritten

public java.util.Iterator<TypeReference> getArraysWritten()
                                                   throws InvalidClassFileException
Returns:
Iterator of TypeReference
Throws:
InvalidClassFileException

getCastTypes

public java.util.Iterator getCastTypes()
                                throws InvalidClassFileException
Returns:
Iterator of TypeReference
Throws:
InvalidClassFileException

getBytecodes

protected abstract byte[] getBytecodes()

getBytecodeStream

public BytecodeStream getBytecodeStream()
Method getBytecodeStream.

Returns:
the bytecode stream for this method, or null if no bytecodes.

getMethodName

protected abstract java.lang.String getMethodName()
                                           throws InvalidClassFileException
Throws:
InvalidClassFileException

getMethodSignature

protected abstract java.lang.String getMethodSignature()
                                                throws InvalidClassFileException
Throws:
InvalidClassFileException

getReference

public MethodReference getReference()
Specified by:
getReference in interface IMethod
Returns:
canonical MethodReference corresponding to this method

isClinit

public boolean isClinit()
Description copied from interface: IMethod
Is this method a class initializer?

Specified by:
isClinit in interface IMethod

isInit

public boolean isInit()
Description copied from interface: IMethod
Is this method an object initializer?

Specified by:
isInit in interface IMethod

getModifiers

protected abstract int getModifiers()

isNative

public boolean isNative()
Description copied from interface: IMethod
Is this method native?

Specified by:
isNative in interface IMethod

isAbstract

public boolean isAbstract()
Description copied from interface: IMethod
Is this method abstract?

Specified by:
isAbstract in interface IMethod

isPrivate

public boolean isPrivate()
Description copied from interface: IMethod
Is this method private?

Specified by:
isPrivate in interface IMethod

isProtected

public boolean isProtected()
Description copied from interface: IMethod
Is this method protected?

Specified by:
isProtected in interface IMethod

isPublic

public boolean isPublic()
Description copied from interface: IMethod
Is this method public?

Specified by:
isPublic in interface IMethod

isFinal

public boolean isFinal()
Description copied from interface: IMethod
Is this method final?

Specified by:
isFinal in interface IMethod

isBridge

public boolean isBridge()
Description copied from interface: IMethod
Is this method a bridge method? See JLS 3rd Edition 15.12.4.5

Specified by:
isBridge in interface IMethod

isSynchronized

public boolean isSynchronized()
Description copied from interface: IMethod
Is this method synchronized?

Specified by:
isSynchronized in interface IMethod

isStatic

public boolean isStatic()
Description copied from interface: IMember
Is this member static?

Specified by:
isStatic in interface IMember

isSynthetic

public boolean isSynthetic()
Description copied from interface: IMethod
Did someone synthesize this method? (As opposed to reading it from a class file)

Specified by:
isSynthetic in interface IMethod

getDeclaringClass

public IClass getDeclaringClass()
Description copied from interface: IMember
Return the object that represents the declaring class for this member.

Specified by:
getDeclaringClass in interface IMember
Returns:
the object that represents the declaring class for this member.

makeDecoder

protected abstract Decoder makeDecoder()
Find the decoder object for this method, or create one if necessary.

Returns:
null if the method has no code.

processDebugInfo

protected abstract void processDebugInfo(ShrikeBTMethod.BytecodeInfo bcInfo)
                                  throws InvalidClassFileException
Walk through the bytecodes and collect trivial information.

Throws:
InvalidClassFileException

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object
See Also:
Object.toString()

equals

public boolean equals(java.lang.Object obj)
Overrides:
equals in class java.lang.Object
See Also:
Object.equals(Object)

hashCode

public int hashCode()
Overrides:
hashCode in class java.lang.Object
See Also:
Object.hashCode()

getMaxLocals

public abstract int getMaxLocals()
Specified by:
getMaxLocals in interface IMethod
Returns:
maximum number of JVM locals used by this method

getMaxStackHeight

public abstract int getMaxStackHeight()
Specified by:
getMaxStackHeight in interface IMethod
Returns:
maximum height of JVM stack used by this method

getName

public Atom getName()
Specified by:
getName in interface IMember
Returns:
the name of this member

getDescriptor

public Descriptor getDescriptor()
Description copied from interface: IMethod
something like: (IILjava.lang.String;SLjava.sql.Date;)Ljava.lang.Integer;

Specified by:
getDescriptor in interface IMethod

getInstructions

public IInstruction[] getInstructions()
                               throws InvalidClassFileException
Throws:
InvalidClassFileException

getHandlers

public ExceptionHandler[][] getHandlers()
                                 throws InvalidClassFileException
Throws:
InvalidClassFileException

getParameterType

public TypeReference getParameterType(int i)
By convention, for a non-static method, getParameterType(0) is the this pointer

Specified by:
getParameterType in interface IMethod

getNumberOfParameters

public int getNumberOfParameters()
Method getNumberOfParameters. This result includes the "this" pointer if applicable

Specified by:
getNumberOfParameters in interface IMethod
Returns:
int

hasExceptionHandler

public abstract boolean hasExceptionHandler()
Specified by:
hasExceptionHandler in interface IMethod
Returns:
true iff this method has at least one exception handler

getDeclaredExceptions

public TypeReference[] getDeclaredExceptions()
                                      throws InvalidClassFileException
Clients should not modify the returned array. TODO: clone to avoid the problem?

Specified by:
getDeclaredExceptions in interface IMethod
Returns:
an array of the exception types declared by the throws clause for this method, or null if there are none
Throws:
InvalidClassFileException
See Also:
IMethod.getDeclaredExceptions()

getDeclaredExceptionTypeNames

protected abstract java.lang.String[] getDeclaredExceptionTypeNames()
                                                             throws InvalidClassFileException
Throws:
InvalidClassFileException

getLineNumber

public int getLineNumber(int bcIndex)
Specified by:
getLineNumber in interface IMethod
Returns:
the source line number corresponding to a particular bytecode index, or -1 if the information is not available.

getCaughtExceptionTypes

public java.util.Set<TypeReference> getCaughtExceptionTypes()
                                                     throws InvalidClassFileException
Returns:
Set
Throws:
InvalidClassFileException

getSignature

public java.lang.String getSignature()
Description copied from interface: IMethod
something like: com.foo.bar.createLargeOrder(IILjava.lang.String;SLjava.sql.Date;)Ljava.lang.Integer;

Specified by:
getSignature in interface IMethod

getSelector

public Selector getSelector()
Description copied from interface: IMethod
something like: foo(Ljava/langString;)Ljava/lang/Class;

Specified by:
getSelector in interface IMethod

getLocalVariableName

public abstract java.lang.String getLocalVariableName(int bcIndex,
                                                      int localNumber)
Specified by:
getLocalVariableName in interface IMethod
Returns:
the (source code) name of the local variable of a given number at the specified program counter, or null if the information is not available.

hasLocalVariableTable

public abstract boolean hasLocalVariableTable()
Specified by:
hasLocalVariableTable in interface IMethod
Returns:
true iff the local variable table information for this method is available

clearCaches

public void clearCaches()
Clear all optional cached data associated with this class.