blob: b7592ced0b5854a867ab36c86ac96198d9cef625 [file] [log] [blame]
Jeremy Hyltonc18b7d92000-08-31 19:24:17 +00001#! /usr/bin/env python
2"""Find the maximum recursion limit that prevents core dumps
3
4This script finds the maximum safe recursion limit on a particular
5platform. If you need to change the recursion limit on your system,
6this script will tell you a safe upper bound. To use the new limit,
7call sys.setrecursionlimit.
8
9This module implements several ways to create infinite recursion in
10Python. Different implementations end up pushing different numbers of
11C stack frames, depending on how many calls through Python's abstract
12C API occur.
13
14After each round of tests, it prints a message
15Limit of NNNN is fine.
16
17It ends when Python causes a segmentation fault because the limit is
18too high. On platforms like Mac and Windows, it should exit with a
19MemoryError.
Jeremy Hyltonc18b7d92000-08-31 19:24:17 +000020"""
21
22import sys
23
24class RecursiveBlowup1:
25 def __init__(self):
26 self.__init__()
27
28def test_init():
29 return RecursiveBlowup1()
30
31class RecursiveBlowup2:
32 def __repr__(self):
33 return repr(self)
34
35def test_repr():
36 return repr(RecursiveBlowup2())
37
38class RecursiveBlowup4:
39 def __add__(self, x):
40 return x + self
41
42def test_add():
43 return RecursiveBlowup4() + RecursiveBlowup4()
44
45class RecursiveBlowup5:
46 def __getattr__(self, attr):
47 return getattr(self, attr)
48
49def test_getattr():
50 return RecursiveBlowup5().attr
51
52class RecursiveBlowup6:
53 def __getitem__(self, item):
54 return self[item - 2] + self[item - 1]
55
56def test_getitem():
57 return RecursiveBlowup6()[5]
Tim Peters182b5ac2004-07-18 06:16:08 +000058
Jeremy Hyltonc18b7d92000-08-31 19:24:17 +000059def test_recurse():
60 return test_recurse()
61
62def check_limit(n, test_func_name):
63 sys.setrecursionlimit(n)
64 if test_func_name.startswith("test_"):
Collin Wintere7bf59f2007-08-30 18:39:28 +000065 print(test_func_name[5:])
Jeremy Hyltonc18b7d92000-08-31 19:24:17 +000066 else:
Collin Wintere7bf59f2007-08-30 18:39:28 +000067 print(test_func_name)
Jeremy Hyltonc18b7d92000-08-31 19:24:17 +000068 test_func = globals()[test_func_name]
69 try:
70 test_func()
71 except RuntimeError:
72 pass
73 else:
Collin Wintere7bf59f2007-08-30 18:39:28 +000074 print("Yikes!")
Jeremy Hyltonc18b7d92000-08-31 19:24:17 +000075
76limit = 1000
77while 1:
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")
Collin Wintere7bf59f2007-08-30 18:39:28 +000084 print("Limit of %d is fine" % limit)
Jeremy Hyltonc18b7d92000-08-31 19:24:17 +000085 limit = limit + 100