summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2002-07-16 19:30:59 (GMT)
committerTim Peters <tim.peters@gmail.com>2002-07-16 19:30:59 (GMT)
commit012b69cb30761f500103ec66cb8f8229ca017a94 (patch)
tree7a9afcb1f28b4fe37984dbe20f211e69211af6a0
parent32a03967b7b233d168d9c18d53436bc98a25edf9 (diff)
downloadcpython-012b69cb30761f500103ec66cb8f8229ca017a94.zip
cpython-012b69cb30761f500103ec66cb8f8229ca017a94.tar.gz
cpython-012b69cb30761f500103ec66cb8f8229ca017a94.tar.bz2
The atexit module effectively turned itself off if sys.exitfunc already
existed at the time atexit first got imported. That's a bug, and this fixes it. Also reworked test_atexit.py to test for this too, and to stop using an "expected output" file, and to test what actually happens at exit instead of just simulating what it thinks atexit will do at exit. Bugfix candidate, but it's messy so I'll backport to 2.2 myself.
-rw-r--r--Lib/atexit.py14
-rw-r--r--Lib/test/output/test_atexit4
-rw-r--r--Lib/test/test_atexit.py59
3 files changed, 53 insertions, 24 deletions
diff --git a/Lib/atexit.py b/Lib/atexit.py
index 61f2458..b5929fc 100644
--- a/Lib/atexit.py
+++ b/Lib/atexit.py
@@ -29,15 +29,11 @@ def register(func, *targs, **kargs):
_exithandlers.append((func, targs, kargs))
import sys
-try:
- x = sys.exitfunc
-except AttributeError:
- sys.exitfunc = _run_exitfuncs
-else:
- # if x isn't our own exit func executive, assume it's another
- # registered exit function - append it to our list...
- if x != _run_exitfuncs:
- register(x)
+if hasattr(sys, "exitfunc"):
+ # Assume it's another registered exit function - append it to our list
+ register(sys.exitfunc)
+sys.exitfunc = _run_exitfuncs
+
del sys
if __name__ == "__main__":
diff --git a/Lib/test/output/test_atexit b/Lib/test/output/test_atexit
deleted file mode 100644
index 1cc01de..0000000
--- a/Lib/test/output/test_atexit
+++ /dev/null
@@ -1,4 +0,0 @@
-test_atexit
-handler2 (7,) {'kw': 'abc'}
-handler2 () {}
-handler1
diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py
index 517610b..07f5a7e 100644
--- a/Lib/test/test_atexit.py
+++ b/Lib/test/test_atexit.py
@@ -1,5 +1,9 @@
-# Test the exit module
-from test_support import verbose
+# Test the atexit module.
+from test_support import TESTFN, vereq
+import atexit
+import os
+
+input = """\
import atexit
def handler1():
@@ -8,17 +12,50 @@ def handler1():
def handler2(*args, **kargs):
print "handler2", args, kargs
-# save any exit functions that may have been registered as part of the
-# test framework
-_exithandlers = atexit._exithandlers
-atexit._exithandlers = []
-
atexit.register(handler1)
atexit.register(handler2)
atexit.register(handler2, 7, kw="abc")
+"""
+
+fname = TESTFN + ".py"
+f = file(fname, "w")
+f.write(input)
+f.close()
+
+p = os.popen("python " + fname)
+output = p.read()
+p.close()
+vereq(output, """\
+handler2 (7,) {'kw': 'abc'}
+handler2 () {}
+handler1
+""")
+
+input = """\
+def direct():
+ print "direct exit"
+
+import sys
+sys.exitfunc = direct
+
+# Make sure atexit doesn't drop
+def indirect():
+ print "indirect exit"
+
+import atexit
+atexit.register(indirect)
+"""
+
+f = file(fname, "w")
+f.write(input)
+f.close()
-# simulate exit behavior by calling atexit._run_exitfuncs directly...
-atexit._run_exitfuncs()
+p = os.popen("python " + fname)
+output = p.read()
+p.close()
+vereq(output, """\
+indirect exit
+direct exit
+""")
-# restore exit handlers
-atexit._exithandlers = _exithandlers
+os.unlink(fname)