// already have
} else {
// Create a counter field in the aspect
localCflowField = new ResolvedMemberImpl(Member.FIELD, concreteAspect, Modifier.STATIC | Modifier.PUBLIC
| Modifier.FINAL, NameMangler.cflowCounter(xcut), UnresolvedType.forName(NameMangler.CFLOW_COUNTER_TYPE)
.getSignature());
// Create type munger to add field to the aspect
concreteAspect.crosscuttingMembers.addTypeMunger(world.getWeavingSupport().makeCflowCounterFieldAdder(
localCflowField));
// Create shadow munger to push stuff onto the stack
concreteAspect.crosscuttingMembers.addConcreteShadowMunger(Advice.makeCflowEntry(world, concreteEntry, isBelow,
localCflowField, freeVars == null ? 0 : freeVars.length, innerCflowEntries, inAspect));
putCflowfield(xcut, concreteEntry, concreteAspect, localCflowField, "counter"); // Remember
// it
}
Pointcut ret = new ConcreteCflowPointcut(concreteAspect, localCflowField, null, true);
ret.copyLocationFrom(this);
return ret;
} else {
List slots = new ArrayList();
for (int i = 0, len = freeVars.length; i < len; i++) {
int freeVar = freeVars[i];
// we don't need to keep state that isn't actually exposed to
// advice
// ??? this means that we will store some state that we won't
// actually use, optimize this later
if (!bindings.hasKey(freeVar)) {
continue;
}
int formalIndex = bindings.get(freeVar);
// We need to look in the right place for the type of the
// formal. Suppose the advice looks like this:
// before(String s): somePointcut(*,s)
// where the first argument in somePointcut is of type Number
// for free variable 0 we want to ask the pointcut for the type
// of its first argument, if we only
// ask the advice for the type of its first argument then we'll
// get the wrong type (pr86903)
ResolvedPointcutDefinition enclosingDef = bindings.peekEnclosingDefinition();
ResolvedType formalType = null;
// Is there a useful enclosing pointcut?
if (enclosingDef != null && enclosingDef.getParameterTypes().length > 0) {
formalType = enclosingDef.getParameterTypes()[freeVar].resolve(world);
} else {
formalType = bindings.getAdviceSignature().getParameterTypes()[formalIndex].resolve(world);
}
ConcreteCflowPointcut.Slot slot = new ConcreteCflowPointcut.Slot(formalIndex, formalType, i);
slots.add(slot);
}
ResolvedMember localCflowField = null;
Object field = getCflowfield(xcut, concreteEntry, concreteAspect, "stack");
if (field != null) {
localCflowField = (ResolvedMember) field;
} else {
localCflowField = new ResolvedMemberImpl(Member.FIELD, concreteAspect, Modifier.STATIC | Modifier.PUBLIC
| Modifier.FINAL, NameMangler.cflowStack(xcut), UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE)
.getSignature());
// System.out.println("adding field to: " + inAspect + " field "
// + cflowField);