Staging
v0.5.1
v0.5.1
https://github.com/python/cpython
Revision af8d7a91da605656a7f57815c9176026de28f3b0 authored by Johannes Gijsbers on 09 January 2005, 00:39:06 UTC, committed by Johannes Gijsbers on 09 January 2005, 00:39:06 UTC
* Document hasFeature(), createDocument(), CreateDocumentType(), hasAttribute(), hasAttributeNS(). * In the documentation for createDocument(), it is now stated that the Python DOM API allows implementations to forego creation of the document element child node, if no namespace and local name arguments are given. (This possibility is left open and unaddressed in the W3C spec). * Addition by me: use 'name' rather than 'attname', for consistency with the DOM specification and the Python DOM API implementation.
1 parent 45798bf
Tip revision: af8d7a91da605656a7f57815c9176026de28f3b0 authored by Johannes Gijsbers on 09 January 2005, 00:39:06 UTC
Backport patch #1051321 (fixes bugs 1010196, 1013525), by Mike Brown:
Backport patch #1051321 (fixes bugs 1010196, 1013525), by Mike Brown:
Tip revision: af8d7a9
find_recursionlimit.py
#! /usr/bin/env python
"""Find the maximum recursion limit that prevents core dumps
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.
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.
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.
NB: A program that does not use __methods__ can set a higher limit.
"""
import sys
class RecursiveBlowup1:
def __init__(self):
self.__init__()
def test_init():
return RecursiveBlowup1()
class RecursiveBlowup2:
def __repr__(self):
return repr(self)
def test_repr():
return repr(RecursiveBlowup2())
class RecursiveBlowup4:
def __add__(self, x):
return x + self
def test_add():
return RecursiveBlowup4() + RecursiveBlowup4()
class RecursiveBlowup5:
def __getattr__(self, attr):
return getattr(self, attr)
def test_getattr():
return RecursiveBlowup5().attr
class RecursiveBlowup6:
def __getitem__(self, item):
return self[item - 2] + self[item - 1]
def test_getitem():
return RecursiveBlowup6()[5]
def test_recurse():
return test_recurse()
def check_limit(n, test_func_name):
sys.setrecursionlimit(n)
if test_func_name.startswith("test_"):
print test_func_name[5:]
else:
print test_func_name
test_func = globals()[test_func_name]
try:
test_func()
except RuntimeError:
pass
else:
print "Yikes!"
limit = 1000
while 1:
check_limit(limit, "test_recurse")
check_limit(limit, "test_add")
check_limit(limit, "test_repr")
check_limit(limit, "test_init")
check_limit(limit, "test_getattr")
check_limit(limit, "test_getitem")
print "Limit of %d is fine" % limit
limit = limit + 100
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...