GROOVY-7646: remove classes via InvokerHelper when closing the GroovyClassLoader or flushing its cache (closes #445)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/4ea1207f Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/4ea1207f Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/4ea1207f Branch: refs/heads/parrot Commit: 4ea1207f21b93a15dbcca17538c379721d9217de Parents: d4eadc4 Author: Jochen Berger <foober...@gmail.com> Authored: Mon Oct 10 11:40:53 2016 +0200 Committer: John Wagenleitner <jwagenleit...@apache.org> Committed: Tue Oct 11 19:41:36 2016 -0700 ---------------------------------------------------------------------- src/main/groovy/lang/GroovyClassLoader.java | 10 ++++++++++ 1 file changed, 10 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/4ea1207f/src/main/groovy/lang/GroovyClassLoader.java ---------------------------------------------------------------------- diff --git a/src/main/groovy/lang/GroovyClassLoader.java b/src/main/groovy/lang/GroovyClassLoader.java index ac1f9f9..c75bb2f 100644 --- a/src/main/groovy/lang/GroovyClassLoader.java +++ b/src/main/groovy/lang/GroovyClassLoader.java @@ -34,6 +34,7 @@ import org.codehaus.groovy.ast.expr.ConstantExpression; import org.codehaus.groovy.classgen.GeneratorContext; import org.codehaus.groovy.classgen.Verifier; import org.codehaus.groovy.control.*; +import org.codehaus.groovy.runtime.InvokerHelper; import org.codehaus.groovy.runtime.IOGroovyMethods; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; @@ -969,6 +970,9 @@ public class GroovyClassLoader extends URLClassLoader { */ public void clearCache() { synchronized (classCache) { + for (Class cl : classCache.values()) { + InvokerHelper.removeClass(cl); + } classCache.clear(); } synchronized (sourceCache) { @@ -976,6 +980,12 @@ public class GroovyClassLoader extends URLClassLoader { } } + @Override + public void close() throws IOException { + super.close(); + clearCache(); + } + private static class TimestampAdder extends CompilationUnit.PrimaryClassNodeOperation implements Opcodes { private final static TimestampAdder INSTANCE = new TimestampAdder();