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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user