]> source.dussan.org Git - aspectj.git/commitdiff
210470: preventing weaver leaks: use a weak classloader ref
authoraclement <aclement>
Tue, 27 May 2008 18:50:19 +0000 (18:50 +0000)
committeraclement <aclement>
Tue, 27 May 2008 18:50:19 +0000 (18:50 +0000)
weaver/src/org/aspectj/weaver/bcel/BcelWorld.java

index a5ac53aef35178b8c574e228bb9abb4e3d67a211..2f1aaa09dc081881e4ea0fa587a0ad50d2de4c55 100644 (file)
@@ -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) {