REPL: sanitize stack traces
Don't include our compiler's and preloader's internal code, reflection, native methods etc. Also delete "substring" matching logic from tests
This commit is contained in:
@@ -276,7 +276,7 @@ public class ReplInterpreter {
|
||||
scriptInstance = scriptInstanceConstructor.newInstance(constructorArgs);
|
||||
}
|
||||
catch (Throwable e) {
|
||||
return LineResult.error(Throwables.getStackTraceAsString(e.getCause()));
|
||||
return LineResult.error(renderStackTrace(e.getCause()));
|
||||
}
|
||||
Field rvField = scriptClass.getDeclaredField("rv");
|
||||
rvField.setAccessible(true);
|
||||
@@ -295,6 +295,27 @@ public class ReplInterpreter {
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String renderStackTrace(@NotNull Throwable cause) {
|
||||
StackTraceElement[] oldTrace = cause.getStackTrace();
|
||||
List<StackTraceElement> newTrace = new ArrayList<StackTraceElement>();
|
||||
boolean skip = true;
|
||||
for (int i = oldTrace.length - 1; i >= 0; i--) {
|
||||
StackTraceElement element = oldTrace[i];
|
||||
// All our code happens in the script constructor, and no reflection/native code happens in constructors.
|
||||
// So we ignore everything in the stack trace until the first constructor
|
||||
if (element.getMethodName().equals("<init>")) {
|
||||
skip = false;
|
||||
}
|
||||
if (!skip) {
|
||||
newTrace.add(element);
|
||||
}
|
||||
}
|
||||
Collections.reverse(newTrace);
|
||||
cause.setStackTrace(newTrace.toArray(new StackTraceElement[newTrace.size()]));
|
||||
return Throwables.getStackTraceAsString(cause);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private ScriptDescriptor doAnalyze(@NotNull JetFile psiFile, @NotNull MessageCollector messageCollector) {
|
||||
WritableScope scope = new WritableScopeImpl(
|
||||
|
||||
Reference in New Issue
Block a user