diff options
author | Benjamin Peterson <benjamin@python.org> | 2010-03-21 22:03:03 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2010-03-21 22:03:03 (GMT) |
commit | 21896a330ab2531b33e5a885cf3d5b3b252fffee (patch) | |
tree | b3ee9bda5e8aaac1d476d09be41e29dd2139a2c6 | |
parent | 7588b8b355d81e21ea3d38cdf6b95f27fafa5be6 (diff) | |
download | cpython-21896a330ab2531b33e5a885cf3d5b3b252fffee.zip cpython-21896a330ab2531b33e5a885cf3d5b3b252fffee.tar.gz cpython-21896a330ab2531b33e5a885cf3d5b3b252fffee.tar.bz2 |
Merged revisions 77952,78030,78102,78104,78107,78206,78216,78296-78297,78328,78331-78332,78336,78339,78343,78378-78379,78415,78559,78717,78791 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77952 | mark.dickinson | 2010-02-03 10:50:14 -0600 (Wed, 03 Feb 2010) | 1 line
Fix test_inspect.py data to match recent change to inspect_fodder.py (r77942).
........
r78030 | benjamin.peterson | 2010-02-06 14:14:10 -0600 (Sat, 06 Feb 2010) | 1 line
check type_getattro for correctness in a descriptor corner case
........
r78102 | andrew.kuchling | 2010-02-07 19:35:35 -0600 (Sun, 07 Feb 2010) | 1 line
Move distutils into its own subsection; add various items
........
r78104 | andrew.kuchling | 2010-02-08 07:22:24 -0600 (Mon, 08 Feb 2010) | 1 line
Add two items; move a subsection
........
r78107 | antoine.pitrou | 2010-02-08 14:25:47 -0600 (Mon, 08 Feb 2010) | 3 lines
Clarify and correct description for ccbench and iobench.
........
r78206 | r.david.murray | 2010-02-16 11:55:26 -0600 (Tue, 16 Feb 2010) | 3 lines
Make the references to Popen in the description of Call
and check_call into links.
........
r78216 | andrew.kuchling | 2010-02-18 08:16:48 -0600 (Thu, 18 Feb 2010) | 1 line
Add various items
........
r78296 | andrew.kuchling | 2010-02-21 20:08:45 -0600 (Sun, 21 Feb 2010) | 1 line
Re-word
........
r78297 | andrew.kuchling | 2010-02-21 20:29:10 -0600 (Sun, 21 Feb 2010) | 1 line
#7076: mention SystemRandom class near start of the module docs; reword change description for clarity. Noted by Shawn Ligocki.
........
r78328 | jack.diederich | 2010-02-22 12:17:16 -0600 (Mon, 22 Feb 2010) | 1 line
fixes issue #7530, serve_forever()
........
r78331 | andrew.kuchling | 2010-02-22 12:38:23 -0600 (Mon, 22 Feb 2010) | 1 line
Fix comment typo
........
r78332 | andrew.kuchling | 2010-02-22 12:42:07 -0600 (Mon, 22 Feb 2010) | 2 lines
#7627: MH.remove() would fail if the MH mailbox was locked;
it would call _unlock_file() and pass it a closed file object. Noted by Rob Austein.
........
r78336 | jack.diederich | 2010-02-22 13:55:22 -0600 (Mon, 22 Feb 2010) | 1 line
fixes issue #1522237, bad init check in _threading_local
........
r78339 | jack.diederich | 2010-02-22 15:27:38 -0600 (Mon, 22 Feb 2010) | 1 line
* fix issue#7476
........
r78343 | andrew.kuchling | 2010-02-22 16:48:41 -0600 (Mon, 22 Feb 2010) | 10 lines
#2560: remove an unnecessary 'for' loop from my_fgets() in Parser/myreadline.c.
Noted by Joseph Armbruster; patch by Jessica McKellar.
The original code was 'for (;;) {...}', where ... ended
with a 'return -2' statement and did not contain a 'break' or 'continue'
statement. Therefore, the body of the loop is always executed once.
Once upon a time there was a 'continue' in the loop, but it was removed in
rev36346, committed by mwh on Wed Jul 7 17:44:12 2004.
........
r78378 | jack.diederich | 2010-02-23 11:23:30 -0600 (Tue, 23 Feb 2010) | 1 line
fixup markup error
........
r78379 | jack.diederich | 2010-02-23 13:34:06 -0600 (Tue, 23 Feb 2010) | 1 line
issue#6442 use in operator instead of has_key
........
r78415 | dirkjan.ochtman | 2010-02-23 22:00:52 -0600 (Tue, 23 Feb 2010) | 1 line
Issue #7733: add explicit reference in asyncore docs.
........
r78559 | andrew.kuchling | 2010-03-01 13:45:21 -0600 (Mon, 01 Mar 2010) | 1 line
#7637: update discussion of minidom.unlink() and garbage collection
........
r78717 | benjamin.peterson | 2010-03-05 21:13:33 -0600 (Fri, 05 Mar 2010) | 1 line
settscdump is definitely an implementation detail
........
r78791 | andrew.kuchling | 2010-03-08 06:00:39 -0600 (Mon, 08 Mar 2010) | 1 line
Add various items
........
-rw-r--r-- | Doc/distutils/sourcedist.rst | 6 | ||||
-rw-r--r-- | Doc/library/asyncore.rst | 3 | ||||
-rw-r--r-- | Doc/library/multiprocessing.rst | 6 | ||||
-rw-r--r-- | Doc/library/random.rst | 12 | ||||
-rw-r--r-- | Doc/library/subprocess.rst | 4 | ||||
-rw-r--r-- | Doc/library/sys.rst | 4 | ||||
-rw-r--r-- | Doc/library/xml.dom.minidom.rst | 22 | ||||
-rwxr-xr-x | Lib/mailbox.py | 12 | ||||
-rw-r--r-- | Lib/pipes.py | 3 | ||||
-rw-r--r-- | Lib/test/test_descr.py | 9 | ||||
-rw-r--r-- | Lib/test/test_inspect.py | 12 | ||||
-rw-r--r-- | Lib/test/test_mailbox.py | 7 | ||||
-rw-r--r-- | Lib/test/test_pipes.py | 2 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Modules/_cursesmodule.c | 2 | ||||
-rw-r--r-- | Parser/myreadline.c | 93 |
16 files changed, 106 insertions, 92 deletions
diff --git a/Doc/distutils/sourcedist.rst b/Doc/distutils/sourcedist.rst index 150d1e6..57e363b 100644 --- a/Doc/distutils/sourcedist.rst +++ b/Doc/distutils/sourcedist.rst @@ -54,9 +54,9 @@ Notes: requires the :program:`compress` program. Notice that this format is now pending for deprecation and will be removed in the future versions of Python. -When using any ``tar`` format (``gztar``, ``bztar``, ``ztar`` or ``tar``), you -can specify under Unix the ``owner`` and ``group`` names that will be set for -each member of the archive. +When using any ``tar`` format (``gztar``, ``bztar``, ``ztar`` or +``tar``) under Unix, you can specify the ``owner`` and ``group`` names +that will be set for each member of the archive. For example, if you want all files of the archive to be owned by root:: diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst index 60d4d03..e64d51d 100644 --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -201,7 +201,8 @@ any that have been added to the map during asynchronous service) is closed. .. method:: bind(address) Bind the socket to *address*. The socket must not already be bound. (The - format of *address* depends on the address family --- see above.) To mark + format of *address* depends on the address family --- refer to the + :mod:`socket` documentation for more information.) To mark the socket as re-usable (setting the :const:`SO_REUSEADDR` option), call the :class:`dispatcher` object's :meth:`set_reuse_addr` method. diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 6d7e768..48b1ccc 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1131,7 +1131,7 @@ their parent process exits. The manager classes are defined in the Create a BaseManager object. - Once created one should call :meth:`start` or :meth:`serve_forever` to ensure + Once created one should call :meth:`start` or ``get_server().serve_forever()`` to ensure that the manager object refers to a started manager process. *address* is the address on which the manager process listens for new @@ -1147,10 +1147,6 @@ their parent process exits. The manager classes are defined in the Start a subprocess to start the manager. If *initializer* is not ``None`` then the subprocess will call ``initializer(*initargs)`` when it starts. - .. method:: serve_forever() - - Run the server in the current process. - .. method:: get_server() Returns a :class:`Server` object which represents the actual server under diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 54211f4..bf89ade 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -35,6 +35,18 @@ basic generator of your own devising: in that case, override the :meth:`random`, Optionally, a new generator can supply a :meth:`getrandbits` method --- this allows :meth:`randrange` to produce selections over an arbitrarily large range. +As an example of subclassing, the :mod:`random` module provides the +:class:`WichmannHill` class that implements an alternative generator in pure +Python. The class provides a backward compatible way to reproduce results from +earlier versions of Python, which used the Wichmann-Hill algorithm as the core +generator. Note that this Wichmann-Hill generator can no longer be recommended: +its period is too short by contemporary standards, and the sequence generated is +known to fail some stringent randomness tests. See the references below for a +recent variant that repairs these flaws. + +The :mod:`random` module also provides the :class:`SystemRandom` class which +uses the system function :func:`os.urandom` to generate random numbers +from sources provided by the operating system. Bookkeeping functions: diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 3838cc6..13698e7 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -210,7 +210,7 @@ This module also defines four shortcut functions: Run command with arguments. Wait for command to complete, then return the :attr:`returncode` attribute. - The arguments are the same as for the Popen constructor. Example:: + The arguments are the same as for the :class:`Popen` constructor. Example:: >>> retcode = subprocess.call(["ls", "-l"]) @@ -229,7 +229,7 @@ This module also defines four shortcut functions: :exc:`CalledProcessError` object will have the return code in the :attr:`returncode` attribute. - The arguments are the same as for the Popen constructor. Example:: + The arguments are the same as for the :class:`Popen` constructor. Example:: >>> subprocess.check_call(["ls", "-l"]) 0 diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index c1a0027..6b9377d 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -816,6 +816,10 @@ always available. available only if Python was compiled with :option:`--with-tsc`. To understand the output of this dump, read :file:`Python/ceval.c` in the Python sources. + .. impl-detail:: + This function is intimately bound to CPython implementation details and + thus not likely to be implemented elsewhere. + .. data:: stdin stdout diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 98e7586..5ece1ca 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -82,22 +82,12 @@ document: the one that holds all others. Here is an example program:: dom3 = parseString("<myxml>Some data</myxml>") assert dom3.documentElement.tagName == "myxml" -When you are finished with a DOM, you should clean it up. This is necessary -because some versions of Python do not support garbage collection of objects -that refer to each other in a cycle. Until this restriction is removed from all -versions of Python, it is safest to write your code as if cycles would not be -cleaned up. - -The way to clean up a DOM is to call its :meth:`unlink` method:: - - dom1.unlink() - dom2.unlink() - dom3.unlink() - -:meth:`unlink` is a :mod:`xml.dom.minidom`\ -specific extension to the DOM API. -After calling :meth:`unlink` on a node, the node and its descendants are -essentially useless. - +When you are finished with a DOM tree, you may optionally call the +:meth:`unlink` method to encourage early cleanup of the now-unneeded +objects. :meth:`unlink` is a :mod:`xml.dom.minidom`\ -specific +extension to the DOM API that renders the node and its descendants are +essentially useless. Otherwise, Python's garbage collector will +eventually take care of the objects in the tree. .. seealso:: diff --git a/Lib/mailbox.py b/Lib/mailbox.py index c2c9b5c..e6f1735 100755 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -882,17 +882,9 @@ class MH(Mailbox): raise KeyError('No message with key: %s' % key) else: raise - try: - if self._locked: - _lock_file(f) - try: - f.close() - os.remove(os.path.join(self._path, str(key))) - finally: - if self._locked: - _unlock_file(f) - finally: + else: f.close() + os.remove(path) def __setitem__(self, key, message): """Replace the keyed message; raise KeyError if it doesn't exist.""" diff --git a/Lib/pipes.py b/Lib/pipes.py index 6a473ae..deab815 100644 --- a/Lib/pipes.py +++ b/Lib/pipes.py @@ -253,10 +253,13 @@ _safechars = string.ascii_letters + string.digits + '!@%_-+=:,./' # Safe unquote _funnychars = '"`$\\' # Unsafe inside "double quotes" def quote(file): + ''' return a shell-escaped version of the file string ''' for c in file: if c not in _safechars: break else: + if not file: + return "''" return file if '\'' not in file: return '\'' + file + '\'' diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 011cb6d..408f72b 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4164,6 +4164,15 @@ order (MRO) for bases """ x.a = 42 self.assertEqual(x.a, 42) + # Also check type_getattro for correctness. + class Meta(type): + pass + class X(object): + __metaclass__ = Meta + X.a = 42 + Meta.a = Descr("a") + self.assertEqual(X.a, 42) + def test_getattr_hooks(self): # issue 4230 diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 35fd775..1daab64 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -166,12 +166,12 @@ class TestInterpreterStack(IsTestBase): def test_trace(self): self.assertEqual(len(git.tr), 3) - self.assertEqual(revise(*git.tr[0][1:]), - (modfile, 43, 'argue', [' spam(a, b, c)\n'], 0)) - self.assertEqual(revise(*git.tr[1][1:]), - (modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0)) - self.assertEqual(revise(*git.tr[2][1:]), - (modfile, 18, 'eggs', [' q = y / 0\n'], 0)) + self.assertEqual(git.tr[0][1:], (modfile, 43, 'argue', + [' spam(a, b, c)\n'], 0)) + self.assertEqual(git.tr[1][1:], (modfile, 9, 'spam', + [' eggs(b + d, c + f)\n'], 0)) + self.assertEqual(git.tr[2][1:], (modfile, 18, 'eggs', + [' q = y / 0\n'], 0)) def test_frame(self): args, varargs, varkw, locals = inspect.getargvalues(mod.fr) diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index 83f34c7..73ee69f 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -968,6 +968,13 @@ class TestMH(TestMailbox): key0 = self._box.add(msg0) refmsg0 = self._box.get_message(key0) + def test_issue7627(self): + msg0 = mailbox.MHMessage(self._template % 0) + key0 = self._box.add(msg0) + self._box.lock() + self._box.remove(key0) + self._box.unlock() + def test_pack(self): # Pack the contents of the mailbox msg0 = mailbox.MHMessage(self._template % 0) diff --git a/Lib/test/test_pipes.py b/Lib/test/test_pipes.py index 7b78097..9ce137e 100644 --- a/Lib/test/test_pipes.py +++ b/Lib/test/test_pipes.py @@ -82,6 +82,8 @@ class SimplePipeTests(unittest.TestCase): self.assertEqual(pipes.quote("test%s'name'" % u), '"test\\%s\'name\'"' % u) + self.assertEqual(pipes.quote(''), "''") + def testRepr(self): t = pipes.Template() self.assertEqual(repr(t), "<Template instance, steps=[]>") @@ -832,6 +832,7 @@ Blake Winton Jean-Claude Wippler Frank Wierzbicki Lars Wirzenius +John Wiseman Chris Withers Stefan Witzel Irek Wlizlo diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index a89c22b..708af0a 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -215,7 +215,7 @@ PyCurses_ConvertToChtype(PyObject *obj, chtype *ch) return 1; } -/* Function versions of the 3 functions for tested whether curses has been +/* Function versions of the 3 functions for testing whether curses has been initialised or not. */ static int func_PyCursesSetupTermCalled(void) diff --git a/Parser/myreadline.c b/Parser/myreadline.c index a144850..0d8394b 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -36,66 +36,63 @@ static int my_fgets(char *buf, int len, FILE *fp) { char *p; - for (;;) { - if (PyOS_InputHook != NULL) - (void)(PyOS_InputHook)(); - errno = 0; - p = fgets(buf, len, fp); - if (p != NULL) - return 0; /* No error */ + if (PyOS_InputHook != NULL) + (void)(PyOS_InputHook)(); + errno = 0; + p = fgets(buf, len, fp); + if (p != NULL) + return 0; /* No error */ #ifdef MS_WINDOWS - /* In the case of a Ctrl+C or some other external event - interrupting the operation: - Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32 - error code (and feof() returns TRUE). - Win9x: Ctrl+C seems to have no effect on fgets() returning - early - the signal handler is called, but the fgets() - only returns "normally" (ie, when Enter hit or feof()) + /* In the case of a Ctrl+C or some other external event + interrupting the operation: + Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32 + error code (and feof() returns TRUE). + Win9x: Ctrl+C seems to have no effect on fgets() returning + early - the signal handler is called, but the fgets() + only returns "normally" (ie, when Enter hit or feof()) + */ + if (GetLastError()==ERROR_OPERATION_ABORTED) { + /* Signals come asynchronously, so we sleep a brief + moment before checking if the handler has been + triggered (we cant just return 1 before the + signal handler has been called, as the later + signal may be treated as a separate interrupt). */ - if (GetLastError()==ERROR_OPERATION_ABORTED) { - /* Signals come asynchronously, so we sleep a brief - moment before checking if the handler has been - triggered (we cant just return 1 before the - signal handler has been called, as the later - signal may be treated as a separate interrupt). - */ - Sleep(1); - if (PyOS_InterruptOccurred()) { - return 1; /* Interrupt */ - } - /* Either the sleep wasn't long enough (need a - short loop retrying?) or not interrupted at all - (in which case we should revisit the whole thing!) - Logging some warning would be nice. assert is not - viable as under the debugger, the various dialogs - mean the condition is not true. - */ + Sleep(1); + if (PyOS_InterruptOccurred()) { + return 1; /* Interrupt */ } + /* Either the sleep wasn't long enough (need a + short loop retrying?) or not interrupted at all + (in which case we should revisit the whole thing!) + Logging some warning would be nice. assert is not + viable as under the debugger, the various dialogs + mean the condition is not true. + */ + } #endif /* MS_WINDOWS */ - if (feof(fp)) { - return -1; /* EOF */ - } + if (feof(fp)) { + return -1; /* EOF */ + } #ifdef EINTR - if (errno == EINTR) { - int s; + if (errno == EINTR) { + int s; #ifdef WITH_THREAD - PyEval_RestoreThread(_PyOS_ReadlineTState); + PyEval_RestoreThread(_PyOS_ReadlineTState); #endif - s = PyErr_CheckSignals(); + s = PyErr_CheckSignals(); #ifdef WITH_THREAD - PyEval_SaveThread(); + PyEval_SaveThread(); #endif - if (s < 0) { - return 1; - } + if (s < 0) { + return 1; } + } #endif - if (PyOS_InterruptOccurred()) { - return 1; /* Interrupt */ - } - return -2; /* Error */ + if (PyOS_InterruptOccurred()) { + return 1; /* Interrupt */ } - /* NOTREACHED */ + return -2; /* Error */ } |