diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib.txt index 21bf666890..565bf67268 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib.txt @@ -51,8 +51,10 @@ test.test_contextlib.TestExitStack.test_dont_reraise_RuntimeError @ darwin-arm64 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 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 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 +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 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 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 +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 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 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 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 diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java index fef50c8cca..e4b7724903 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java @@ -3453,6 +3453,9 @@ private void chainPythonExceptions(VirtualFrame virtualFrame, MutableLoopData mu } private void chainPythonExceptions(PException current, PException context) { + if (current.isReraised()) { + return; + } if (chainExceptionsNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); chainExceptionsNode = insert(ChainExceptionsNode.create()); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java index 46868c9eca..09e5ecb375 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java @@ -901,7 +901,7 @@ public AbstractTruffleException interceptTruffleException(AbstractTruffleExcepti getCaughtExceptionNode = insert(ExceptionStateNodes.GetCaughtExceptionNode.create()); } AbstractTruffleException context = getCaughtExceptionNode.execute(frame); - if (context instanceof PException pe2) { + if (context instanceof PException pe2 && !pe.isReraised()) { if (chainExceptionsNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); chainExceptionsNode = insert(ChainExceptionsNode.create()); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java index 77f6d7f945..89c9f4a2ba 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java @@ -116,6 +116,7 @@ public final class PException extends AbstractTruffleException { private int catchBci; private boolean reified = false; private boolean skipFirstTracebackFrame; + private boolean reraised; // See the docs of MaterializeLazyTracebackNode private int tracebackFrameCount; @@ -436,6 +437,7 @@ public void notifyAddedTracebackFrame(boolean visible) { public PException getExceptionForReraise(boolean rootNodeVisible) { ensureReified(); PException pe = PException.fromObject(pythonException, getLocation(), false); + pe.reraised = true; if (pe.getUnreifiedException() instanceof PBaseExceptionGroup grp) { grp.setContainsReraises(true); } @@ -603,6 +605,10 @@ public void dontTraceOnReraise() { shouldTrace = true; } + public boolean isReraised() { + return reraised; + } + @TruffleBoundary public static PException raiseUnboundLocalException(BytecodeNode bytecodeNode, LocalVariable localVariable) { Object info = localVariable.getInfo();