]> granicus.if.org Git - python/commitdiff
Remove Lib/site.py hack to unregister patched builtins.
authorAntoine Pitrou <solipsis@pitrou.net>
Thu, 1 Aug 2013 17:46:04 +0000 (19:46 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Thu, 1 Aug 2013 17:46:04 +0000 (19:46 +0200)
It creates a refleak in subinterpreters, as atexit callbacks aren't triggered at their end.

Lib/site.py

index 08b98eb06ce331c4efd3249812b8c5da274b8b94..96a4bef71efcc007e2bb9fa11166db98e77d87aa 100644 (file)
@@ -68,7 +68,6 @@ site-specific customizations.  If this import fails with an
 ImportError exception, it is silently ignored.
 """
 
-import atexit
 import sys
 import os
 import re
@@ -87,25 +86,6 @@ USER_SITE = 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):
     dir = os.path.join(*paths)
     try:
@@ -377,7 +357,8 @@ def setquit():
             except:
                 pass
             raise SystemExit(code)
-    _patch_builtins(quit=Quitter('quit'), exit=Quitter('exit'))
+    builtins.quit = Quitter('quit')
+    builtins.exit = Quitter('exit')
 
 
 class _Printer(object):
@@ -442,20 +423,20 @@ class _Printer(object):
 
 def setcopyright():
     """Set 'copyright' and 'credits' in builtins"""
-    _patch_builtins(copyright=_Printer("copyright", sys.copyright))
+    builtins.copyright = _Printer("copyright", sys.copyright)
     if sys.platform[:4] == 'java':
-        _patch_builtins(credits=_Printer(
+        builtins.credits = _Printer(
             "credits",
-            "Jython is maintained by the Jython developers (www.jython.org)."))
+            "Jython is maintained by the Jython developers (www.jython.org).")
     else:
-        _patch_builtins(credits=_Printer("credits", """\
+        builtins.credits = _Printer("credits", """\
     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__)
-    _patch_builtins(license=_Printer(
+    builtins.license = _Printer(
         "license", "See http://www.python.org/%.3s/license.html" % sys.version,
         ["LICENSE.txt", "LICENSE"],
-        [os.path.join(here, os.pardir), here, os.curdir]))
+        [os.path.join(here, os.pardir), here, os.curdir])
 
 
 class _Helper(object):
@@ -472,7 +453,7 @@ class _Helper(object):
         return pydoc.help(*args, **kwds)
 
 def sethelper():
-    _patch_builtins(help=_Helper())
+    builtins.help = _Helper()
 
 def enablerlcompleter():
     """Enable default readline configuration on interactive prompts, by