aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2008-05-27 18:50:19 +0000
committeraclement <aclement>2008-05-27 18:50:19 +0000
commit804d34e3224c14414d34c2fba8b9bf5c99f6483c (patch)
tree7e3ae79c0f2145baf162764635a23e3b02e7b817
parentd9676664596aa81eca5b32967213257afbc09a34 (diff)
downloadaspectj-804d34e3224c14414d34c2fba8b9bf5c99f6483c.tar.gz
aspectj-804d34e3224c14414d34c2fba8b9bf5c99f6483c.zip
210470: preventing weaver leaks: use a weak classloader ref
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelWorld.java24
1 files changed, 15 insertions, 9 deletions
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java b/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
index a5ac53aef..2f1aaa09d 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
@@ -46,6 +46,7 @@ import org.aspectj.apache.bcel.generic.NEWARRAY;
import org.aspectj.apache.bcel.generic.ObjectType;
import org.aspectj.apache.bcel.generic.PUTSTATIC;
import org.aspectj.apache.bcel.generic.Type;
+import org.aspectj.apache.bcel.util.ClassLoaderReference;
import org.aspectj.apache.bcel.util.ClassLoaderRepository;
import org.aspectj.apache.bcel.util.ClassPath;
import org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository;
@@ -69,6 +70,7 @@ import org.aspectj.weaver.ResolvedMemberImpl;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.ResolvedTypeMunger;
import org.aspectj.weaver.UnresolvedType;
+import org.aspectj.weaver.WeakClassLoaderReference;
import org.aspectj.weaver.World;
import org.aspectj.weaver.AjAttribute.Aspect;
import org.aspectj.weaver.patterns.DeclareAnnotation;
@@ -84,7 +86,7 @@ public class BcelWorld extends World implements Repository {
private ClassPathManager classPath;
protected Repository delegate;
- private ClassLoader loader;
+ private WeakClassLoaderReference loaderRef;
//private ClassPathManager aspectPath = null;
@@ -153,7 +155,7 @@ public class BcelWorld extends World implements Repository {
*/
public BcelWorld(ClassLoader loader, IMessageHandler handler, ICrossReferenceHandler xrefHandler) {
this.classPath = null;
- this.loader = loader;
+ this.loaderRef = new WeakClassLoaderReference(loader);
setMessageHandler(handler);
setCrossReferenceHandler(xrefHandler);
// Tell BCEL to use us for resolving any classes
@@ -162,16 +164,20 @@ public class BcelWorld extends World implements Repository {
public void ensureRepositorySetup() {
if (delegate==null) {
- delegate = getClassLoaderRepositoryFor(loader);
+ delegate = getClassLoaderRepositoryFor(loaderRef);
}
}
- public Repository getClassLoaderRepositoryFor(ClassLoader loader) {
- if (bcelRepositoryCaching) {
- return new ClassLoaderRepository(loader);
- } else {
- return new NonCachingClassLoaderRepository(loader);
- }
+ private ClassLoader getClassLoader() {
+ return loaderRef.getClassLoader();
+ }
+
+ public Repository getClassLoaderRepositoryFor(ClassLoaderReference loader) {
+ if (bcelRepositoryCaching) {
+ return new ClassLoaderRepository(loader);
+ } else {
+ return new NonCachingClassLoaderRepository(loader);
+ }
}
public void addPath (String name) {