Skip to content

Commit bea8337

Browse files
committed
Include the top of the stack StackTraceElement in the SystemStackError message
* Helpful to debug if the StackOverflowError happens in implementation code.
1 parent 9dc4b92 commit bea8337

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

src/main/java/org/truffleruby/core/exception/CoreExceptions.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,12 @@ public DynamicObject runtimeError(String fullMessage, Node currentNode, Throwabl
236236
@TruffleBoundary
237237
public DynamicObject systemStackErrorStackLevelTooDeep(Node currentNode, StackOverflowError javaThrowable) {
238238
DynamicObject exceptionClass = context.getCoreLibrary().getSystemStackErrorClass();
239-
return ExceptionOperations.createRubyException(context, exceptionClass, coreStrings().STACK_LEVEL_TOO_DEEP.createInstance(), currentNode, javaThrowable);
239+
StackTraceElement[] stackTrace = javaThrowable.getStackTrace();
240+
String topOfTheStack = stackTrace.length > 0 ? BacktraceFormatter.formatJava(stackTrace[0]) : "<empty Java stacktrace>";
241+
final String message = coreStrings().STACK_LEVEL_TOO_DEEP + "\n\tfrom " + topOfTheStack;
242+
return ExceptionOperations.createRubyException(context, exceptionClass,
243+
StringOperations.createString(context, StringOperations.encodeRope(message, UTF8Encoding.INSTANCE)),
244+
currentNode, javaThrowable);
240245
}
241246

242247
// NoMemoryError

src/main/java/org/truffleruby/language/backtrace/BacktraceFormatter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,11 @@ private String formatLineInternal(Activation[] activations, int n, DynamicObject
244244
return builder.toString();
245245
}
246246

247+
public static String formatJava(StackTraceElement stackTraceElement) {
248+
return stackTraceElement.getFileName() + ":" + stackTraceElement.getLineNumber() +
249+
":in `" + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + "'";
250+
}
251+
247252
private String formatForeign(Node callNode, String methodName) {
248253
final StringBuilder builder = new StringBuilder();
249254
final SourceSection sourceSection = callNode == null ? null : callNode.getEncapsulatingSourceSection();

0 commit comments

Comments
 (0)