From d7d315bedcf39f75067a7dbabd9109c03ccbc67c Mon Sep 17 00:00:00 2001 From: aclement Date: Mon, 5 May 2008 18:55:47 +0000 Subject: [PATCH] 230134: tests and fixes - move cflow caches from static state to crosscuttingmembers for the aspect, fixing their lifecycle. --- .../aspectj/weaver/CrosscuttingMembers.java | 19 ++++++++ .../weaver/CrosscuttingMembersSet.java | 3 -- .../bcel/BcelCflowCounterFieldAdder.java | 4 ++ .../org/aspectj/weaver/bcel/BcelWeaver.java | 2 - .../weaver/patterns/CflowPointcut.java | 45 +++++-------------- 5 files changed, 33 insertions(+), 40 deletions(-) diff --git a/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java b/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java index 3ff7d75aa..783bacbb5 100644 --- a/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java +++ b/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java @@ -14,8 +14,10 @@ package org.aspectj.weaver; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.Hashtable; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import org.aspectj.weaver.bcel.BcelAdvice; @@ -71,6 +73,10 @@ public class CrosscuttingMembers { this.shouldConcretizeIfNeeded = shouldConcretizeIfNeeded; } + + private Hashtable cflowFields = new Hashtable(); + private Hashtable cflowBelowFields = new Hashtable(); + // public void addConcreteShadowMungers(Collection c) { // shadowMungers.addAll(c); // } @@ -502,4 +508,17 @@ public class CrosscuttingMembers { return declareAnnotationsOnMethods; } + public Map getCflowBelowFields() { + return cflowBelowFields; + } + + public Map getCflowFields() { + return cflowFields; + } + + public void clearCaches() { + cflowFields.clear(); + cflowBelowFields.clear(); + } + } diff --git a/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java b/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java index 55d46b642..a57bbf0ac 100644 --- a/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java +++ b/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java @@ -78,13 +78,10 @@ public class CrosscuttingMembersSet { if (xcut == null) { members.put(aspectType, aspectType.collectCrosscuttingMembers(inWeavingPhase)); clearCaches(); - CflowPointcut.clearCaches(aspectType); change = true; } else { if (xcut.replaceWith(aspectType.collectCrosscuttingMembers(inWeavingPhase),inWeavingPhase)) { clearCaches(); - - CflowPointcut.clearCaches(aspectType); change = true; } else { if (!AsmManager.getDefault().getHandleProvider().dependsOnLocation() diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelCflowCounterFieldAdder.java b/weaver/src/org/aspectj/weaver/bcel/BcelCflowCounterFieldAdder.java index ceb471cf5..558a98b64 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelCflowCounterFieldAdder.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelCflowCounterFieldAdder.java @@ -88,5 +88,9 @@ public class BcelCflowCounterFieldAdder extends BcelTypeMunger { public boolean existsToSupportShadowMunging() { return true; } + + public String toString() { + return "(BcelTypeMunger: CflowField "+cflowCounterField.getDeclaringType().getName()+" "+cflowCounterField.getName()+")"; + } } diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java index 62c53629c..820ff77c4 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java @@ -470,8 +470,6 @@ public class BcelWeaver implements IWeaver { public void prepareForWeave() { if (trace.isTraceEnabled()) trace.enter("prepareForWeave",this); needToReweaveWorld = xcutSet.hasChangedSinceLastReset(); - - CflowPointcut.clearCaches(); // update mungers for (Iterator i = addedClasses.iterator(); i.hasNext(); ) { diff --git a/weaver/src/org/aspectj/weaver/patterns/CflowPointcut.java b/weaver/src/org/aspectj/weaver/patterns/CflowPointcut.java index 1229cd473..887b5ac00 100644 --- a/weaver/src/org/aspectj/weaver/patterns/CflowPointcut.java +++ b/weaver/src/org/aspectj/weaver/patterns/CflowPointcut.java @@ -50,8 +50,6 @@ public class CflowPointcut extends Pointcut { boolean isBelow;// Is this cflowbelow? private int[] freeVars; - private static Hashtable cflowFields = new Hashtable(); - private static Hashtable cflowBelowFields = new Hashtable(); /** * Used to indicate that we're in the context of a cflow when concretizing if's @@ -217,7 +215,7 @@ public class CflowPointcut extends Pointcut { if (freeVars==null || freeVars.length == 0) { // No state, so don't use a stack, use a counter. ResolvedMember localCflowField = null; - Object field = getCflowfield(concreteEntry,concreteAspect,"counter"); + Object field = getCflowfield(xcut, concreteEntry, concreteAspect, "counter"); // Check if we have already got a counter for this cflow pointcut if (field != null) { @@ -236,7 +234,7 @@ public class CflowPointcut extends Pointcut { concreteAspect.crosscuttingMembers.addConcreteShadowMunger( Advice.makeCflowEntry(world,concreteEntry,isBelow,localCflowField,freeVars==null?0:freeVars.length,innerCflowEntries,inAspect)); - putCflowfield(concreteEntry,concreteAspect,localCflowField,"counter"); // Remember it + putCflowfield(xcut,concreteEntry,concreteAspect,localCflowField,"counter"); // Remember it } Pointcut ret = new ConcreteCflowPointcut(localCflowField, null,true); @@ -276,7 +274,7 @@ public class CflowPointcut extends Pointcut { slots.add(slot); } ResolvedMember localCflowField = null; - Object field = getCflowfield(concreteEntry,concreteAspect,"stack"); + Object field = getCflowfield(xcut,concreteEntry,concreteAspect,"stack"); if (field != null) { localCflowField = (ResolvedMember)field; } else { @@ -295,7 +293,7 @@ public class CflowPointcut extends Pointcut { concreteAspect.crosscuttingMembers.addTypeMunger( world.makeCflowStackFieldAdder(localCflowField)); - putCflowfield(concreteEntry,concreteAspect,localCflowField,"stack"); + putCflowfield(xcut,concreteEntry,concreteAspect,localCflowField,"stack"); } Pointcut ret = new ConcreteCflowPointcut(localCflowField, slots,false); ret.copyLocationFrom(this); @@ -304,10 +302,6 @@ public class CflowPointcut extends Pointcut { } - public static void clearCaches() { - cflowFields.clear(); - cflowBelowFields.clear(); - } private String getKey(Pointcut p,ResolvedType a,String stackOrCounter) { StringBuffer sb = new StringBuffer(); @@ -319,22 +313,22 @@ public class CflowPointcut extends Pointcut { return sb.toString(); } - private Object getCflowfield(Pointcut pcutkey, ResolvedType concreteAspect,String stackOrCounter) { + private Object getCflowfield(CrosscuttingMembers xcut, Pointcut pcutkey, ResolvedType concreteAspect,String stackOrCounter) { String key = getKey(pcutkey,concreteAspect,stackOrCounter); Object o =null; - if (isBelow) o = cflowBelowFields.get(key); - else o = cflowFields.get(key); + if (isBelow) o = xcut.getCflowBelowFields().get(key); + else o = xcut.getCflowFields().get(key); //System.err.println("Retrieving for key "+key+" returning "+o); return o; } - private void putCflowfield(Pointcut pcutkey,ResolvedType concreteAspect,Object o,String stackOrCounter) { + private void putCflowfield(CrosscuttingMembers xcut, Pointcut pcutkey,ResolvedType concreteAspect,Object o,String stackOrCounter) { String key = getKey(pcutkey,concreteAspect,stackOrCounter); //System.err.println("Storing cflow field for key"+key); if (isBelow) { - cflowBelowFields.put(key,o); + xcut.getCflowBelowFields().put(key,o); } else { - cflowFields.put(key,o); + xcut.getCflowFields().put(key,o); } } @@ -342,23 +336,4 @@ public class CflowPointcut extends Pointcut { return visitor.visit(this, data); } - public static void clearCaches(ResolvedType aspectType) { - //System.err.println("Wiping entries starting "+aspectType.getName()); - String key = aspectType.getName()+"::"; - wipeKeys(key,cflowFields); - wipeKeys(key,cflowBelowFields); - } - - private static void wipeKeys(String keyPrefix,Hashtable ht) { - Enumeration keys = ht.keys(); - List forRemoval = new ArrayList(); - while (keys.hasMoreElements()) { - String s = (String)keys.nextElement(); - if (s.startsWith(keyPrefix)) forRemoval.add(s); - } - for (Iterator iter = forRemoval.iterator(); iter.hasNext();) { - String element = (String) iter.next(); - ht.remove(element); - } - } } -- 2.39.5