@@ -279,20 +279,28 @@ def test_switchinterval(self):
279279 finally :
280280 sys .setswitchinterval (orig )
281281
282- def test_recursionlimit (self ):
282+ def test_getrecursionlimit (self ):
283+ limit = sys .getrecursionlimit ()
284+ self .assertIsInstance (limit , int )
285+ self .assertGreater (limit , 1 )
286+
283287 self .assertRaises (TypeError , sys .getrecursionlimit , 42 )
284- oldlimit = sys .getrecursionlimit ()
285- self .assertRaises (TypeError , sys .setrecursionlimit )
286- self .assertRaises (ValueError , sys .setrecursionlimit , - 42 )
287- sys .setrecursionlimit (10000 )
288- self .assertEqual (sys .getrecursionlimit (), 10000 )
289- sys .setrecursionlimit (oldlimit )
288+
289+ def test_setrecursionlimit (self ):
290+ old_limit = sys .getrecursionlimit ()
291+ try :
292+ self .assertRaises (TypeError , sys .setrecursionlimit )
293+ self .assertRaises (ValueError , sys .setrecursionlimit , - 42 )
294+ sys .setrecursionlimit (10000 )
295+ self .assertEqual (sys .getrecursionlimit (), 10000 )
296+ finally :
297+ sys .setrecursionlimit (old_limit )
290298
291299 def test_recursionlimit_recovery (self ):
292300 if hasattr (sys , 'gettrace' ) and sys .gettrace ():
293301 self .skipTest ('fatal error if run with a trace function' )
294302
295- oldlimit = sys .getrecursionlimit ()
303+ old_limit = sys .getrecursionlimit ()
296304 def f ():
297305 f ()
298306 try :
@@ -311,35 +319,56 @@ def f():
311319 with self .assertRaises (RecursionError ):
312320 f ()
313321 finally :
314- sys .setrecursionlimit (oldlimit )
322+ sys .setrecursionlimit (old_limit )
315323
316324 @test .support .cpython_only
317- def test_setrecursionlimit_recursion_depth (self ):
325+ def test_setrecursionlimit_recursionerror (self ):
318326 # Issue #25274: Setting a low recursion limit must be blocked if the
319327 # current recursion depth is already higher than limit.
320328
321- from _testinternalcapi import get_recursion_depth
322-
323- def set_recursion_limit_at_depth ( depth , limit ) :
324- recursion_depth = get_recursion_depth ( )
325- if recursion_depth >= depth :
329+ def set_recursion_limit_at_depth ( desired_depth , limit ):
330+ recursion_depth = support . get_recursion_depth ()
331+ if recursion_depth < desired_depth :
332+ set_recursion_limit_at_depth ( desired_depth , limit )
333+ else :
326334 with self .assertRaises (RecursionError ) as cm :
327335 sys .setrecursionlimit (limit )
328336 self .assertRegex (str (cm .exception ),
329337 "cannot set the recursion limit to [0-9]+ "
330338 "at the recursion depth [0-9]+: "
331339 "the limit is too low" )
332- else :
333- set_recursion_limit_at_depth (depth , limit )
334340
335- oldlimit = sys .getrecursionlimit ()
341+ old_limit = sys .getrecursionlimit ()
336342 try :
337343 sys .setrecursionlimit (1000 )
338-
339344 for limit in (10 , 25 , 50 , 75 , 100 , 150 , 200 ):
340- set_recursion_limit_at_depth (limit , limit )
345+ with self .subTest (limit = limit ):
346+ set_recursion_limit_at_depth (limit + 1 , limit )
347+ finally :
348+ sys .setrecursionlimit (old_limit )
349+
350+ @test .support .cpython_only
351+ def test_setrecursionlimit_to_depth (self ):
352+ def func ():
353+ pass
354+
355+ old_limit = sys .getrecursionlimit ()
356+ try :
357+ depth = support .get_recursion_depth ()
358+
359+ # gh-108851: Corner case: set the limit to current recursion depth
360+ # should be permitted. Calling any Python function raises
361+ # RecursionError! Calling C functions is still ok, like the
362+ # sys.setrecursionlimit() call below.
363+ sys .setrecursionlimit (depth )
364+ try :
365+ func ()
366+ except RecursionError :
367+ pass
368+ else :
369+ self .fail ("RecursionError was not raised" )
341370 finally :
342- sys .setrecursionlimit (oldlimit )
371+ sys .setrecursionlimit (old_limit )
343372
344373 def test_getwindowsversion (self ):
345374 # Raise SkipTest if sys doesn't have getwindowsversion attribute
0 commit comments