11
11
12
12
import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
13
13
import com .oracle .truffle .api .TruffleException ;
14
+ import com .oracle .truffle .api .TruffleStackTrace ;
14
15
import com .oracle .truffle .api .dsl .UnsupportedSpecializationException ;
15
16
import com .oracle .truffle .api .frame .VirtualFrame ;
16
17
import com .oracle .truffle .api .nodes .ControlFlowException ;
@@ -290,14 +291,14 @@ private DynamicObject translateThrowable(Throwable throwable) {
290
291
291
292
if (t instanceof TruffleException ) {
292
293
final Backtrace backtrace = new Backtrace ((TruffleException ) t );
293
- final BacktraceFormatter formatter = new BacktraceFormatter (getContext (), EnumSet .noneOf (FormattingFlags .class ));
294
- final String formattedBacktrace = formatter .formatBacktrace (null , backtrace );
295
- builder .append (formattedBacktrace ).append ('\n' );
294
+ appendTruffleStackTrace (builder , backtrace );
296
295
} else {
297
- // Print the first 10 lines of backtrace
298
- final StackTraceElement [] stackTrace = t .getStackTrace ();
299
- for (int i = 0 ; i < Math .min (stackTrace .length , 10 ); i ++) {
300
- stackTraceElementToRuby (builder , stackTrace [i ]);
296
+ if (TruffleStackTrace .getStackTrace (t ) != null ) {
297
+ final Backtrace backtrace = new Backtrace (t );
298
+ appendTruffleStackTrace (builder , backtrace );
299
+ } else {
300
+ // Print the first 10 lines of the Java stacktrace
301
+ appendJavaStackTrace (t , builder , 10 );
301
302
}
302
303
}
303
304
}
@@ -312,8 +313,17 @@ private DynamicObject translateThrowable(Throwable throwable) {
312
313
return coreExceptions ().runtimeError (builder .toString (), this , throwable );
313
314
}
314
315
315
- private void stackTraceElementToRuby (StringBuilder builder , StackTraceElement stackTraceElement ) {
316
- builder .append ('\t' ).append ("from " ).append (stackTraceElement ).append ('\n' );
316
+ private void appendTruffleStackTrace (StringBuilder builder , Backtrace backtrace ) {
317
+ final BacktraceFormatter formatter = new BacktraceFormatter (getContext (), EnumSet .noneOf (FormattingFlags .class ));
318
+ final String formattedBacktrace = formatter .formatBacktrace (null , backtrace );
319
+ builder .append (formattedBacktrace ).append ('\n' );
320
+ }
321
+
322
+ private void appendJavaStackTrace (Throwable t , StringBuilder builder , int limit ) {
323
+ final StackTraceElement [] stackTrace = t .getStackTrace ();
324
+ for (int i = 0 ; i < Math .min (stackTrace .length , limit ); i ++) {
325
+ builder .append ('\t' ).append ("from " ).append (stackTrace [i ]).append ('\n' );
326
+ }
317
327
}
318
328
319
329
}
0 commit comments