TypeCacheKey are different if hash codes are different

And this is very easy to check
This commit is contained in:
Nikolay Martynov 2020-02-21 12:23:41 -05:00
parent 9d7682f776
commit f736c425ff
1 changed files with 19 additions and 9 deletions

View File

@ -150,11 +150,15 @@ public class DDCachingPoolStrategy implements PoolStrategy {
@Override @Override
public boolean equals(final Object obj) { public boolean equals(final Object obj) {
if (!(obj instanceof TypeCacheKey)) return false; if (!(obj instanceof TypeCacheKey)) {
return false;
}
TypeCacheKey that = (TypeCacheKey) obj; final TypeCacheKey that = (TypeCacheKey) obj;
if (loaderHash != that.loaderHash) return false; if (hashCode != that.hashCode) {
return false;
}
// Fastpath loaderRef equivalence -- works because of WeakReference cache used // Fastpath loaderRef equivalence -- works because of WeakReference cache used
// Also covers the bootstrap null loaderRef case // Also covers the bootstrap null loaderRef case
@ -172,11 +176,15 @@ public class DDCachingPoolStrategy implements PoolStrategy {
// In this case, it is fine because that means the ClassLoader is no // In this case, it is fine because that means the ClassLoader is no
// longer live, so the entries will never match anyway and will fall // longer live, so the entries will never match anyway and will fall
// out of the cache. // out of the cache.
ClassLoader thisLoader = loaderRef.get(); final ClassLoader thisLoader = loaderRef.get();
if (thisLoader == null) return false; if (thisLoader == null) {
return false;
}
ClassLoader thatLoader = that.loaderRef.get(); final ClassLoader thatLoader = that.loaderRef.get();
if (thatLoader == null) return false; if (thatLoader == null) {
return false;
}
return (thisLoader == thatLoader); return (thisLoader == thatLoader);
} else { } else {
@ -205,9 +213,11 @@ public class DDCachingPoolStrategy implements PoolStrategy {
@Override @Override
public TypePool.Resolution find(final String className) { public TypePool.Resolution find(final String className) {
TypePool.Resolution existingResolution = final TypePool.Resolution existingResolution =
sharedResolutionCache.getIfPresent(new TypeCacheKey(loaderHash, loaderRef, className)); sharedResolutionCache.getIfPresent(new TypeCacheKey(loaderHash, loaderRef, className));
if (existingResolution != null) return existingResolution; if (existingResolution != null) {
return existingResolution;
}
if (OBJECT_NAME.equals(className)) { if (OBJECT_NAME.equals(className)) {
return OBJECT_RESOLUTION; return OBJECT_RESOLUTION;