diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java index 7aad3cef67e..9a47f18dc8c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java @@ -86,7 +86,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade { final PsiClassFinder psiClassFinder = injector.getPsiClassFinder(); // TODO: Replace with stub declaration provider - LockBasedStorageManager storageManager = new LockBasedStorageManager(); + LockBasedStorageManager storageManager = LockBasedStorageManager.create(); FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(storageManager, files, new Predicate() { @Override public boolean apply(FqName fqName) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/LockBasedStorageManager.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/LockBasedStorageManager.java index 28f641d2a9e..4b27a2a2883 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/LockBasedStorageManager.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/LockBasedStorageManager.java @@ -37,6 +37,13 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class LockBasedStorageManager implements StorageManager { + public static LockBasedStorageManager create() { + return new LockBasedStorageManager(true); + } + + public static LockBasedStorageManager createWithoutExceptionMemoization() { + return new LockBasedStorageManager(false); + } private final Object lock = new Object() { @Override @@ -45,13 +52,19 @@ public class LockBasedStorageManager implements StorageManager { } }; + private final boolean memoizeExceptions; + + private LockBasedStorageManager(boolean memoizeExceptions) { + this.memoizeExceptions = memoizeExceptions; + } + @NotNull @Override public MemoizedFunctionToNotNull createMemoizedFunction( @NotNull Function compute, @NotNull ReferenceKind valuesReferenceKind ) { ConcurrentMap map = createConcurrentMap(valuesReferenceKind); - return new MapBasedMemoizedFunctionToNotNull(lock, map, compute); + return new MapBasedMemoizedFunctionToNotNull(lock, map, compute, memoizeExceptions); } @NotNull @@ -60,7 +73,7 @@ public class LockBasedStorageManager implements StorageManager { @NotNull Function compute, @NotNull ReferenceKind valuesReferenceKind ) { ConcurrentMap map = createConcurrentMap(valuesReferenceKind); - return new MapBasedMemoizedFunction(lock, map, compute); + return new MapBasedMemoizedFunction(lock, map, compute, memoizeExceptions); } private static ConcurrentMap createConcurrentMap(ReferenceKind referenceKind) { @@ -70,13 +83,13 @@ public class LockBasedStorageManager implements StorageManager { @NotNull @Override public NotNullLazyValue createLazyValue(@NotNull Computable computable) { - return new LockBasedNotNullLazyValue(lock, computable); + return new LockBasedNotNullLazyValue(lock, computable, memoizeExceptions); } @NotNull @Override public NotNullLazyValue createLazyValueWithPostCompute(@NotNull Computable computable, @NotNull final Consumer postCompute) { - return new LockBasedNotNullLazyValue(lock, computable) { + return new LockBasedNotNullLazyValue(lock, computable, memoizeExceptions) { @Override protected void postCompute(@NotNull T value) { postCompute.consume(value); @@ -87,7 +100,7 @@ public class LockBasedStorageManager implements StorageManager { @NotNull @Override public NullableLazyValue createNullableLazyValue(@NotNull Computable computable) { - return new LockBasedLazyValue(lock, computable); + return new LockBasedLazyValue(lock, computable, memoizeExceptions); } @NotNull @@ -95,7 +108,7 @@ public class LockBasedStorageManager implements StorageManager { public NullableLazyValue createNullableLazyValueWithPostCompute( @NotNull Computable computable, @NotNull final Consumer postCompute ) { - return new LockBasedLazyValue(lock, computable) { + return new LockBasedLazyValue(lock, computable, memoizeExceptions) { @Override protected void postCompute(@Nullable T value) { postCompute.consume(value); @@ -121,13 +134,15 @@ public class LockBasedStorageManager implements StorageManager { private static class LockBasedLazyValue implements NullableLazyValue { private final Object lock; private final Computable computable; + private final boolean memoizeExceptions; @Nullable private volatile Object value = null; - public LockBasedLazyValue(@NotNull Object lock, @NotNull Computable computable) { + public LockBasedLazyValue(@NotNull Object lock, @NotNull Computable computable, boolean memoizeExceptions) { this.lock = lock; this.computable = computable; + this.memoizeExceptions = memoizeExceptions; } @Override @@ -146,7 +161,9 @@ public class LockBasedStorageManager implements StorageManager { return typedValue; } catch (Throwable throwable) { - value = WrappedValues.escapeThrowable(throwable); + if (memoizeExceptions) { + value = WrappedValues.escapeThrowable(throwable); + } throw ExceptionUtils.rethrow(throwable); } } @@ -159,8 +176,8 @@ public class LockBasedStorageManager implements StorageManager { private static class LockBasedNotNullLazyValue extends LockBasedLazyValue implements NotNullLazyValue { - public LockBasedNotNullLazyValue(@NotNull Object lock, @NotNull Computable computable) { - super(lock, computable); + public LockBasedNotNullLazyValue(@NotNull Object lock, @NotNull Computable computable, boolean memoizeExceptions) { + super(lock, computable, memoizeExceptions); } @Override @@ -176,11 +193,15 @@ public class LockBasedStorageManager implements StorageManager { private final Object lock; private final ConcurrentMap cache; private final Function compute; + private final boolean memoizeExceptions; - public MapBasedMemoizedFunction(@NotNull Object lock, @NotNull ConcurrentMap map, @NotNull Function compute) { + public MapBasedMemoizedFunction( + @NotNull Object lock, @NotNull ConcurrentMap map, + @NotNull Function compute, boolean memoizeExceptions) { this.lock = lock; this.cache = map; this.compute = compute; + this.memoizeExceptions = memoizeExceptions; } @Override @@ -201,8 +222,10 @@ public class LockBasedStorageManager implements StorageManager { return typedValue; } catch (Throwable throwable) { - Object oldValue = cache.put(input, WrappedValues.escapeThrowable(throwable)); - assert oldValue == null : "Race condition detected"; + if (memoizeExceptions) { + Object oldValue = cache.put(input, WrappedValues.escapeThrowable(throwable)); + assert oldValue == null : "Race condition detected"; + } throw ExceptionUtils.rethrow(throwable); } @@ -215,9 +238,10 @@ public class LockBasedStorageManager implements StorageManager { public MapBasedMemoizedFunctionToNotNull( @NotNull Object lock, @NotNull ConcurrentMap map, - @NotNull Function compute + @NotNull Function compute, + boolean memoizeExceptions ) { - super(lock, map, compute); + super(lock, map, compute, memoizeExceptions); } @NotNull @@ -324,5 +348,4 @@ public class LockBasedStorageManager implements StorageManager { } } } - } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java index 9e933fcba18..9b1d1f7abe3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java @@ -238,7 +238,10 @@ public class KotlinBuiltIns { @NotNull private KotlinCodeAnalyzer createLazyResolveSession(@NotNull Project project) throws IOException { List files = loadResourcesAsJetFiles(project, LIBRARY_FILES); - LockBasedStorageManager storageManager = new LockBasedStorageManager(); + + // As builtins resolve session is never recreated, we don't want it be corrupted forever with stored exceptions + LockBasedStorageManager storageManager = LockBasedStorageManager.createWithoutExceptionMemoization(); + return new ResolveSession( project, storageManager, diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveDescriptorRendererTest.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveDescriptorRendererTest.java index 38e498dbb58..8d0c5a5dda2 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveDescriptorRendererTest.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveDescriptorRendererTest.java @@ -56,7 +56,7 @@ public abstract class AbstractLazyResolveDescriptorRendererTest extends KotlinTe ModuleDescriptorImpl lazyModule = AnalyzerFacadeForJVM.createJavaModule(""); lazyModule.setModuleConfiguration(injectorForTopDownAnalyzer.getModuleDescriptor().getModuleConfiguration()); - LockBasedStorageManager storageManager = new LockBasedStorageManager(); + LockBasedStorageManager storageManager = LockBasedStorageManager.create(); final ResolveSession resolveSession = new ResolveSession(getProject(), storageManager, lazyModule, new FileBasedDeclarationProviderFactory(storageManager, files)); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java index 493e45c8cd9..db94115e40e 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java @@ -100,7 +100,7 @@ public class LazyResolveTestUtil { final JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); - LockBasedStorageManager storageManager = new LockBasedStorageManager(); + LockBasedStorageManager storageManager = LockBasedStorageManager.create(); FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(storageManager, files, new Predicate() { @Override public boolean apply(FqName fqName) { diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index e81aa42ffc6..1c0104d40ea 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -214,7 +214,7 @@ public class JetSourceNavigationHelper { } Project project = decompiledDeclaration.getProject(); - LockBasedStorageManager storageManager = new LockBasedStorageManager(); + LockBasedStorageManager storageManager = LockBasedStorageManager.create(); FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(storageManager, getContainingFiles(candidates), new Predicate() { @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java index 295203e5d01..31f7248552c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java +++ b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java @@ -140,7 +140,7 @@ public final class AnalyzerFacadeForJS { @NotNull public static ResolveSession getLazyResolveSession(Collection files, Config config) { - LockBasedStorageManager storageManager = new LockBasedStorageManager(); + LockBasedStorageManager storageManager = LockBasedStorageManager.create(); FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory( storageManager, Config.withJsLibAdded(files, config), Predicates.alwaysFalse()); ModuleDescriptorImpl lazyModule = createJsModule("");