Skip to content

Commit 0667692

Browse files
committed
Improve exception printing from atexit
1 parent a5cae88 commit 0667692

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_atexit.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_clear
55
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_exit
66
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_order
7+
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_print_tracebacks
78
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_raise
9+
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_raise_unnormalized
810
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_shutdown
911
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_stress
1012
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_unregister

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AtexitModuleBuiltins.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,21 @@
4545
import com.oracle.graal.python.PythonLanguage;
4646
import com.oracle.graal.python.builtins.Builtin;
4747
import com.oracle.graal.python.builtins.CoreFunctions;
48+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4849
import com.oracle.graal.python.builtins.PythonBuiltins;
4950
import com.oracle.graal.python.builtins.objects.PNone;
51+
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
5052
import com.oracle.graal.python.builtins.objects.frame.PFrame;
5153
import com.oracle.graal.python.builtins.objects.function.PKeyword;
54+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5255
import com.oracle.graal.python.nodes.call.CallNode;
5356
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5457
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5558
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5659
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
60+
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
5761
import com.oracle.graal.python.runtime.PythonContext;
62+
import com.oracle.graal.python.runtime.exception.ExceptionUtils;
5863
import com.oracle.graal.python.runtime.exception.PException;
5964
import com.oracle.graal.python.util.PythonUtils;
6065
import com.oracle.truffle.api.CompilerDirectives;
@@ -76,12 +81,12 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
7681
@Builtin(name = "register", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
7782
@GenerateNodeFactory
7883
abstract static class RegisterNode extends PythonVarargsBuiltinNode {
79-
private static class AtExitCallTarget extends RootNode {
84+
private static class AtExitRootNode extends RootNode {
8085
@Child private CallNode callNode = CallNode.create();
8186

8287
private final ContextReference<PythonContext> contextRef = lookupContextReference(PythonLanguage.class);
8388

84-
protected AtExitCallTarget(TruffleLanguage<?> language) {
89+
protected AtExitRootNode(TruffleLanguage<?> language) {
8590
super(language);
8691
}
8792

@@ -100,6 +105,14 @@ public Object execute(VirtualFrame frame) {
100105
// from the context.
101106
try {
102107
return callNode.execute(null, callable, arguments, keywords);
108+
} catch (PException e) {
109+
PBaseException pythonException = e.getEscapedException();
110+
PythonObjectLibrary lib = PythonObjectLibrary.getUncached();
111+
if (!IsBuiltinClassProfile.profileClassSlowPath(lib.getLazyPythonClass(pythonException), PythonBuiltinClassType.SystemExit)) {
112+
lib.lookupAndCallRegularMethod(context.getCore().getStderr(), null, "write", "Error in atexit._run_exitfuncs:\n");
113+
ExceptionUtils.printExceptionTraceback(context, pythonException);
114+
}
115+
throw e;
103116
} finally {
104117
context.popTopFrameInfo();
105118
context.setCaughtException(null);
@@ -110,8 +123,8 @@ public Object execute(VirtualFrame frame) {
110123
@Specialization
111124
Object register(Object callable, Object[] arguments, PKeyword[] keywords) {
112125
CompilerDirectives.transferToInterpreter();
113-
AtExitCallTarget atExitCallTarget = new AtExitCallTarget(getContext().getLanguage());
114-
getContext().registerAtexitHook(callable, arguments, keywords, PythonUtils.getOrCreateCallTarget(atExitCallTarget));
126+
AtExitRootNode atExitRootNode = new AtExitRootNode(getContext().getLanguage());
127+
getContext().registerAtexitHook(callable, arguments, keywords, PythonUtils.getOrCreateCallTarget(atExitRootNode));
115128
return callable;
116129
}
117130
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import org.graalvm.options.OptionKey;
5555

5656
import com.oracle.graal.python.PythonLanguage;
57-
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5857
import com.oracle.graal.python.builtins.objects.PNone;
5958
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
6059
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
@@ -79,7 +78,6 @@
7978
import com.oracle.graal.python.nodes.SpecialMethodNames;
8079
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
8180
import com.oracle.graal.python.nodes.call.CallNode;
82-
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
8381
import com.oracle.graal.python.runtime.AsyncHandler.AsyncAction;
8482
import com.oracle.graal.python.runtime.exception.ExceptionUtils;
8583
import com.oracle.graal.python.runtime.exception.PException;
@@ -752,10 +750,6 @@ public void runAtexitHooks() {
752750
hook.ct.call(hook.callable, hook.arguments, hook.keywords);
753751
} catch (PException e) {
754752
lastException = e;
755-
if (!IsBuiltinClassProfile.profileClassSlowPath(e.getEscapedException(), PythonBuiltinClassType.SystemExit)) {
756-
System.err.println("Error in atexit._run_exitfuncs:");
757-
ExceptionUtils.printPythonLikeStackTrace(e);
758-
}
759753
}
760754
}
761755
atExitHooks.clear();

0 commit comments

Comments
 (0)