abc.weaving.aspectinfo
Class If

java.lang.Object
  extended by abc.weaving.aspectinfo.Syntax
      extended by abc.weaving.aspectinfo.Pointcut
          extended by abc.weaving.aspectinfo.If

public class If
extends Pointcut

Handler for if condition pointcut.

Author:
Aske Simon Christensen, Ganesh Sittampalam, Damien Sereni

Nested Class Summary
 
Nested classes/interfaces inherited from class abc.weaving.aspectinfo.Pointcut
Pointcut.DNF
 
Constructor Summary
If(java.util.List vars, MethodSig impl, int jp, int jpsp, int ejp, Position pos)
           
 
Method Summary
 int enclosingJoinPointPos()
           
 void getFreeVars(java.util.Set result)
          Get a list of free variables bound by this pointcut
 MethodSig getImpl()
          Get the signature of the method implementing the if condition.
 java.util.List getVars()
          Get the pointcut variables that should be given as arguments to the method implementing the if condition.
 boolean hasEnclosingJoinPoint()
           
 boolean hasJoinPoint()
           
 boolean hasJoinPointStaticPart()
           
protected  Pointcut inline(java.util.Hashtable renameEnv, java.util.Hashtable typeEnv, Aspect context, int cflowdepth)
          Inlining should remove all PointcutRefs, and return a pointcut that is alpha-renamed
 int joinPointPos()
           
 int joinPointStaticPartPos()
           
 Residue matchesAt(WeavingEnv we, SootClass cls, SootMethod method, ShadowMatch sm)
          Given a context and weaving environment, produce a residue
 void registerSetupAdvice(Aspect context, java.util.Hashtable typeMap)
          If any synthetic advice is required to implement this pointcut, this method should take care of adding it.
 java.lang.String toString()
          Subclasses must define toString, for debugging purposes
 boolean unify(Pointcut otherpc, Unification unification)
          Attempt to unify two pointcuts. pc.unify(pc', unification) should return true if the pointcuts can be unified, and set the renamings appropriately in unification.
 
Methods inherited from class abc.weaving.aspectinfo.Pointcut
dnf, freshVar, normalize
 
Methods inherited from class abc.weaving.aspectinfo.Syntax
getPosition
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

If

public If(java.util.List vars,
          MethodSig impl,
          int jp,
          int jpsp,
          int ejp,
          Position pos)
Method Detail

hasJoinPoint

public boolean hasJoinPoint()

hasJoinPointStaticPart

public boolean hasJoinPointStaticPart()

hasEnclosingJoinPoint

public boolean hasEnclosingJoinPoint()

joinPointPos

public int joinPointPos()

joinPointStaticPartPos

public int joinPointStaticPartPos()

enclosingJoinPointPos

public int enclosingJoinPointPos()

getVars

public java.util.List getVars()
Get the pointcut variables that should be given as arguments to the method implementing the if condition.

Returns:
a list of Var objects.

getImpl

public MethodSig getImpl()
Get the signature of the method implementing the if condition.


toString

public java.lang.String toString()
Description copied from class: Pointcut
Subclasses must define toString, for debugging purposes

Specified by:
toString in class Pointcut

matchesAt

public Residue matchesAt(WeavingEnv we,
                         SootClass cls,
                         SootMethod method,
                         ShadowMatch sm)
Description copied from class: Pointcut
Given a context and weaving environment, produce a residue

Specified by:
matchesAt in class Pointcut

inline

protected Pointcut inline(java.util.Hashtable renameEnv,
                          java.util.Hashtable typeEnv,
                          Aspect context,
                          int cflowdepth)
Description copied from class: Pointcut
Inlining should remove all PointcutRefs, and return a pointcut that is alpha-renamed

Specified by:
inline in class Pointcut
Parameters:
renameEnv - A mapping from pointcut names to the Vars they should be renamed to. If a name isn't in the map, it doesn't need to be renamed.
typeEnv - A mapping from pointcut names to AbcTypes. Every variable that can appear free in the pointcut must be listed. The names are those before any renaming takes place.
context - The Aspect in which the root pointcut is defined. This is required because references to abstract pointcuts must be resolved to the concrete pointcut using this aspect.
cflowdepth - The number of surrounding cflows. This is required to determine the correct precedence for the synthetic advice used to implement cflow.
Returns:
The inlined pointcut

registerSetupAdvice

public void registerSetupAdvice(Aspect context,
                                java.util.Hashtable typeMap)
Description copied from class: Pointcut
If any synthetic advice is required to implement this pointcut, this method should take care of adding it.

Specified by:
registerSetupAdvice in class Pointcut
Parameters:
context - The aspect in which the pointcut is defined
typeMap - A mapping from formal name to AbcType for all the formal parameters to the pointcut

getFreeVars

public void getFreeVars(java.util.Set result)
Description copied from class: Pointcut
Get a list of free variables bound by this pointcut

Specified by:
getFreeVars in class Pointcut
Parameters:
result - The results should be placed in this set (having it as a parameter allows it to be built up incrementally, which is more efficient than repeatedly taking the union of sets)

unify

public boolean unify(Pointcut otherpc,
                     Unification unification)
Description copied from class: Pointcut
Attempt to unify two pointcuts. pc.unify(pc', unification) should return true if the pointcuts can be unified, and set the renamings appropriately in unification. There are two cases for unification: if unification.unifyWithFirst() is true, then the unification should only succeed if this pc can be renamed to pc', with the unification pointcut equal to this. Otherwise, the unification pointcut can be anything, as long as it can be renamed both to this and pc'.

A default implementation is provided, but all subclasses should override this - otherwise cflow CSE will be disabled for cflow that use these pointcuts.

Typical implementations for pointcuts that introduce no free variables are straightforward (see the And pointcut, for example). For pointcuts that introduce free variables, the Var.unify method is used to actually update the renamings (see the Args pointcut).

Overrides:
unify in class Pointcut
Parameters:
otherpc - the pointcut that should be unify with this
unification - the Unification that should be set.
Returns:
true iff the unification is succesful. If true is returned, then Unification.setPointcut(the unified pointcut) must have been called in the body of unify().
See Also:
AndPointcut.unify example, Var.unify, Unification