From 9fd698db36f4901db9bac5b6a28714a2d3c5c389 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 13 Sep 2016 15:17:12 +0300 Subject: [PATCH] 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. --- .../jetbrains/kotlin/storage/LockBasedStorageManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/util.runtime/src/org/jetbrains/kotlin/storage/LockBasedStorageManager.java b/core/util.runtime/src/org/jetbrains/kotlin/storage/LockBasedStorageManager.java index 78f4abaa135..bb6cf36c67f 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/storage/LockBasedStorageManager.java +++ b/core/util.runtime/src/org/jetbrains/kotlin/storage/LockBasedStorageManager.java @@ -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 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; }