* PARC initial implementation
* ******************************************************************/
-
package org.aspectj.weaver.patterns;
import java.io.DataOutputStream;
import org.aspectj.weaver.World;
import org.aspectj.weaver.ast.Expr;
import org.aspectj.weaver.ast.Test;
-import org.aspectj.weaver.bcel.BcelCflowAccessVar;
-
public class ConcreteCflowPointcut extends Pointcut {
- private Member cflowField;
- List/*Slot*/ slots; // exposed for testing
- boolean usesCounter;
-
- // Can either use a counter or a stack to implement cflow.
- public ConcreteCflowPointcut(Member cflowField, List slots,boolean usesCounter) {
- this.cflowField = cflowField;
- this.slots = slots;
+ private final Member cflowField;
+ List/* Slot */slots; // exposed for testing
+ boolean usesCounter;
+ ResolvedType aspect;
+
+ // Can either use a counter or a stack to implement cflow.
+ public ConcreteCflowPointcut(ResolvedType aspect, Member cflowField, List slots, boolean usesCounter) {
+ this.aspect = aspect;
+ this.cflowField = cflowField;
+ this.slots = slots;
this.usesCounter = usesCounter;
this.pointcutKind = CFLOW;
}
-
+
public int couldMatchKinds() {
return Shadow.ALL_SHADOW_KINDS_BITS;
}
-
- public FuzzyBoolean fastMatch(FastMatchInfo type) {
+
+ public FuzzyBoolean fastMatch(FastMatchInfo type) {
return FuzzyBoolean.MAYBE;
}
-
+
protected FuzzyBoolean matchInternal(Shadow shadow) {
- //??? this is not maximally efficient
+ // ??? this is not maximally efficient
// Check we'll be able to do the residue!
-
+
// this bit is for pr145693 - we cannot match at all if one of the types is missing, we will be unable
// to create the residue
- if (slots != null) {
- for (Iterator i = slots.iterator(); i.hasNext();) {
- Slot slot = (Slot) i.next();
- ResolvedType rt = slot.formalType;
- if (rt.isMissing()) {
- ISourceLocation[] locs = new ISourceLocation[]{getSourceLocation()};
- Message m = new Message(
- WeaverMessages.format(WeaverMessages.MISSING_TYPE_PREVENTS_MATCH,rt.getName()),
- "",Message.WARNING,shadow.getSourceLocation(),null,locs);
- rt.getWorld().getMessageHandler().handleMessage(m);
- return FuzzyBoolean.NO;
- }
- }
- }
+ if (slots != null) {
+ for (Iterator i = slots.iterator(); i.hasNext();) {
+ Slot slot = (Slot) i.next();
+ ResolvedType rt = slot.formalType;
+ if (rt.isMissing()) {
+ ISourceLocation[] locs = new ISourceLocation[] { getSourceLocation() };
+ Message m = new Message(WeaverMessages.format(WeaverMessages.MISSING_TYPE_PREVENTS_MATCH, rt.getName()), "",
+ Message.WARNING, shadow.getSourceLocation(), null, locs);
+ rt.getWorld().getMessageHandler().handleMessage(m);
+ return FuzzyBoolean.NO;
+ }
+ }
+ }
return FuzzyBoolean.MAYBE;
}
// used by weaver when validating bindings
public int[] getUsedFormalSlots() {
- if (slots == null) return new int[0];
+ if (slots == null)
+ return new int[0];
int[] indices = new int[slots.size()];
for (int i = 0; i < indices.length; i++) {
- indices[i] = ((Slot)slots.get(i)).formalIndex;
+ indices[i] = ((Slot) slots.get(i)).formalIndex;
}
return indices;
}
-
+
public void write(DataOutputStream s) throws IOException {
throw new RuntimeException("unimplemented");
}
-
public void resolveBindings(IScope scope, Bindings bindings) {
throw new RuntimeException("unimplemented");
}
-
- public Pointcut parameterizeWith(Map typeVariableMap,World w) {
+
+ public Pointcut parameterizeWith(Map typeVariableMap, World w) {
throw new RuntimeException("unimplemented");
}
-
+
public boolean equals(Object other) {
- if (!(other instanceof ConcreteCflowPointcut)) return false;
- ConcreteCflowPointcut o = (ConcreteCflowPointcut)other;
+ if (!(other instanceof ConcreteCflowPointcut))
+ return false;
+ ConcreteCflowPointcut o = (ConcreteCflowPointcut) other;
return o.cflowField.equals(this.cflowField);
}
- public int hashCode() {
- int result = 17;
- result = 37*result + cflowField.hashCode();
- return result;
- }
+
+ public int hashCode() {
+ int result = 17;
+ result = 37 * result + cflowField.hashCode();
+ return result;
+ }
+
public String toString() {
return "concretecflow(" + cflowField + ")";
}
protected Test findResidueInternal(Shadow shadow, ExposedState state) {
- //System.out.println("find residue: " + this);
+ // System.out.println("find residue: " + this);
if (usesCounter) {
return Test.makeFieldGetCall(cflowField, cflowCounterIsValidMethod, Expr.NONE);
} else {
- if (slots != null) { // null for cflows managed by counters
- for (Iterator i = slots.iterator(); i.hasNext();) {
- Slot slot = (Slot) i.next();
- //System.out.println("slot: " + slot.formalIndex);
- state.set(slot.formalIndex,
- new BcelCflowAccessVar(slot.formalType, cflowField, slot.arrayIndex));
- }
- }
- return Test.makeFieldGetCall(cflowField, cflowStackIsValidMethod, Expr.NONE);
+ if (slots != null) { // null for cflows managed by counters
+ for (Iterator i = slots.iterator(); i.hasNext();) {
+ Slot slot = (Slot) i.next();
+ // System.out.println("slot: " + slot.formalIndex);
+ state.set(slot.formalIndex, aspect.getWorld().getWeavingSupport().makeCflowAccessVar(slot.formalType,
+ cflowField, slot.arrayIndex));
+ }
+ }
+ return Test.makeFieldGetCall(cflowField, cflowStackIsValidMethod, Expr.NONE);
}
}
-
- private static final Member cflowStackIsValidMethod =
- MemberImpl.method(NameMangler.CFLOW_STACK_UNRESOLVEDTYPE, 0, ResolvedType.BOOLEAN,"isValid", UnresolvedType.NONE);
- private static final Member cflowCounterIsValidMethod =
- MemberImpl.method(NameMangler.CFLOW_COUNTER_UNRESOLVEDTYPE, 0,ResolvedType.BOOLEAN, "isValid", UnresolvedType.NONE);
+ private static final Member cflowStackIsValidMethod = MemberImpl.method(NameMangler.CFLOW_STACK_UNRESOLVEDTYPE, 0,
+ ResolvedType.BOOLEAN, "isValid", UnresolvedType.NONE);
+
+ private static final Member cflowCounterIsValidMethod = MemberImpl.method(NameMangler.CFLOW_COUNTER_UNRESOLVEDTYPE, 0,
+ ResolvedType.BOOLEAN, "isValid", UnresolvedType.NONE);
-
public Pointcut concretize1(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings) {
throw new RuntimeException("unimplemented");
}
- public Object accept(PatternNodeVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-
+ public Object accept(PatternNodeVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
public static class Slot {
int formalIndex;
ResolvedType formalType;
int arrayIndex;
-
- public Slot(
- int formalIndex,
- ResolvedType formalType,
- int arrayIndex) {
+
+ public Slot(int formalIndex, ResolvedType formalType, int arrayIndex) {
this.formalIndex = formalIndex;
this.formalType = formalType;
this.arrayIndex = arrayIndex;
}
-
+
public boolean equals(Object other) {
- if (!(other instanceof Slot)) return false;
-
- Slot o = (Slot)other;
- return o.formalIndex == this.formalIndex &&
- o.arrayIndex == this.arrayIndex &&
- o.formalType.equals(this.formalType);
+ if (!(other instanceof Slot))
+ return false;
+
+ Slot o = (Slot) other;
+ return o.formalIndex == this.formalIndex && o.arrayIndex == this.arrayIndex && o.formalType.equals(this.formalType);
}
-
- public int hashCode() {
- int result = 19;
- result = 37*result + formalIndex;
- result = 37*result + arrayIndex;
- result = 37*result + formalType.hashCode();
- return result;
- }
-
+
+ public int hashCode() {
+ int result = 19;
+ result = 37 * result + formalIndex;
+ result = 37 * result + arrayIndex;
+ result = 37 * result + formalType.hashCode();
+ return result;
+ }
+
public String toString() {
return "Slot(" + formalIndex + ", " + formalType + ", " + arrayIndex + ")";
}
import java.util.Map;
import org.aspectj.bridge.IMessage;
-import org.aspectj.lang.JoinPoint;
import org.aspectj.util.FuzzyBoolean;
import org.aspectj.weaver.Advice;
import org.aspectj.weaver.AjcMemberMaker;
public ResolvedMember testMethod;
public int extraParameterFlags;
- /**
- * A token source dump that looks like a pointcut (but is NOT parseable at all - just here to help debugging etc)
- */
- private String enclosingPointcutHint;
+ /**
+ * A token source dump that looks like a pointcut (but is NOT parseable at all - just here to help debugging etc)
+ */
+ private final String enclosingPointcutHint;
public Pointcut residueSource;
int baseArgsCount;
-
- //XXX some way to compute args
+
+ // XXX some way to compute args
public IfPointcut(ResolvedMember testMethod, int extraParameterFlags) {
this.testMethod = testMethod;
this.extraParameterFlags = extraParameterFlags;
this.pointcutKind = IF;
- this.enclosingPointcutHint = null;
+ this.enclosingPointcutHint = null;
}
- /**
- * No-arg constructor for @AJ style, where the if() body is actually the @Pointcut annotated method
- */
- public IfPointcut(String enclosingPointcutHint) {
- this.pointcutKind = IF;
- this.enclosingPointcutHint = enclosingPointcutHint;
- this.testMethod = null;// resolved during concretize
- this.extraParameterFlags = -1;//allows to keep track of the @Aj style
- }
+ /**
+ * No-arg constructor for @AJ style, where the if() body is actually the @Pointcut annotated method
+ */
+ public IfPointcut(String enclosingPointcutHint) {
+ this.pointcutKind = IF;
+ this.enclosingPointcutHint = enclosingPointcutHint;
+ this.testMethod = null;// resolved during concretize
+ this.extraParameterFlags = -1;// allows to keep track of the @Aj style
+ }
public int couldMatchKinds() {
return Shadow.ALL_SHADOW_KINDS_BITS;
public FuzzyBoolean fastMatch(FastMatchInfo type) {
return FuzzyBoolean.MAYBE;
}
-
+
protected FuzzyBoolean matchInternal(Shadow shadow) {
- //??? this is not maximally efficient
+ // ??? this is not maximally efficient
return FuzzyBoolean.MAYBE;
}
public boolean alwaysFalse() {
return false;
}
-
+
public boolean alwaysTrue() {
return false;
}
-
+
// enh 76055
public Pointcut getResidueSource() {
return residueSource;
}
-
+
public void write(DataOutputStream s) throws IOException {
s.writeByte(Pointcut.IF);
- s.writeBoolean(testMethod != null); // do we have a test method?
- if (testMethod != null) testMethod.write(s);
+ s.writeBoolean(testMethod != null); // do we have a test method?
+ if (testMethod != null)
+ testMethod.write(s);
s.writeByte(extraParameterFlags);
writeLocation(s);
}
+
public static Pointcut read(VersionedDataInputStream s, ISourceContext context) throws IOException {
boolean hasTestMethod = s.readBoolean();
- ResolvedMember resolvedTestMethod = null;
- if (hasTestMethod) { // should always have a test method unless @AJ style
+ ResolvedMember resolvedTestMethod = null;
+ if (hasTestMethod) { // should always have a test method unless @AJ style
resolvedTestMethod = ResolvedMemberImpl.readResolvedMember(s, context);
}
IfPointcut ret = new IfPointcut(resolvedTestMethod, s.readByte());
}
public void resolveBindings(IScope scope, Bindings bindings) {
- //??? all we need is good error messages in here in cflow contexts
+ // ??? all we need is good error messages in here in cflow contexts
}
-
+
public boolean equals(Object other) {
- if (!(other instanceof IfPointcut)) return false;
- IfPointcut o = (IfPointcut)other;
- if (o.testMethod==null) return (this.testMethod==null);
+ if (!(other instanceof IfPointcut))
+ return false;
+ IfPointcut o = (IfPointcut) other;
+ if (o.testMethod == null)
+ return (this.testMethod == null);
return o.testMethod.equals(this.testMethod);
}
- public int hashCode() {
- int result = 17;
- result = 37*result + testMethod.hashCode();
- return result;
- }
-
- public String toString() {
- if (extraParameterFlags < 0) {
- //@AJ style
- return "if()";
- } else {
- return "if(" + testMethod + ")";//FIXME AV - bad, this makes it unparsable. Perhaps we can use if() for code style behind the scene!
- }
+ public int hashCode() {
+ int result = 17;
+ result = 37 * result + testMethod.hashCode();
+ return result;
+ }
+
+ public String toString() {
+ if (extraParameterFlags < 0) {
+ // @AJ style
+ return "if()";
+ } else {
+ return "if(" + testMethod + ")";// FIXME AV - bad, this makes it unparsable. Perhaps we can use if() for code style
+ // behind the scene!
+ }
}
- //??? The implementation of name binding and type checking in if PCDs is very convoluted
- // There has to be a better way...
- private boolean findingResidue = false;
-
+ // ??? The implementation of name binding and type checking in if PCDs is very convoluted
+ // There has to be a better way...
+ private boolean findingResidue = false;
+
// Similar to lastMatchedShadowId - but only for if PCDs.
private int ifLastMatchedShadowId;
private Test ifLastMatchedShadowResidue;
-
+
/**
* At each shadow that matched, the residue can be different.
*/
protected Test findResidueInternal(Shadow shadow, ExposedState state) {
- if (findingResidue) return Literal.TRUE;
+ if (findingResidue)
+ return Literal.TRUE;
findingResidue = true;
try {
// Have we already been asked this question?
- if (shadow.shadowId == ifLastMatchedShadowId) return ifLastMatchedShadowResidue;
-
+ if (shadow.shadowId == ifLastMatchedShadowId)
+ return ifLastMatchedShadowResidue;
+
Test ret = Literal.TRUE;
List args = new ArrayList();
-
- // code style
- if (extraParameterFlags >= 0) {
- // If there are no args to sort out, don't bother with the recursive call
- if (baseArgsCount > 0) {
- ExposedState myState = new ExposedState(baseArgsCount);
- //??? we throw out the test that comes from this walk. All we want here
- // is bindings for the arguments
- residueSource.findResidue(shadow, myState);
-
- UnresolvedType[] pTypes = (testMethod==null?null:testMethod.getParameterTypes());
- if (pTypes!=null && baseArgsCount>pTypes.length) { //pr155347
- throw new BCException("Unexpected problem with testMethod "+testMethod+": expecting "+baseArgsCount+" arguments");
- }
- // pr118149
- // It is possible for vars in myState (which would normally be set
- // in the call to residueSource.findResidue) to not be set (be null)
- // in an Or pointcut with if expressions in both branches, and where
- // one branch is known statically to not match. In this situation we
- // simply return Test.
- for (int i=0; i < baseArgsCount; i++) {
- Var v = myState.get(i);
- if (v == null) continue; // pr118149
- args.add(v);
- ret = Test.makeAnd(ret,
- Test.makeInstanceof(v,
- pTypes[i].resolve(shadow.getIWorld())));
- }
- }
-
- // handle thisJoinPoint parameters
- if ((extraParameterFlags & Advice.ThisJoinPoint) != 0) {
- args.add(shadow.getThisJoinPointVar());
- }
-
- if ((extraParameterFlags & Advice.ThisJoinPointStaticPart) != 0) {
- args.add(shadow.getThisJoinPointStaticPartVar());
- }
-
- if ((extraParameterFlags & Advice.ThisEnclosingJoinPointStaticPart) != 0) {
- args.add(shadow.getThisEnclosingJoinPointStaticPartVar());
- }
- } else {
- // @style is slightly different
- int currentStateIndex = 0;
- //FIXME AV - "args(jp)" test(jp, thejp) will fail here
- for (int i = 0; i < testMethod.getParameterTypes().length; i++) {
- String argSignature = testMethod.getParameterTypes()[i].getSignature();
- if (AjcMemberMaker.TYPEX_JOINPOINT.getSignature().equals(argSignature)) {
- args.add(shadow.getThisJoinPointVar());
- } else if (AjcMemberMaker.TYPEX_PROCEEDINGJOINPOINT.getSignature().equals(argSignature)) {
- args.add(shadow.getThisJoinPointVar());
- } else if (AjcMemberMaker.TYPEX_STATICJOINPOINT.getSignature().equals(argSignature)) {
- args.add(shadow.getThisJoinPointStaticPartVar());
- } else if (AjcMemberMaker.TYPEX_ENCLOSINGSTATICJOINPOINT.getSignature().equals(argSignature)) {
- args.add(shadow.getThisEnclosingJoinPointStaticPartVar());
- } else {
- // we don't use i as JoinPoint.* can be anywhere in the signature in @style
- Var v = state.get(currentStateIndex++);
- args.add(v);
- ret = Test.makeAnd(ret,
- Test.makeInstanceof(v,
- testMethod.getParameterTypes()[i].resolve(shadow.getIWorld())));
- }
- }
- }
-
- ret = Test.makeAnd(ret, Test.makeCall(testMethod, (Expr[])args.toArray(new Expr[args.size()])));
+
+ // code style
+ if (extraParameterFlags >= 0) {
+ // If there are no args to sort out, don't bother with the recursive call
+ if (baseArgsCount > 0) {
+ ExposedState myState = new ExposedState(baseArgsCount);
+ // ??? we throw out the test that comes from this walk. All we want here
+ // is bindings for the arguments
+ residueSource.findResidue(shadow, myState);
+
+ UnresolvedType[] pTypes = (testMethod == null ? null : testMethod.getParameterTypes());
+ if (pTypes != null && baseArgsCount > pTypes.length) { // pr155347
+ throw new BCException("Unexpected problem with testMethod " + testMethod + ": expecting " + baseArgsCount
+ + " arguments");
+ }
+ // pr118149
+ // It is possible for vars in myState (which would normally be set
+ // in the call to residueSource.findResidue) to not be set (be null)
+ // in an Or pointcut with if expressions in both branches, and where
+ // one branch is known statically to not match. In this situation we
+ // simply return Test.
+ for (int i = 0; i < baseArgsCount; i++) {
+ Var v = myState.get(i);
+ if (v == null)
+ continue; // pr118149
+ args.add(v);
+ ret = Test.makeAnd(ret, Test.makeInstanceof(v, pTypes[i].resolve(shadow.getIWorld())));
+ }
+ }
+
+ // handle thisJoinPoint parameters
+ if ((extraParameterFlags & Advice.ThisJoinPoint) != 0) {
+ args.add(shadow.getThisJoinPointVar());
+ }
+
+ if ((extraParameterFlags & Advice.ThisJoinPointStaticPart) != 0) {
+ args.add(shadow.getThisJoinPointStaticPartVar());
+ }
+
+ if ((extraParameterFlags & Advice.ThisEnclosingJoinPointStaticPart) != 0) {
+ args.add(shadow.getThisEnclosingJoinPointStaticPartVar());
+ }
+ } else {
+ // @style is slightly different
+ int currentStateIndex = 0;
+ // FIXME AV - "args(jp)" test(jp, thejp) will fail here
+ for (int i = 0; i < testMethod.getParameterTypes().length; i++) {
+ String argSignature = testMethod.getParameterTypes()[i].getSignature();
+ if (AjcMemberMaker.TYPEX_JOINPOINT.getSignature().equals(argSignature)) {
+ args.add(shadow.getThisJoinPointVar());
+ } else if (AjcMemberMaker.TYPEX_PROCEEDINGJOINPOINT.getSignature().equals(argSignature)) {
+ args.add(shadow.getThisJoinPointVar());
+ } else if (AjcMemberMaker.TYPEX_STATICJOINPOINT.getSignature().equals(argSignature)) {
+ args.add(shadow.getThisJoinPointStaticPartVar());
+ } else if (AjcMemberMaker.TYPEX_ENCLOSINGSTATICJOINPOINT.getSignature().equals(argSignature)) {
+ args.add(shadow.getThisEnclosingJoinPointStaticPartVar());
+ } else {
+ // we don't use i as JoinPoint.* can be anywhere in the signature in @style
+ Var v = state.get(currentStateIndex++);
+ args.add(v);
+ ret = Test.makeAnd(ret, Test.makeInstanceof(v, testMethod.getParameterTypes()[i]
+ .resolve(shadow.getIWorld())));
+ }
+ }
+ }
+
+ ret = Test.makeAnd(ret, Test.makeCall(testMethod, (Expr[]) args.toArray(new Expr[args.size()])));
// Remember...
ifLastMatchedShadowId = shadow.shadowId;
ifLastMatchedShadowResidue = ret;
- return ret;
+ return ret;
} finally {
findingResidue = false;
}
}
-
- // amc - the only reason this override seems to be here is to stop the copy, but
+ // amc - the only reason this override seems to be here is to stop the copy, but
// that can be prevented by overriding shouldCopyLocationForConcretization,
// allowing me to make the method final in Pointcut.
-// public Pointcut concretize(ResolvedType inAspect, IntMap bindings) {
-// return this.concretize1(inAspect, bindings);
-// }
-
+ // public Pointcut concretize(ResolvedType inAspect, IntMap bindings) {
+ // return this.concretize1(inAspect, bindings);
+ // }
+
protected boolean shouldCopyLocationForConcretize() {
return false;
}
-
+
private IfPointcut partiallyConcretized = null;
- public Pointcut concretize1(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings) {
- //System.err.println("concretize: " + this + " already: " + partiallyConcretized);
-
+
+ public Pointcut concretize1(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings) {
+ // System.err.println("concretize: " + this + " already: " + partiallyConcretized);
+
if (isDeclare(bindings.getEnclosingAdvice())) {
// Enforce rule about which designators are supported in declare
- inAspect.getWorld().showMessage(IMessage.ERROR,
- WeaverMessages.format(WeaverMessages.IF_IN_DECLARE),
- bindings.getEnclosingAdvice().getSourceLocation(),
- null);
+ inAspect.getWorld().showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.IF_IN_DECLARE),
+ bindings.getEnclosingAdvice().getSourceLocation(), null);
return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
}
return partiallyConcretized;
}
- final IfPointcut ret;
- if (extraParameterFlags < 0 && testMethod == null) {
- // @AJ style, we need to find the testMethod in the aspect defining the "if()" enclosing pointcut
- ResolvedPointcutDefinition def = bindings.peekEnclosingDefinition();
- if (def != null) {
- ResolvedType aspect = inAspect.getWorld().resolve(def.getDeclaringType());
- for (Iterator memberIter = aspect.getMethods(); memberIter.hasNext();) {
- ResolvedMember method = (ResolvedMember) memberIter.next();
- if (def.getName().equals(method.getName())
- && def.getParameterTypes().length == method.getParameterTypes().length) {
- boolean sameSig = true;
- for (int j = 0; j < method.getParameterTypes().length; j++) {
- UnresolvedType argJ = method.getParameterTypes()[j];
- if (!argJ.equals(def.getParameterTypes()[j])) {
- sameSig = false;
- break;
- }
- }
- if (sameSig) {
- testMethod = method;
- break;
- }
- }
- }
- if (testMethod == null) {
- inAspect.getWorld().showMessage(
- IMessage.ERROR,
- "Cannot find if() body from '" + def.toString() + "' for '" + enclosingPointcutHint + "'",
- this.getSourceLocation(),
- null
- );
- return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
- }
- } else {
- testMethod = inAspect.getWorld().resolve(bindings.getAdviceSignature());
- }
- ret = new IfPointcut(enclosingPointcutHint);
- ret.testMethod = testMethod;
- } else {
- ret = new IfPointcut(testMethod, extraParameterFlags);
- }
- ret.copyLocationFrom(this);
- partiallyConcretized = ret;
+ final IfPointcut ret;
+ if (extraParameterFlags < 0 && testMethod == null) {
+ // @AJ style, we need to find the testMethod in the aspect defining the "if()" enclosing pointcut
+ ResolvedPointcutDefinition def = bindings.peekEnclosingDefinition();
+ if (def != null) {
+ ResolvedType aspect = inAspect.getWorld().resolve(def.getDeclaringType());
+ for (Iterator memberIter = aspect.getMethods(); memberIter.hasNext();) {
+ ResolvedMember method = (ResolvedMember) memberIter.next();
+ if (def.getName().equals(method.getName())
+ && def.getParameterTypes().length == method.getParameterTypes().length) {
+ boolean sameSig = true;
+ for (int j = 0; j < method.getParameterTypes().length; j++) {
+ UnresolvedType argJ = method.getParameterTypes()[j];
+ if (!argJ.equals(def.getParameterTypes()[j])) {
+ sameSig = false;
+ break;
+ }
+ }
+ if (sameSig) {
+ testMethod = method;
+ break;
+ }
+ }
+ }
+ if (testMethod == null) {
+ inAspect.getWorld().showMessage(IMessage.ERROR,
+ "Cannot find if() body from '" + def.toString() + "' for '" + enclosingPointcutHint + "'",
+ this.getSourceLocation(), null);
+ return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
+ }
+ } else {
+ testMethod = inAspect.getWorld().resolve(bindings.getAdviceSignature());
+ }
+ ret = new IfPointcut(enclosingPointcutHint);
+ ret.testMethod = testMethod;
+ } else {
+ ret = new IfPointcut(testMethod, extraParameterFlags);
+ }
+ ret.copyLocationFrom(this);
+ partiallyConcretized = ret;
// It is possible to directly code your pointcut expression in a per clause
// rather than defining a pointcut declaration and referencing it in your
- // per clause. If you do this, we have problems (bug #62458). For now,
+ // per clause. If you do this, we have problems (bug #62458). For now,
// let's police that you are trying to code a pointcut in a per clause and
// put out a compiler error.
- if (bindings.directlyInAdvice() && bindings.getEnclosingAdvice()==null) {
+ if (bindings.directlyInAdvice() && bindings.getEnclosingAdvice() == null) {
// Assumption: if() is in a per clause if we say we are directly in advice
// but we have no enclosing advice.
- inAspect.getWorld().showMessage(IMessage.ERROR,
- WeaverMessages.format(WeaverMessages.IF_IN_PERCLAUSE),
- this.getSourceLocation(),null);
+ inAspect.getWorld().showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.IF_IN_PERCLAUSE),
+ this.getSourceLocation(), null);
return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
}
-
+
if (bindings.directlyInAdvice()) {
ShadowMunger advice = bindings.getEnclosingAdvice();
if (advice instanceof Advice) {
- ret.baseArgsCount = ((Advice)advice).getBaseParameterCount();
+ ret.baseArgsCount = ((Advice) advice).getBaseParameterCount();
} else {
ret.baseArgsCount = 0;
}
} else {
ResolvedPointcutDefinition def = bindings.peekEnclosingDefinition();
if (def == CflowPointcut.CFLOW_MARKER) {
- inAspect.getWorld().showMessage(IMessage.ERROR,
- WeaverMessages.format(WeaverMessages.IF_LEXICALLY_IN_CFLOW),
+ inAspect.getWorld().showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.IF_LEXICALLY_IN_CFLOW),
getSourceLocation(), null);
return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
}
ret.baseArgsCount = def.getParameterTypes().length;
- // for @style, we have implicit binding for JoinPoint.* things
- //FIXME AV - will lead to failure for "args(jp)" test(jp, thejp) / see args() implementation
- if (ret.extraParameterFlags < 0) {
- ret.baseArgsCount = 0;
- for (int i = 0; i < testMethod.getParameterTypes().length; i++) {
- String argSignature = testMethod.getParameterTypes()[i].getSignature();
- if (AjcMemberMaker.TYPEX_JOINPOINT.getSignature().equals(argSignature)
- || AjcMemberMaker.TYPEX_PROCEEDINGJOINPOINT.getSignature().equals(argSignature)
- || AjcMemberMaker.TYPEX_STATICJOINPOINT.getSignature().equals(argSignature)
- || AjcMemberMaker.TYPEX_ENCLOSINGSTATICJOINPOINT.getSignature().equals(argSignature)) {
-
- } else {
- ret.baseArgsCount++;
- }
- }
- }
+ // for @style, we have implicit binding for JoinPoint.* things
+ // FIXME AV - will lead to failure for "args(jp)" test(jp, thejp) / see args() implementation
+ if (ret.extraParameterFlags < 0) {
+ ret.baseArgsCount = 0;
+ for (int i = 0; i < testMethod.getParameterTypes().length; i++) {
+ String argSignature = testMethod.getParameterTypes()[i].getSignature();
+ if (AjcMemberMaker.TYPEX_JOINPOINT.getSignature().equals(argSignature)
+ || AjcMemberMaker.TYPEX_PROCEEDINGJOINPOINT.getSignature().equals(argSignature)
+ || AjcMemberMaker.TYPEX_STATICJOINPOINT.getSignature().equals(argSignature)
+ || AjcMemberMaker.TYPEX_ENCLOSINGSTATICJOINPOINT.getSignature().equals(argSignature)) {
+
+ } else {
+ ret.baseArgsCount++;
+ }
+ }
+ }
IntMap newBindings = IntMap.idMap(ret.baseArgsCount);
newBindings.copyContext(bindings);
ret.residueSource = def.getPointcut().concretize(inAspect, declaringType, newBindings);
}
-
+
return ret;
}
// we can't touch "if" methods
- public Pointcut parameterizeWith(Map typeVariableMap,World w) {
+ public Pointcut parameterizeWith(Map typeVariableMap, World w) {
return this;
}
-
-// public static Pointcut MatchesNothing = new MatchesNothingPointcut();
-// ??? there could possibly be some good optimizations to be done at this point
+
+ // public static Pointcut MatchesNothing = new MatchesNothingPointcut();
+ // ??? there could possibly be some good optimizations to be done at this point
public static IfPointcut makeIfFalsePointcut(State state) {
IfPointcut ret = new IfFalsePointcut();
ret.state = state;
return ret;
}
- public Object accept(PatternNodeVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
+ public Object accept(PatternNodeVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
public static class IfFalsePointcut extends IfPointcut {
-
+
public IfFalsePointcut() {
- super(null,0);
- this.pointcutKind = Pointcut.IF_FALSE;
+ super(null, 0);
+ this.pointcutKind = Pointcut.IF_FALSE;
}
-
+
public int couldMatchKinds() {
return Shadow.NO_SHADOW_KINDS_BITS;
}
-
+
public boolean alwaysFalse() {
return true;
}
-
+
protected Test findResidueInternal(Shadow shadow, ExposedState state) {
return Literal.FALSE; // can only get here if an earlier error occurred
}
public FuzzyBoolean fastMatch(FastMatchInfo type) {
return FuzzyBoolean.NO;
}
-
+
protected FuzzyBoolean matchInternal(Shadow shadow) {
return FuzzyBoolean.NO;
}
-
- public FuzzyBoolean match(JoinPoint.StaticPart jpsp) {
- return FuzzyBoolean.NO;
- }
public void resolveBindings(IScope scope, Bindings bindings) {
}
-
+
public void postRead(ResolvedType enclosingType) {
}
- public Pointcut concretize1(
- ResolvedType inAspect,
- ResolvedType declaringType,
- IntMap bindings) {
+ public Pointcut concretize1(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings) {
if (isDeclare(bindings.getEnclosingAdvice())) {
// Enforce rule about which designators are supported in declare
- inAspect.getWorld().showMessage(IMessage.ERROR,
- WeaverMessages.format(WeaverMessages.IF_IN_DECLARE),
- bindings.getEnclosingAdvice().getSourceLocation(),
- null);
+ inAspect.getWorld().showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.IF_IN_DECLARE),
+ bindings.getEnclosingAdvice().getSourceLocation(), null);
return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
}
return makeIfFalsePointcut(state);
}
-
public void write(DataOutputStream s) throws IOException {
s.writeByte(Pointcut.IF_FALSE);
}
-
- public int hashCode() {
- int result = 17;
- return result;
- }
-
- public String toString() {
+
+ public int hashCode() {
+ int result = 17;
+ return result;
+ }
+
+ public String toString() {
return "if(false)";
- }
+ }
}
public static IfPointcut makeIfTruePointcut(State state) {
}
public static class IfTruePointcut extends IfPointcut {
-
+
public IfTruePointcut() {
- super(null,0);
- this.pointcutKind = Pointcut.IF_TRUE;
+ super(null, 0);
+ this.pointcutKind = Pointcut.IF_TRUE;
}
public boolean alwaysTrue() {
return true;
}
-
+
protected Test findResidueInternal(Shadow shadow, ExposedState state) {
return Literal.TRUE; // can only get here if an earlier error occurred
}
public FuzzyBoolean fastMatch(FastMatchInfo type) {
return FuzzyBoolean.YES;
}
-
+
protected FuzzyBoolean matchInternal(Shadow shadow) {
return FuzzyBoolean.YES;
}
-
- public FuzzyBoolean match(JoinPoint.StaticPart jpsp) {
- return FuzzyBoolean.YES;
- }
public void resolveBindings(IScope scope, Bindings bindings) {
}
-
+
public void postRead(ResolvedType enclosingType) {
}
- public Pointcut concretize1(
- ResolvedType inAspect,
- ResolvedType declaringType,
- IntMap bindings) {
+ public Pointcut concretize1(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings) {
if (isDeclare(bindings.getEnclosingAdvice())) {
// Enforce rule about which designators are supported in declare
- inAspect.getWorld().showMessage(IMessage.ERROR,
- WeaverMessages.format(WeaverMessages.IF_IN_DECLARE),
- bindings.getEnclosingAdvice().getSourceLocation(),
- null);
+ inAspect.getWorld().showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.IF_IN_DECLARE),
+ bindings.getEnclosingAdvice().getSourceLocation(), null);
return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
}
return makeIfTruePointcut(state);
}
-
public void write(DataOutputStream s) throws IOException {
s.writeByte(IF_TRUE);
}
-
- public int hashCode() {
- int result = 37;
- return result;
- }
-
- public String toString() {
+
+ public int hashCode() {
+ int result = 37;
+ return result;
+ }
+
+ public String toString() {
return "if(true)";
- }
+ }
}
}
-