annotate Tools/scripts/find_recursionlimit.py @ 58765:2ba7677bfa95 legacy-trunk

testCopysign was defined twice in test_math; combine the definitions
author Mark Dickinson <dickinsm@gmail.com>
date Sat, 06 Feb 2010 23:11:25 +0000
parents 050748ce5ad9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 #! /usr/bin/env python
49188
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
2 """Find the maximum recursion limit that prevents interpreter termination.
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4 This script finds the maximum safe recursion limit on a particular
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5 platform. If you need to change the recursion limit on your system,
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
6 this script will tell you a safe upper bound. To use the new limit,
49188
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
7 call sys.setrecursionlimit().
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9 This module implements several ways to create infinite recursion in
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 Python. Different implementations end up pushing different numbers of
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11 C stack frames, depending on how many calls through Python's abstract
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 C API occur.
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
13
49188
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
14 After each round of tests, it prints a message:
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
15 "Limit of NNNN is fine".
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
16
49188
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
17 The highest printed value of "NNNN" is therefore the highest potentially
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
18 safe limit for your system (which depends on the OS, architecture, but also
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
19 the compilation flags). Please note that it is practically impossible to
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
20 test all possible recursion paths in the interpreter, so the results of
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
21 this test should not be trusted blindly -- although they give a good hint
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
22 of which values are reasonable.
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
23
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
24 NOTE: When the C stack space allocated by your system is exceeded due
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
25 to excessive recursion, exact behaviour depends on the platform, although
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
26 the interpreter will always fail in a likely brutal way: either a
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
27 segmentation fault, a MemoryError, or just a silent abort.
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
29 NB: A program that does not use __methods__ can set a higher limit.
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30 """
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
32 import sys
49148
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
33 import itertools
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
34
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
35 class RecursiveBlowup1:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36 def __init__(self):
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
37 self.__init__()
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
38
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
39 def test_init():
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
40 return RecursiveBlowup1()
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
41
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
42 class RecursiveBlowup2:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
43 def __repr__(self):
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
44 return repr(self)
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
45
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
46 def test_repr():
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
47 return repr(RecursiveBlowup2())
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
48
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 class RecursiveBlowup4:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
50 def __add__(self, x):
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
51 return x + self
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
52
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
53 def test_add():
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
54 return RecursiveBlowup4() + RecursiveBlowup4()
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
55
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
56 class RecursiveBlowup5:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
57 def __getattr__(self, attr):
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
58 return getattr(self, attr)
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
59
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
60 def test_getattr():
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
61 return RecursiveBlowup5().attr
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
62
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
63 class RecursiveBlowup6:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
64 def __getitem__(self, item):
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
65 return self[item - 2] + self[item - 1]
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
66
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
67 def test_getitem():
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
68 return RecursiveBlowup6()[5]
32736
c3a096bfbd6b Whitespace normalization, via reindent.py.
Tim Peters <tim.peters@gmail.com>
parents: 14309
diff changeset
69
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
70 def test_recurse():
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
71 return test_recurse()
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
72
49148
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
73 def test_cpickle(_cache={}):
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
74 try:
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
75 import cPickle
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
76 except ImportError:
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
77 print "cannot import cPickle, skipped!"
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
78 return
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
79 l = None
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
80 for n in itertools.count():
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
81 try:
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
82 l = _cache[n]
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
83 continue # Already tried and it works, let's save some time
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
84 except KeyError:
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
85 for i in range(100):
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
86 l = [l]
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
87 cPickle.dumps(l, protocol=-1)
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
88 _cache[n] = l
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
89
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
90 def check_limit(n, test_func_name):
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
91 sys.setrecursionlimit(n)
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
92 if test_func_name.startswith("test_"):
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
93 print test_func_name[5:]
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
94 else:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
95 print test_func_name
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
96 test_func = globals()[test_func_name]
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
97 try:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
98 test_func()
49188
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
99 # AttributeError can be raised because of the way e.g. PyDict_GetItem()
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
100 # silences all exceptions and returns NULL, which is usually interpreted
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
101 # as "missing attribute".
2c5bb4634d2d Issue #3850: Misc/find_recursionlimit.py was broken.
Antoine Pitrou <solipsis@pitrou.net>
parents: 49148
diff changeset
102 except (RuntimeError, AttributeError):
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
103 pass
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
104 else:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
105 print "Yikes!"
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
106
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
107 limit = 1000
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
108 while 1:
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
109 check_limit(limit, "test_recurse")
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
110 check_limit(limit, "test_add")
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
111 check_limit(limit, "test_repr")
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
112 check_limit(limit, "test_init")
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
113 check_limit(limit, "test_getattr")
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
114 check_limit(limit, "test_getitem")
49148
0ef7cb35b216 #3640: Correct a crash in cPickle on 64bit platforms, in the case of deeply nested lists or dicts.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 32736
diff changeset
115 check_limit(limit, "test_cpickle")
14309
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
116 print "Limit of %d is fine" % limit
7d40bd07b129 script that reports a fairly safe recursionlimit for a specific platform
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
117 limit = limit + 100