diff --git a/compiler/tests/org/jetbrains/jet/storage/StorageManagerTest.java b/compiler/tests/org/jetbrains/jet/storage/StorageManagerTest.java index db4c727404f..2441ee59a56 100644 --- a/compiler/tests/org/jetbrains/jet/storage/StorageManagerTest.java +++ b/compiler/tests/org/jetbrains/jet/storage/StorageManagerTest.java @@ -426,6 +426,13 @@ public class StorageManagerTest extends TestCase { assertEquals(2, c.getCount()); } + // toString() + + public void testToString() throws Exception { + assertTrue("Should mention the setUp() method of this class: " + m.toString(), + m.toString().contains(getClass().getSimpleName() + ".setUp(")); + } + // Utilities private static Function0 apply(final Function1 f, final K x) { diff --git a/core/util.runtime/src/org/jetbrains/jet/storage/LockBasedStorageManager.java b/core/util.runtime/src/org/jetbrains/jet/storage/LockBasedStorageManager.java index e1b43ca026c..cf8f0e2c6f3 100644 --- a/core/util.runtime/src/org/jetbrains/jet/storage/LockBasedStorageManager.java +++ b/core/util.runtime/src/org/jetbrains/jet/storage/LockBasedStorageManager.java @@ -31,27 +31,36 @@ import java.util.concurrent.locks.ReentrantLock; public class LockBasedStorageManager implements StorageManager { - public static final StorageManager NO_LOCKS = new LockBasedStorageManager(NoLock.INSTANCE) { + public static final StorageManager NO_LOCKS = new LockBasedStorageManager("NO_LOCKS", NoLock.INSTANCE) { @NotNull @Override protected RecursionDetectedResult recursionDetectedDefault() { return RecursionDetectedResult.fallThrough(); } - - @Override - public String toString() { - return "NO_LOCKS"; - } }; protected final Lock lock; + private final String debugText; public LockBasedStorageManager() { - this(new ReentrantLock()); + this(getPointOfConstruction(), new ReentrantLock()); } - private LockBasedStorageManager(@NotNull Lock lock) { + private static String getPointOfConstruction() { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + // we need to skip frames for getStackTrace(), this method and the constructor that's calling it + if (trace.length <= 3) return ""; + return trace[3].toString(); + } + + private LockBasedStorageManager(@NotNull String debugText, @NotNull Lock lock) { this.lock = lock; + this.debugText = debugText; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()) + " (" + debugText + ')'; } @NotNull