Updated with fix for #3126.
[python.git] / Misc / find_recursionlimit.py
blobe6454c9c3011393c016d51f61d33a8f1569b8b0b
1 #! /usr/bin/env python
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
12 C API occur.
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
19 MemoryError.
21 NB: A program that does not use __methods__ can set a higher limit.
22 """
24 import sys
26 class RecursiveBlowup1:
27 def __init__(self):
28 self.__init__()
30 def test_init():
31 return RecursiveBlowup1()
33 class RecursiveBlowup2:
34 def __repr__(self):
35 return repr(self)
37 def test_repr():
38 return repr(RecursiveBlowup2())
40 class RecursiveBlowup4:
41 def __add__(self, x):
42 return x + self
44 def test_add():
45 return RecursiveBlowup4() + RecursiveBlowup4()
47 class RecursiveBlowup5:
48 def __getattr__(self, attr):
49 return getattr(self, attr)
51 def test_getattr():
52 return RecursiveBlowup5().attr
54 class RecursiveBlowup6:
55 def __getitem__(self, item):
56 return self[item - 2] + self[item - 1]
58 def test_getitem():
59 return RecursiveBlowup6()[5]
61 def test_recurse():
62 return test_recurse()
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:]
68 else:
69 print test_func_name
70 test_func = globals()[test_func_name]
71 try:
72 test_func()
73 except RuntimeError:
74 pass
75 else:
76 print "Yikes!"
78 limit = 1000
79 while 1:
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
87 limit = limit + 100