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
21 NB: A program that does not use __methods__ can set a higher limit.
26 class RecursiveBlowup1
:
31 return RecursiveBlowup1()
33 class RecursiveBlowup2
:
38 return repr(RecursiveBlowup2())
40 class RecursiveBlowup4
:
45 return RecursiveBlowup4() + RecursiveBlowup4()
47 class RecursiveBlowup5
:
48 def __getattr__(self
, attr
):
49 return getattr(self
, attr
)
52 return RecursiveBlowup5().attr
54 class RecursiveBlowup6
:
55 def __getitem__(self
, item
):
56 return self
[item
- 2] + self
[item
- 1]
59 return RecursiveBlowup6()[5]
64 def check_limit(n
, test_func_name
):
65 sys
.setrecursionlimit(n
)
66 if test_func_name
.startswith("test_"):
67 print test_func_name
[5:]
70 test_func
= globals()[test_func_name
]
80 check_limit(limit
, "test_recurse")
81 check_limit(limit
, "test_add")
82 check_limit(limit
, "test_repr")
83 check_limit(limit
, "test_init")
84 check_limit(limit
, "test_getattr")
85 check_limit(limit
, "test_getitem")
86 print "Limit of %d is fine" % limit