gh-94510: Raise on re-entrant calls to sys.setprofile and sys.settrace (GH-94511)

Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
Pablo Galindo Salgado 2022-07-05 19:18:47 +01:00 committed by GitHub
parent 5f319308a8
commit 40d81fd63b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 105 additions and 3 deletions

View file

@ -2,6 +2,7 @@
from test import support
import unittest
from unittest.mock import MagicMock
import sys
import difflib
import gc
@ -2684,5 +2685,43 @@ class TestExtendedArgs(unittest.TestCase):
self.assertEqual(counts, {'call': 1, 'line': 2000, 'return': 1})
class TestEdgeCases(unittest.TestCase):
def setUp(self):
self.addCleanup(sys.settrace, sys.gettrace())
sys.settrace(None)
def test_reentrancy(self):
def foo(*args):
...
def bar(*args):
...
class A:
def __call__(self, *args):
pass
def __del__(self):
sys.settrace(bar)
sys.settrace(A())
with support.catch_unraisable_exception() as cm:
sys.settrace(foo)
self.assertEqual(cm.unraisable.object, A.__del__)
self.assertIsInstance(cm.unraisable.exc_value, RuntimeError)
self.assertEqual(sys.gettrace(), foo)
def test_same_object(self):
def foo(*args):
...
sys.settrace(foo)
del foo
sys.settrace(sys.gettrace())
if __name__ == "__main__":
unittest.main()