Repository: groovy
Updated Branches:
  refs/heads/master b93529ed2 -> b7be8be77


Minor refactoring: implement ExtensionMethodCache based on CommonCache


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/b7be8be7
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/b7be8be7
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/b7be8be7

Branch: refs/heads/master
Commit: b7be8be774481d5e093e14b2ec6a99b156a55ea1
Parents: b93529e
Author: sunlan <[email protected]>
Authored: Sun Dec 10 21:39:09 2017 +0800
Committer: sunlan <[email protected]>
Committed: Sun Dec 10 21:39:09 2017 +0800

----------------------------------------------------------------------
 .../stc/StaticTypeCheckingSupport.java          | 67 +++++++++-----------
 1 file changed, 30 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/b7be8be7/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
----------------------------------------------------------------------
diff --git 
a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java 
b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 578f0b9..1090125 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -46,13 +46,14 @@ import 
org.codehaus.groovy.runtime.DefaultGroovyStaticMethods;
 import org.codehaus.groovy.runtime.m12n.ExtensionModule;
 import org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner;
 import org.codehaus.groovy.runtime.m12n.MetaInfExtensionModule;
+import org.codehaus.groovy.runtime.memoize.CommonCache;
+import org.codehaus.groovy.runtime.memoize.EvictableCache;
 import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl;
 import org.codehaus.groovy.tools.GroovyClass;
 import org.codehaus.groovy.transform.trait.Traits;
 import org.codehaus.groovy.vmplugin.VMPluginFactory;
 import org.objectweb.asm.Opcodes;
 
-import java.lang.ref.WeakReference;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -68,7 +69,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.UUID;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.WeakHashMap;
 import java.util.regex.Matcher;
 
 import static org.codehaus.groovy.ast.ClassHelper.BigDecimal_TYPE;
@@ -2159,46 +2160,38 @@ public abstract class StaticTypeCheckingSupport {
      * collect the list of extension methods (see {@link ExtensionModule} if 
the list of
      * extension modules has changed. It avoids recomputing the whole list 
each time we perform
      * a method lookup.
-     * TODO reuse {@link org.codehaus.groovy.runtime.memoize.CommonCache}
      */
     private static class ExtensionMethodCache {
-
-        private final ReentrantReadWriteLock lock = new 
ReentrantReadWriteLock();
-        private Map<String, List<MethodNode>> cachedMethods = null;
-        private WeakReference<ClassLoader> origin = new 
WeakReference<ClassLoader>(null);
+        private final CommonCache<ClassLoader, Map<String, List<MethodNode>>> 
cache = new CommonCache<ClassLoader, Map<String, List<MethodNode>>>(new 
WeakHashMap<>());
 
         public Map<String, List<MethodNode>> getExtensionMethods(ClassLoader 
loader) {
-            lock.readLock().lock();
-            if (loader!=origin.get()) {
-                lock.readLock().unlock();
-                lock.writeLock().lock();
-                try {
-                    final List<ExtensionModule> modules = new 
LinkedList<ExtensionModule>();
-                    ExtensionModuleScanner scanner = new 
ExtensionModuleScanner(new ExtensionModuleScanner.ExtensionModuleListener() {
-                        public void onModule(final ExtensionModule module) {
-                            boolean skip = false;
-                            for (ExtensionModule extensionModule : modules) {
-                                if 
(extensionModule.getName().equals(module.getName())) {
-                                    skip = true;
-                                    break;
-                                }
-                            }
-                            if (!skip) modules.add(module);
+            return cache.getAndPut(
+                    loader,
+                    new EvictableCache.ValueProvider<ClassLoader, Map<String, 
List<MethodNode>>>() {
+                        @Override
+                        public Map<String, List<MethodNode>> provide(final 
ClassLoader key) {
+                            final List<ExtensionModule> modules = new 
LinkedList<ExtensionModule>();
+                            ExtensionModuleScanner scanner =
+                                    new ExtensionModuleScanner(
+                                            new 
ExtensionModuleScanner.ExtensionModuleListener() {
+                                                public void onModule(final 
ExtensionModule module) {
+                                                    boolean skip = false;
+                                                    for (ExtensionModule 
extensionModule : modules) {
+                                                        if 
(extensionModule.getName().equals(module.getName())) {
+                                                            skip = true;
+                                                            break;
+                                                        }
+                                                    }
+                                                    if (!skip) 
modules.add(module);
+                                                }
+                                            },
+                                            key
+                                    );
+                            scanner.scanClasspathModules();
+
+                            return getDGMMethods(modules);
                         }
-                    }, loader);
-                    scanner.scanClasspathModules();
-                    cachedMethods = getDGMMethods(modules);
-                    origin = new WeakReference<ClassLoader>(loader);
-                    lock.readLock().lock();
-                } finally {
-                    lock.writeLock().unlock();
-                }
-            }
-            try {
-                return Collections.unmodifiableMap(cachedMethods);
-            } finally {
-                lock.readLock().unlock();
-            }
+                    });
         }
 
         /**

Reply via email to