diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2008-09-13 20:30:30 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2008-09-13 20:30:30 (GMT) |
commit | 3c9f541ef898207a907ad396a3e015255a2794a4 (patch) | |
tree | f420fddf356ecac2b98b9cd3836472da2941ff01 | |
parent | d51e07f989474f6bc82a96546cd2aeebb81faa79 (diff) | |
download | cpython-3c9f541ef898207a907ad396a3e015255a2794a4.zip cpython-3c9f541ef898207a907ad396a3e015255a2794a4.tar.gz cpython-3c9f541ef898207a907ad396a3e015255a2794a4.tar.bz2 |
Issue #3850: Misc/find_recursionlimit.py was broken.
Reviewed by A.M. Kuchling.
-rw-r--r-- | Misc/NEWS | 8 | ||||
-rw-r--r-- | Misc/find_recursionlimit.py | 27 |
2 files changed, 27 insertions, 8 deletions
@@ -15,6 +15,14 @@ Core and Builtins Library ------- +Tools/Demos +----------- + +- Issue #3850: recursion tests in Misc/find_recursion_limit.py can raise + AttributeError instead of RuntimeError, depending in which C API call + exactly the recursion limit is exceeded. Consequently, both exception types + are caught and silenced. + What's New in Python 2.6 release candidate 1? ============================================= diff --git a/Misc/find_recursionlimit.py b/Misc/find_recursionlimit.py index 398abeb..88e9bb5 100644 --- a/Misc/find_recursionlimit.py +++ b/Misc/find_recursionlimit.py @@ -1,22 +1,30 @@ #! /usr/bin/env python -"""Find the maximum recursion limit that prevents core dumps +"""Find the maximum recursion limit that prevents interpreter termination. This script finds the maximum safe recursion limit on a particular platform. If you need to change the recursion limit on your system, this script will tell you a safe upper bound. To use the new limit, -call sys.setrecursionlimit. +call sys.setrecursionlimit(). This module implements several ways to create infinite recursion in Python. Different implementations end up pushing different numbers of C stack frames, depending on how many calls through Python's abstract C API occur. -After each round of tests, it prints a message -Limit of NNNN is fine. +After each round of tests, it prints a message: +"Limit of NNNN is fine". -It ends when Python causes a segmentation fault because the limit is -too high. On platforms like Mac and Windows, it should exit with a -MemoryError. +The highest printed value of "NNNN" is therefore the highest potentially +safe limit for your system (which depends on the OS, architecture, but also +the compilation flags). Please note that it is practically impossible to +test all possible recursion paths in the interpreter, so the results of +this test should not be trusted blindly -- although they give a good hint +of which values are reasonable. + +NOTE: When the C stack space allocated by your system is exceeded due +to excessive recursion, exact behaviour depends on the platform, although +the interpreter will always fail in a likely brutal way: either a +segmentation fault, a MemoryError, or just a silent abort. NB: A program that does not use __methods__ can set a higher limit. """ @@ -88,7 +96,10 @@ def check_limit(n, test_func_name): test_func = globals()[test_func_name] try: test_func() - except RuntimeError: + # AttributeError can be raised because of the way e.g. PyDict_GetItem() + # silences all exceptions and returns NULL, which is usually interpreted + # as "missing attribute". + except (RuntimeError, AttributeError): pass else: print "Yikes!" |