return new ConcreteCflowPointcut(localCflowField, slots,false);
Pointcut ret = new ConcreteCflowPointcut(localCflowField, slots,false); ret.copyLocationFrom(this); return ret;
	public Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) {		// Enforce rule about which designators are supported in declare		if (isDeclare(bindings.getEnclosingAdvice())) {			inAspect.getWorld().showMessage(IMessage.ERROR,					WeaverMessages.format(WeaverMessages.CFLOW_IN_DECLARE,isBelow?"below":""),					bindings.getEnclosingAdvice().getSourceLocation(), null);			return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);		}				//make this remap from formal positions to arrayIndices		IntMap entryBindings = new IntMap();		for (int i=0, len=freeVars.length; i < len; i++) {			int freeVar = freeVars[i];			//int formalIndex = bindings.get(freeVar);			entryBindings.put(freeVar, i);		}		entryBindings.copyContext(bindings);		//System.out.println(this + " bindings: " + entryBindings);				World world = inAspect.getWorld();				Pointcut concreteEntry;				ResolvedTypeX concreteAspect = bindings.getConcreteAspect();				CrosscuttingMembers xcut = concreteAspect.crosscuttingMembers;				Collection previousCflowEntries = xcut.getCflowEntries();						entryBindings.pushEnclosingDefinition(CFLOW_MARKER);		// This block concretizes the pointcut within the cflow pointcut		try {			concreteEntry = entry.concretize(inAspect, entryBindings);		} finally {			entryBindings.popEnclosingDefinitition();		}		List innerCflowEntries = new ArrayList(xcut.getCflowEntries());		innerCflowEntries.removeAll(previousCflowEntries);		  		Object field = getCflowfield(concreteEntry);				// Four routes of interest through this code (did I hear someone say refactor??)		// 1) no state in the cflow - we can use a counter *and* we have seen this pointcut		//    before - so use the same counter as before.		// 2) no state in the cflow - we can use a counter, but this is the first time		//    we have seen this pointcut, so build the infrastructure.		// 3) state in the cflow - we need to use a stack *and* we have seen this pointcut		//    before - so share the stack.		// 4) state in the cflow - we need to use a stack, but this is the first time 		//    we have seen this pointcut, so build the infrastructure.				if (freeVars.length == 0) { // No state, so don't use a stack, use a counter.		  ResolvedMember localCflowField = null;		  // Check if we have already got a counter for this cflow pointcut		  if (field != null) {		   	localCflowField = (ResolvedMember)field; // Use the one we already have		   			  } else {		  			  	// Create a counter field in the aspect		  	localCflowField = new ResolvedMember(Member.FIELD,concreteAspect,Modifier.STATIC | Modifier.PUBLIC | Modifier.FINAL,		  		NameMangler.cflowCounter(xcut),TypeX.forName(NameMangler.CFLOW_COUNTER_TYPE).getSignature());		  		    // Create type munger to add field to the aspect		    concreteAspect.crosscuttingMembers.addTypeMunger(world.makeCflowCounterFieldAdder(localCflowField));		  		    // Create shadow munger to push stuff onto the stack		    concreteAspect.crosscuttingMembers.addConcreteShadowMunger(		  		Advice.makeCflowEntry(world,concreteEntry,isBelow,localCflowField,freeVars.length,innerCflowEntries,inAspect));		    		    putCflowfield(concreteEntry,localCflowField); // Remember it	      }		  return new ConcreteCflowPointcut(localCflowField, null,true);		} 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);				ResolvedTypeX formalType =					bindings.getAdviceSignature().getParameterTypes()[formalIndex].resolve(world);								ConcreteCflowPointcut.Slot slot = 					new ConcreteCflowPointcut.Slot(formalIndex, formalType, i);				slots.add(slot);			}			ResolvedMember localCflowField = null;			if (field != null) {				localCflowField = (ResolvedMember)field;			} else {		      			  localCflowField = new ResolvedMember(				Member.FIELD, concreteAspect, Modifier.STATIC | Modifier.PUBLIC | Modifier.FINAL,						NameMangler.cflowStack(xcut), 						TypeX.forName(NameMangler.CFLOW_STACK_TYPE).getSignature());			  //System.out.println("adding field to: " + inAspect + " field " + cflowField);									  // add field and initializer to inAspect			  //XXX and then that info above needs to be mapped down here to help with			  //XXX getting the exposed state right			  concreteAspect.crosscuttingMembers.addConcreteShadowMunger(					Advice.makeCflowEntry(world, concreteEntry, isBelow, localCflowField, freeVars.length, innerCflowEntries,inAspect));						  concreteAspect.crosscuttingMembers.addTypeMunger(				world.makeCflowStackFieldAdder(localCflowField));			  putCflowfield(concreteEntry,localCflowField);		    }			return new ConcreteCflowPointcut(localCflowField, slots,false);		}			}