Remove Lib/site.py hack to unregister patched builtins.

It creates a refleak in subinterpreters, as atexit callbacks aren't triggered at their end.
This commit is contained in:
Antoine Pitrou 2013-08-01 19:46:04 +02:00
parent 4ed328c4d7
commit f93c7b8061

View file

@ -68,7 +68,6 @@ site-specific customizations. If this import fails with an
ImportError exception, it is silently ignored. ImportError exception, it is silently ignored.
""" """
import atexit
import sys import sys
import os import os
import re import re
@ -87,25 +86,6 @@ USER_SITE = None
USER_BASE = None USER_BASE = None
_no_builtin = object()
def _patch_builtins(**items):
# When patching builtins, we make some objects almost immortal
# (builtins are only reclaimed at the very end of the interpreter
# shutdown sequence). To avoid keeping to many references alive,
# we register callbacks to undo our builtins additions.
old_items = {k: getattr(builtins, k, _no_builtin) for k in items}
def unpatch(old_items=old_items):
for k, v in old_items.items():
if v is _no_builtin:
delattr(builtins, k)
else:
setattr(builtins, k, v)
for k, v in items.items():
setattr(builtins, k, v)
atexit.register(unpatch)
def makepath(*paths): def makepath(*paths):
dir = os.path.join(*paths) dir = os.path.join(*paths)
try: try:
@ -377,7 +357,8 @@ def setquit():
except: except:
pass pass
raise SystemExit(code) raise SystemExit(code)
_patch_builtins(quit=Quitter('quit'), exit=Quitter('exit')) builtins.quit = Quitter('quit')
builtins.exit = Quitter('exit')
class _Printer(object): class _Printer(object):
@ -442,20 +423,20 @@ class _Printer(object):
def setcopyright(): def setcopyright():
"""Set 'copyright' and 'credits' in builtins""" """Set 'copyright' and 'credits' in builtins"""
_patch_builtins(copyright=_Printer("copyright", sys.copyright)) builtins.copyright = _Printer("copyright", sys.copyright)
if sys.platform[:4] == 'java': if sys.platform[:4] == 'java':
_patch_builtins(credits=_Printer( builtins.credits = _Printer(
"credits", "credits",
"Jython is maintained by the Jython developers (www.jython.org).")) "Jython is maintained by the Jython developers (www.jython.org).")
else: else:
_patch_builtins(credits=_Printer("credits", """\ builtins.credits = _Printer("credits", """\
Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
for supporting Python development. See www.python.org for more information.""")) for supporting Python development. See www.python.org for more information.""")
here = os.path.dirname(os.__file__) here = os.path.dirname(os.__file__)
_patch_builtins(license=_Printer( builtins.license = _Printer(
"license", "See http://www.python.org/%.3s/license.html" % sys.version, "license", "See http://www.python.org/%.3s/license.html" % sys.version,
["LICENSE.txt", "LICENSE"], ["LICENSE.txt", "LICENSE"],
[os.path.join(here, os.pardir), here, os.curdir])) [os.path.join(here, os.pardir), here, os.curdir])
class _Helper(object): class _Helper(object):
@ -472,7 +453,7 @@ class _Helper(object):
return pydoc.help(*args, **kwds) return pydoc.help(*args, **kwds)
def sethelper(): def sethelper():
_patch_builtins(help=_Helper()) builtins.help = _Helper()
def enablerlcompleter(): def enablerlcompleter():
"""Enable default readline configuration on interactive prompts, by """Enable default readline configuration on interactive prompts, by