Repository: groovy Updated Branches: refs/heads/GROOVY_2_6_X 37684df11 -> 68cb66086
Refine StubCache for better performance (cherry picked from commit bd1b3bc) Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/68cb6608 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/68cb6608 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/68cb6608 Branch: refs/heads/GROOVY_2_6_X Commit: 68cb66086b43a25e1251178a4b4db995252bd491 Parents: 37684df Author: sunlan <[email protected]> Authored: Sat Dec 2 01:31:33 2017 +0800 Committer: sunlan <[email protected]> Committed: Sat Dec 2 02:48:55 2017 +0800 ---------------------------------------------------------------------- .../groovy/ast/decompiled/AsmDecompiler.java | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/68cb6608/src/main/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java b/src/main/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java index df7ca54..933f1b5 100644 --- a/src/main/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java +++ b/src/main/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java @@ -18,6 +18,7 @@ */ package org.codehaus.groovy.ast.decompiled; +import groovy.lang.GroovyRuntimeException; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -30,12 +31,14 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * A utility class responsible for decompiling JVM class files and producing {@link ClassStub} objects reflecting their structure. @@ -46,12 +49,12 @@ public abstract class AsmDecompiler { private static class StubCache { /** - * Caches stubs per URL. This cache is useful when performing multiple compilations in the same JVM/class loader and in tests. + * Caches stubs per URI. This cache is useful when performing multiple compilations in the same JVM/class loader and in tests. * * It's synchronized "just in case". Occasional misses are expected if several threads attempt to load the same class, * but this shouldn't result in serious memory issues. */ - static final Map<URL, SoftReference<ClassStub>> map = Collections.synchronizedMap(new HashMap<URL, SoftReference<ClassStub>>()); + static final Map<URI, SoftReference<ClassStub>> map = new ConcurrentHashMap<URI, SoftReference<ClassStub>>(); // According to http://michaelscharf.blogspot.jp/2006/11/javaneturlequals-and-hashcode-make.html, use java.net.URI instead. } /** @@ -63,7 +66,14 @@ public abstract class AsmDecompiler { * @throws IOException if reading from this URL is impossible */ public static ClassStub parseClass(URL url) throws IOException { - SoftReference<ClassStub> ref = StubCache.map.get(url); + URI uri; + try { + uri = url.toURI(); + } catch (URISyntaxException e) { + throw new GroovyRuntimeException(e); + } + + SoftReference<ClassStub> ref = StubCache.map.get(uri); ClassStub stub = ref == null ? null : ref.get(); if (stub == null) { DecompilingVisitor visitor = new DecompilingVisitor(); @@ -74,7 +84,7 @@ public abstract class AsmDecompiler { stream.close(); } stub = visitor.result; - StubCache.map.put(url, new SoftReference<ClassStub>(stub)); + StubCache.map.put(uri, new SoftReference<ClassStub>(stub)); } return stub; }
