44import marshal
55import opcode
66import os
7+ import sys
78import tempfile
89import unittest
910
10- from test .support import is_emscripten
11+ from test .support import is_emscripten , set_recursion_limit
1112
1213try :
1314 import _remote_debugging # noqa: F401
@@ -611,7 +612,6 @@ def test_flamegraph_collector_empty_export_fails(self):
611612 self .assertEqual (os .path .getsize (flamegraph_out .name ), 0 )
612613
613614 def test_flamegraph_deep_stack_export (self ):
614- """A deep stack must export instead of raising RecursionError."""
615615 flamegraph_out = tempfile .NamedTemporaryFile (
616616 suffix = ".html" , delete = False
617617 )
@@ -623,12 +623,26 @@ def test_flamegraph_deep_stack_export(self):
623623 collector .collect (
624624 [MockInterpreterInfo (0 , [MockThreadInfo (1 , frames )])])
625625
626- with captured_stdout (), captured_stderr ():
626+ with set_recursion_limit ( 1000 ), captured_stdout (), captured_stderr ():
627627 export_ok = collector .export (flamegraph_out .name )
628+ self .assertEqual (sys .getrecursionlimit (), 1000 )
628629
629630 self .assertTrue (export_ok )
630631 self .assertGreater (os .path .getsize (flamegraph_out .name ), 0 )
631632
633+ def test_flamegraph_export_restores_recursion_limit (self ):
634+ collector = FlamegraphCollector (1000 )
635+ frame = MockFrameInfo ("f.py" , 1 , "f" )
636+ with set_recursion_limit (500 ), captured_stdout (), captured_stderr ():
637+ self .assertFalse (collector .export (None ))
638+ self .assertEqual (sys .getrecursionlimit (), 500 )
639+ collector .collect ([
640+ MockInterpreterInfo (0 , [MockThreadInfo (1 , [
641+ frame , MockFrameInfo ("f.py" , 2 , "caller" )])])])
642+ with self .assertRaises (TypeError ):
643+ collector .export (None )
644+ self .assertEqual (sys .getrecursionlimit (), 500 )
645+
632646 def test_gecko_collector_basic (self ):
633647 """Test basic GeckoCollector functionality."""
634648 collector = GeckoCollector (1000 )
0 commit comments