From 54728bba60a7614b90e6b9992d9075bebe70a32b Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Tue, 9 Jan 2024 17:21:29 +0100 Subject: [PATCH] Handle a null backtrace in ThreadManager#setException * This hapenned in CI for ruby-test-mri-asserts: java.lang.RuntimeException: Ruby Thread id=259 from test/mri/tests/ruby/test_io.rb:2916 terminated with internal error: at org.graalvm.ruby/org.truffleruby.core.thread.ThreadManager.printInternalError(ThreadManager.java:361) at org.graalvm.ruby/org.truffleruby.core.thread.ThreadManager.lambda$uncaughtExceptionHandler$3(ThreadManager.java:240) at java.base/java.lang.Thread.dispatchUncaughtException(Thread.java:2901) Caused by: java.lang.NullPointerException: Cannot invoke "org.truffleruby.language.backtrace.Backtrace.getRaiseException()" because "exception.backtrace" is null at org.graalvm.ruby/org.truffleruby.core.thread.ThreadManager.setException(ThreadManager.java:389) at org.graalvm.ruby/org.truffleruby.core.thread.ThreadManager.threadMain(ThreadManager.java:344) at org.graalvm.ruby/org.truffleruby.core.thread.ThreadManager.lambda$initialize$4(ThreadManager.java:321) at java.base/java.lang.Thread.run(Thread.java:1583) at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotThread.access$001(PolyglotThread.java:53) at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotThread$1.execute(PolyglotThread.java:106) at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotThread$ThreadSpawnRootNode.executeImpl(PolyglotThread.java:140) at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotThread$ThreadSpawnRootNode.execute(PolyglotThread.java:131) at org.graalvm.truffle/com.oracle.truffle.api.impl.DefaultCallTarget.callDirectOrIndirect(DefaultCallTarget.java:85) at org.graalvm.truffle/com.oracle.truffle.api.impl.DefaultCallTarget.call(DefaultCallTarget.java:102) at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotThread.run(PolyglotThread.java:102) Suppressed: Attached Guest Language Frames (1) --- src/main/java/org/truffleruby/core/thread/ThreadManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/truffleruby/core/thread/ThreadManager.java b/src/main/java/org/truffleruby/core/thread/ThreadManager.java index dd92cab2a404..f3034fb03bac 100644 --- a/src/main/java/org/truffleruby/core/thread/ThreadManager.java +++ b/src/main/java/org/truffleruby/core/thread/ThreadManager.java @@ -386,7 +386,7 @@ private void setThreadValue(RubyThread thread, Object value) { private void setException(RubyThread thread, RubyException exception, Node currentNode) { // We materialize the backtrace eagerly here, as the exception escapes the thread and needs // to capture the backtrace from this thread. - final RaiseException truffleException = exception.backtrace.getRaiseException(); + RaiseException truffleException = exception.backtrace == null ? null : exception.backtrace.getRaiseException(); if (truffleException != null) { TruffleStackTrace.fillIn(truffleException); }