Fix NPE in StorageManager on sanitizing stack trace

This could happen when running the compiler from the command line, where
MemoryBasedClassLoader is used which does not ever create Package instances.
This commit is contained in:
Alexander Udalov
2016-09-13 15:17:12 +03:00
parent 17137f1c4f
commit 9fd698db36
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.storage;
import kotlin.Unit;
import kotlin.jvm.functions.Function0;
import kotlin.jvm.functions.Function1;
import kotlin.text.StringsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
@@ -32,6 +33,8 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockBasedStorageManager implements StorageManager {
private static final String PACKAGE_NAME = StringsKt.substringBeforeLast(LockBasedStorageManager.class.getCanonicalName(), ".", "");
public interface ExceptionHandlingStrategy {
ExceptionHandlingStrategy THROW = new ExceptionHandlingStrategy() {
@NotNull
@@ -480,14 +483,13 @@ public class LockBasedStorageManager implements StorageManager {
@NotNull
private static <T extends Throwable> T sanitizeStackTrace(@NotNull T throwable) {
String storagePackageName = LockBasedStorageManager.class.getPackage().getName();
StackTraceElement[] stackTrace = throwable.getStackTrace();
int size = stackTrace.length;
int firstNonStorage = -1;
for (int i = 0; i < size; i++) {
// Skip everything (memoized functions and lazy values) from package org.jetbrains.kotlin.storage
if (!stackTrace[i].getClassName().startsWith(storagePackageName)) {
if (!stackTrace[i].getClassName().startsWith(PACKAGE_NAME)) {
firstNonStorage = i;
break;
}