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.Unit;
import kotlin.jvm.functions.Function0; import kotlin.jvm.functions.Function0;
import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function1;
import kotlin.text.StringsKt;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt; import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
@@ -32,6 +33,8 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
public class LockBasedStorageManager implements StorageManager { public class LockBasedStorageManager implements StorageManager {
private static final String PACKAGE_NAME = StringsKt.substringBeforeLast(LockBasedStorageManager.class.getCanonicalName(), ".", "");
public interface ExceptionHandlingStrategy { public interface ExceptionHandlingStrategy {
ExceptionHandlingStrategy THROW = new ExceptionHandlingStrategy() { ExceptionHandlingStrategy THROW = new ExceptionHandlingStrategy() {
@NotNull @NotNull
@@ -480,14 +483,13 @@ public class LockBasedStorageManager implements StorageManager {
@NotNull @NotNull
private static <T extends Throwable> T sanitizeStackTrace(@NotNull T throwable) { private static <T extends Throwable> T sanitizeStackTrace(@NotNull T throwable) {
String storagePackageName = LockBasedStorageManager.class.getPackage().getName();
StackTraceElement[] stackTrace = throwable.getStackTrace(); StackTraceElement[] stackTrace = throwable.getStackTrace();
int size = stackTrace.length; int size = stackTrace.length;
int firstNonStorage = -1; int firstNonStorage = -1;
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
// Skip everything (memoized functions and lazy values) from package org.jetbrains.kotlin.storage // 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; firstNonStorage = i;
break; break;
} }