Remove "root" from MemoKey

This was just wrong in the new setup; we change the root constantly.
The MemoKey should be per-conceptual-resolve which is per-ResolveContext,
not per-root.

This commit fixes the tests in which we failed to memoize
and thus got different results for the same ConfigReference
at different times in the resolution process.

But it breaks ConfigSubstitutionTest.avoidDelayedMergeObjectResolveProblem5.
This commit is contained in:
Havoc Pennington 2014-10-22 14:24:33 -04:00
parent 1a65f861b2
commit c3325a8966
2 changed files with 3 additions and 8 deletions

View File

@ -2,20 +2,17 @@ package com.typesafe.config.impl;
/** The key used to memoize already-traversed nodes when resolving substitutions */ /** The key used to memoize already-traversed nodes when resolving substitutions */
final class MemoKey { final class MemoKey {
MemoKey(AbstractConfigValue root, AbstractConfigValue value, Path restrictToChildOrNull) { MemoKey(AbstractConfigValue value, Path restrictToChildOrNull) {
this.root = root;
this.value = value; this.value = value;
this.restrictToChildOrNull = restrictToChildOrNull; this.restrictToChildOrNull = restrictToChildOrNull;
} }
final private AbstractConfigValue root;
final private AbstractConfigValue value; final private AbstractConfigValue value;
final private Path restrictToChildOrNull; final private Path restrictToChildOrNull;
@Override @Override
public final int hashCode() { public final int hashCode() {
int h = System.identityHashCode(value); int h = System.identityHashCode(value);
h = h + 41 * (41 + root.hashCode());
if (restrictToChildOrNull != null) { if (restrictToChildOrNull != null) {
return h + 41 * (41 + restrictToChildOrNull.hashCode()); return h + 41 * (41 + restrictToChildOrNull.hashCode());
} else { } else {
@ -29,8 +26,6 @@ final class MemoKey {
MemoKey o = (MemoKey) other; MemoKey o = (MemoKey) other;
if (o.value != this.value) if (o.value != this.value)
return false; return false;
else if (o.root != this.root)
return false;
else if (o.restrictToChildOrNull == this.restrictToChildOrNull) else if (o.restrictToChildOrNull == this.restrictToChildOrNull)
return true; return true;
else if (o.restrictToChildOrNull == null || this.restrictToChildOrNull == null) else if (o.restrictToChildOrNull == null || this.restrictToChildOrNull == null)

View File

@ -146,7 +146,7 @@ final class ResolveContext {
throws NotPossibleToResolve { throws NotPossibleToResolve {
// a fully-resolved (no restrictToChild) object can satisfy a // a fully-resolved (no restrictToChild) object can satisfy a
// request for a restricted object, so always check that first. // request for a restricted object, so always check that first.
final MemoKey fullKey = new MemoKey(source.root, original, null); final MemoKey fullKey = new MemoKey(original, null);
MemoKey restrictedKey = null; MemoKey restrictedKey = null;
AbstractConfigValue cached = memos.get(fullKey); AbstractConfigValue cached = memos.get(fullKey);
@ -155,7 +155,7 @@ final class ResolveContext {
// compute the restrictToChild object so use a more limited // compute the restrictToChild object so use a more limited
// memo key // memo key
if (cached == null && isRestrictedToChild()) { if (cached == null && isRestrictedToChild()) {
restrictedKey = new MemoKey(source.root, original, restrictToChild()); restrictedKey = new MemoKey(original, restrictToChild());
cached = memos.get(restrictedKey); cached = memos.get(restrictedKey);
} }