blob: 32bdae4095b7244f1ea8ca162ca6a36f3e0b2e46 [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_"):
65 print test_func_name[5:]
66 else:
67 print test_func_name
68 test_func = globals()[test_func_name]
69 try:
70 test_func()
71 except RuntimeError:
72 pass
73 else:
74 print "Yikes!"
75
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")
84 print "Limit of %d is fine" % limit
85 limit = limit + 100