Skip to content

Commit f217f15

Browse files
committed
Preserve exception context on bare reraises
1 parent ba89beb commit f217f15

4 files changed

Lines changed: 12 additions & 1 deletion

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ test.test_contextlib.TestExitStack.test_dont_reraise_RuntimeError @ darwin-arm64
5151
test.test_contextlib.TestExitStack.test_enter_context @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
5252
test.test_contextlib.TestExitStack.test_enter_context_errors @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
5353
test.test_contextlib.TestExitStack.test_excessive_nesting @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
54+
test.test_contextlib.TestExitStack.test_exit_exception_chaining @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
5455
test.test_contextlib.TestExitStack.test_exit_exception_chaining_reference @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
5556
test.test_contextlib.TestExitStack.test_exit_exception_chaining_suppress @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
57+
test.test_contextlib.TestExitStack.test_exit_exception_explicit_none_context @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
5658
test.test_contextlib.TestExitStack.test_exit_exception_non_suppressing @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
5759
test.test_contextlib.TestExitStack.test_exit_exception_traceback @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github
5860
test.test_contextlib.TestExitStack.test_exit_exception_with_correct_context @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3453,6 +3453,9 @@ private void chainPythonExceptions(VirtualFrame virtualFrame, MutableLoopData mu
34533453
}
34543454

34553455
private void chainPythonExceptions(PException current, PException context) {
3456+
if (current.isReraised()) {
3457+
return;
3458+
}
34563459
if (chainExceptionsNode == null) {
34573460
CompilerDirectives.transferToInterpreterAndInvalidate();
34583461
chainExceptionsNode = insert(ChainExceptionsNode.create());

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ public AbstractTruffleException interceptTruffleException(AbstractTruffleExcepti
901901
getCaughtExceptionNode = insert(ExceptionStateNodes.GetCaughtExceptionNode.create());
902902
}
903903
AbstractTruffleException context = getCaughtExceptionNode.execute(frame);
904-
if (context instanceof PException pe2) {
904+
if (context instanceof PException pe2 && !pe.isReraised()) {
905905
if (chainExceptionsNode == null) {
906906
CompilerDirectives.transferToInterpreterAndInvalidate();
907907
chainExceptionsNode = insert(ChainExceptionsNode.create());

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ public final class PException extends AbstractTruffleException {
116116
private int catchBci;
117117
private boolean reified = false;
118118
private boolean skipFirstTracebackFrame;
119+
private boolean reraised;
119120

120121
// See the docs of MaterializeLazyTracebackNode
121122
private int tracebackFrameCount;
@@ -436,6 +437,7 @@ public void notifyAddedTracebackFrame(boolean visible) {
436437
public PException getExceptionForReraise(boolean rootNodeVisible) {
437438
ensureReified();
438439
PException pe = PException.fromObject(pythonException, getLocation(), false);
440+
pe.reraised = true;
439441
if (pe.getUnreifiedException() instanceof PBaseExceptionGroup grp) {
440442
grp.setContainsReraises(true);
441443
}
@@ -603,6 +605,10 @@ public void dontTraceOnReraise() {
603605
shouldTrace = true;
604606
}
605607

608+
public boolean isReraised() {
609+
return reraised;
610+
}
611+
606612
@TruffleBoundary
607613
public static PException raiseUnboundLocalException(BytecodeNode bytecodeNode, LocalVariable localVariable) {
608614
Object info = localVariable.getInfo();

0 commit comments

Comments
 (0)