Kaydet (Commit) 3c9f541e authored tarafından Antoine Pitrou's avatar Antoine Pitrou

Issue #3850: Misc/find_recursionlimit.py was broken.

Reviewed by A.M. Kuchling.
üst d51e07f9
...@@ -15,6 +15,14 @@ Core and Builtins ...@@ -15,6 +15,14 @@ Core and Builtins
Library 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? What's New in Python 2.6 release candidate 1?
============================================= =============================================
......
#! /usr/bin/env python #! /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 This script finds the maximum safe recursion limit on a particular
platform. If you need to change the recursion limit on your system, 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, 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 This module implements several ways to create infinite recursion in
Python. Different implementations end up pushing different numbers of Python. Different implementations end up pushing different numbers of
C stack frames, depending on how many calls through Python's abstract C stack frames, depending on how many calls through Python's abstract
C API occur. C API occur.
After each round of tests, it prints a message After each round of tests, it prints a message:
Limit of NNNN is fine. "Limit of NNNN is fine".
It ends when Python causes a segmentation fault because the limit is The highest printed value of "NNNN" is therefore the highest potentially
too high. On platforms like Mac and Windows, it should exit with a safe limit for your system (which depends on the OS, architecture, but also
MemoryError. 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. NB: A program that does not use __methods__ can set a higher limit.
""" """
...@@ -88,7 +96,10 @@ def check_limit(n, test_func_name): ...@@ -88,7 +96,10 @@ def check_limit(n, test_func_name):
test_func = globals()[test_func_name] test_func = globals()[test_func_name]
try: try:
test_func() 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 pass
else: else:
print "Yikes!" print "Yikes!"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment