2 """Find the maximum recursion limit that prevents core dumps
4 This script finds the maximum safe recursion limit on a particular
5 platform. If you need to change the recursion limit on your system,
6 this script will tell you a safe upper bound. To use the new limit,
7 call sys.setrecursionlimit.
9 This module implements several ways to create infinite recursion in
10 Python. Different implementations end up pushing different numbers of
11 C stack frames, depending on how many calls through Python's abstract
14 After each round of tests, it prints a message
15 Limit of NNNN is fine.
17 It ends when Python causes a segmentation fault because the limit is
18 too high. On platforms like Mac and Windows, it should exit with a
24 class RecursiveBlowup1
:
29 return RecursiveBlowup1()
31 class RecursiveBlowup2
:
36 return repr(RecursiveBlowup2())
38 class RecursiveBlowup4
:
43 return RecursiveBlowup4() + RecursiveBlowup4()
45 class RecursiveBlowup5
:
46 def __getattr__(self
, attr
):
47 return getattr(self
, attr
)
50 return RecursiveBlowup5().attr
52 class RecursiveBlowup6
:
53 def __getitem__(self
, item
):
54 return self
[item
- 2] + self
[item
- 1]
57 return RecursiveBlowup6()[5]
62 def check_limit(n
, test_func_name
):
63 sys
.setrecursionlimit(n
)
64 if test_func_name
.startswith("test_"):
65 print(test_func_name
[5:])
68 test_func
= globals()[test_func_name
]
78 check_limit(limit
, "test_recurse")
79 check_limit(limit
, "test_add")
80 check_limit(limit
, "test_repr")
81 check_limit(limit
, "test_init")
82 check_limit(limit
, "test_getattr")
83 check_limit(limit
, "test_getitem")
84 print("Limit of %d is fine" % limit
)