[Python-checkins] r73623 - in python/branches/py3k: Doc/library/stdtypes.rst Doc/library/symtable.rst Doc/library/timeit.rst Lib/email/mime/nonmultipart.py Lib/pydoc.py Lib/test/test_coding.py Lib/test/test_extcall.py Lib/test/test_pydoc.py Lib/xml/sax/expatreader.py Misc/ACKS Modules/_ssl.c Modules/_struct.c Objects/funcobject.c Parser/tokenizer.c Python/compile.c

benjamin.peterson python-checkins at python.org
Sun Jun 28 19:22:03 CEST 2009


Author: benjamin.peterson
Date: Sun Jun 28 19:22:03 2009
New Revision: 73623

Log:
Merged revisions 73004,73439,73496,73509,73529,73564,73576-73577,73595-73596,73605 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r73004 | jeffrey.yasskin | 2009-05-28 22:44:31 -0500 (Thu, 28 May 2009) | 5 lines
  
  Fix nearly all compilation warnings under Apple gcc-4.0.  Tested with OPT="-g
  -Wall -Wstrict-prototypes -Werror" in both --with-pydebug mode and --without.
  There's still a batch of non-prototype warnings in Xlib.h that I don't know how
  to fix.
........
  r73439 | benjamin.peterson | 2009-06-15 19:29:31 -0500 (Mon, 15 Jun 2009) | 1 line
  
  don't mask encoding errors when decoding a string #6289
........
  r73496 | vinay.sajip | 2009-06-21 12:37:27 -0500 (Sun, 21 Jun 2009) | 1 line
  
  Issue #6314: logging.basicConfig() performs extra checks on the "level" argument.
........
  r73509 | amaury.forgeotdarc | 2009-06-22 14:33:48 -0500 (Mon, 22 Jun 2009) | 2 lines
  
  #4490 Fix sample code run by "python -m xml.sax.xmlreader"
........
  r73529 | r.david.murray | 2009-06-23 13:02:46 -0500 (Tue, 23 Jun 2009) | 4 lines
  
  Fix issue 5230 by having pydoc's safeimport check to see if the import
  error was thrown from itself in order to decide if the module can't be
  found.  Thanks to Lucas Prado Melo for collaborating on the fix and tests.
........
  r73564 | amaury.forgeotdarc | 2009-06-25 17:29:29 -0500 (Thu, 25 Jun 2009) | 6 lines
  
  #2016 Fix a crash in function call when the **kwargs dictionary is mutated
  during the function call setup.
  
  This even gives a slight speedup, probably because tuple allocation
  is faster than PyMem_NEW.
........
  r73576 | benjamin.peterson | 2009-06-26 18:37:06 -0500 (Fri, 26 Jun 2009) | 1 line
  
  document is_declared_global()
........
  r73577 | benjamin.peterson | 2009-06-27 09:16:23 -0500 (Sat, 27 Jun 2009) | 1 line
  
  link to extensive generator docs in the reference manual
........
  r73595 | ezio.melotti | 2009-06-27 18:45:39 -0500 (Sat, 27 Jun 2009) | 1 line
  
  stmt and setup can contain multiple statements, see #5896
........
  r73596 | ezio.melotti | 2009-06-27 19:07:45 -0500 (Sat, 27 Jun 2009) | 1 line
  
  Fixed a wrong apostrophe
........
  r73605 | georg.brandl | 2009-06-28 07:10:18 -0500 (Sun, 28 Jun 2009) | 1 line
  
  Remove stray pychecker directive.
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Doc/library/stdtypes.rst
   python/branches/py3k/Doc/library/symtable.rst
   python/branches/py3k/Doc/library/timeit.rst
   python/branches/py3k/Lib/email/mime/nonmultipart.py
   python/branches/py3k/Lib/pydoc.py
   python/branches/py3k/Lib/test/test_coding.py
   python/branches/py3k/Lib/test/test_extcall.py
   python/branches/py3k/Lib/test/test_pydoc.py
   python/branches/py3k/Lib/xml/sax/expatreader.py
   python/branches/py3k/Misc/ACKS
   python/branches/py3k/Modules/_ssl.c
   python/branches/py3k/Modules/_struct.c
   python/branches/py3k/Objects/funcobject.c
   python/branches/py3k/Parser/tokenizer.c
   python/branches/py3k/Python/compile.c

Modified: python/branches/py3k/Doc/library/stdtypes.rst
==============================================================================
--- python/branches/py3k/Doc/library/stdtypes.rst	(original)
+++ python/branches/py3k/Doc/library/stdtypes.rst	Sun Jun 28 19:22:03 2009
@@ -583,10 +583,18 @@
 continue to do so on subsequent calls.  Implementations that do not obey this
 property are deemed broken.
 
+
+.. _generator-types:
+
+Generator Types
+---------------
+
 Python's :term:`generator`\s provide a convenient way to implement the iterator
 protocol.  If a container object's :meth:`__iter__` method is implemented as a
 generator, it will automatically return an iterator object (technically, a
 generator object) supplying the :meth:`__iter__` and :meth:`__next__` methods.
+More information about generators can be found in :ref:`the documentation for
+the yield expression <yieldexpr>`.
 
 
 .. _typesseq:

Modified: python/branches/py3k/Doc/library/symtable.rst
==============================================================================
--- python/branches/py3k/Doc/library/symtable.rst	(original)
+++ python/branches/py3k/Doc/library/symtable.rst	Sun Jun 28 19:22:03 2009
@@ -144,6 +144,10 @@
 
       Return ``True`` if the symbol is global.
 
+   .. method:: is_declared_global()
+
+      Return ``True`` if the symbol is declared global with a global statement.
+
    .. method:: is_local()
 
       Return ``True`` if the symbol is local to its block.

Modified: python/branches/py3k/Doc/library/timeit.rst
==============================================================================
--- python/branches/py3k/Doc/library/timeit.rst	(original)
+++ python/branches/py3k/Doc/library/timeit.rst	Sun Jun 28 19:22:03 2009
@@ -24,8 +24,9 @@
 
    The constructor takes a statement to be timed, an additional statement used for
    setup, and a timer function.  Both statements default to ``'pass'``; the timer
-   function is platform-dependent (see the module doc string).  The statements may
-   contain newlines, as long as they don't contain multi-line string literals.
+   function is platform-dependent (see the module doc string).  *stmt* and *setup*
+   may also contain multiple statements separated by ``;`` or newlines, as long as
+   they don't contain multi-line string literals.
 
    To measure the execution time of the first statement, use the :meth:`timeit`
    method.  The :meth:`repeat` method is a convenience to call :meth:`timeit`

Modified: python/branches/py3k/Lib/email/mime/nonmultipart.py
==============================================================================
--- python/branches/py3k/Lib/email/mime/nonmultipart.py	(original)
+++ python/branches/py3k/Lib/email/mime/nonmultipart.py	Sun Jun 28 19:22:03 2009
@@ -14,13 +14,9 @@
 class MIMENonMultipart(MIMEBase):
     """Base class for MIME multipart/* type messages."""
 
-    __pychecker__ = 'unusednames=payload'
-
     def attach(self, payload):
         # The public API prohibits attaching multiple subparts to MIMEBase
         # derived subtypes since none of them are, by definition, of content
         # type multipart/*
         raise errors.MultipartConversionError(
             'Cannot attach additional subparts to non-multipart/*')
-
-    del __pychecker__

Modified: python/branches/py3k/Lib/pydoc.py
==============================================================================
--- python/branches/py3k/Lib/pydoc.py	(original)
+++ python/branches/py3k/Lib/pydoc.py	Sun Jun 28 19:22:03 2009
@@ -54,6 +54,7 @@
 
 import sys, imp, os, re, inspect, builtins, pkgutil
 from reprlib import Repr
+from traceback import extract_tb as _extract_tb
 try:
     from collections import deque
 except ImportError:
@@ -292,9 +293,9 @@
         elif exc is SyntaxError:
             # A SyntaxError occurred before we could execute the module.
             raise ErrorDuringImport(value.filename, info)
-        elif exc is ImportError and \
-             str(value).lower().split()[:2] == ['no', 'module']:
-            # The module was not found.
+        elif exc is ImportError and _extract_tb(tb)[-1][2]=='safeimport':
+            # The import error occurred directly in this function,
+            # which means there is no such module in the path.
             return None
         else:
             # Some other error occurred during the importing process.

Modified: python/branches/py3k/Lib/test/test_coding.py
==============================================================================
--- python/branches/py3k/Lib/test/test_coding.py	(original)
+++ python/branches/py3k/Lib/test/test_coding.py	Sun Jun 28 19:22:03 2009
@@ -49,6 +49,18 @@
             unlink(TESTFN+".pyc")
             sys.path.pop(0)
 
+    def test_error_from_string(self):
+        # See http://bugs.python.org/issue6289
+        input = "# coding: ascii\n\N{SNOWMAN}".encode('utf-8')
+        try:
+            compile(input, "<string>", "exec")
+        except SyntaxError as e:
+            expected = "'ascii' codec can't decode byte 0xe2 in position 16: " \
+                "ordinal not in range(128)"
+            self.assertTrue(str(e).startswith(expected))
+        else:
+            self.fail("didn't raise")
+
 def test_main():
     test.support.run_unittest(CodingTest)
 

Modified: python/branches/py3k/Lib/test/test_extcall.py
==============================================================================
--- python/branches/py3k/Lib/test/test_extcall.py	(original)
+++ python/branches/py3k/Lib/test/test_extcall.py	Sun Jun 28 19:22:03 2009
@@ -243,6 +243,24 @@
       ...
     TypeError: id() takes no keyword arguments
 
+A corner case of keyword dictionary items being deleted during
+the function call setup. See <http://bugs.python.org/issue2016>.
+
+    >>> class Name(str):
+    ...     def __eq__(self, other):
+    ...         try:
+    ...              del x[self]
+    ...         except KeyError:
+    ...              pass
+    ...         return str.__eq__(self, other)
+    ...     def __hash__(self):
+    ...         return str.__hash__(self)
+
+    >>> x = {Name("a"):1, Name("b"):2}
+    >>> def f(a, b):
+    ...     print(a,b)
+    >>> f(**x)
+    1 2
 """
 
 from test import support

Modified: python/branches/py3k/Lib/test/test_pydoc.py
==============================================================================
--- python/branches/py3k/Lib/test/test_pydoc.py	(original)
+++ python/branches/py3k/Lib/test/test_pydoc.py	Sun Jun 28 19:22:03 2009
@@ -1,5 +1,6 @@
 import sys
 import os
+import os.path
 import difflib
 import subprocess
 import re
@@ -7,6 +8,8 @@
 import inspect
 import unittest
 import test.support
+from contextlib import contextmanager
+from test.support import TESTFN, forget, rmtree, EnvironmentVarGuard
 
 from test import pydoc_mod
 
@@ -183,6 +186,9 @@
 # output pattern for missing module
 missing_pattern = "no Python documentation found for '%s'"
 
+# output pattern for module with bad imports
+badimport_pattern = "problem in %s - ImportError: No module named %s"
+
 def run_pydoc(module_name, *args):
     """
     Runs pydoc on the specified module. Returns the stripped
@@ -254,6 +260,42 @@
         self.assertEqual(expected, result,
             "documentation for missing module found")
 
+    def test_badimport(self):
+        # This tests the fix for issue 5230, where if pydoc found the module
+        # but the module had an internal import error pydoc would report no doc
+        # found.
+        modname = 'testmod_xyzzy'
+        testpairs = (
+            ('i_am_not_here', 'i_am_not_here'),
+            ('test.i_am_not_here_either', 'i_am_not_here_either'),
+            ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'),
+            ('i_am_not_here.{}'.format(modname), 'i_am_not_here.{}'.format(modname)),
+            ('test.{}'.format(modname), modname),
+            )
+
+        @contextmanager
+        def newdirinpath(dir):
+            os.mkdir(dir)
+            sys.path.insert(0, dir)
+            yield
+            sys.path.pop(0)
+            rmtree(dir)
+
+        with newdirinpath(TESTFN), EnvironmentVarGuard() as env:
+            env['PYTHONPATH'] = TESTFN
+            fullmodname = os.path.join(TESTFN, modname)
+            sourcefn = fullmodname + os.extsep + "py"
+            for importstring, expectedinmsg in testpairs:
+                f = open(sourcefn, 'w')
+                f.write("import {}\n".format(importstring))
+                f.close()
+                try:
+                    result = run_pydoc(modname).decode("ascii")
+                finally:
+                    forget(modname)
+                expected = badimport_pattern % (modname, expectedinmsg)
+                self.assertEqual(expected, result)
+
     def test_input_strip(self):
         missing_module = " test.i_am_not_here "
         result = str(run_pydoc(missing_module), 'ascii')

Modified: python/branches/py3k/Lib/xml/sax/expatreader.py
==============================================================================
--- python/branches/py3k/Lib/xml/sax/expatreader.py	(original)
+++ python/branches/py3k/Lib/xml/sax/expatreader.py	Sun Jun 28 19:22:03 2009
@@ -407,8 +407,8 @@
 # ---
 
 if __name__ == "__main__":
-    import xml.sax
+    import xml.sax.saxutils
     p = create_parser()
-    p.setContentHandler(xml.sax.XMLGenerator())
+    p.setContentHandler(xml.sax.saxutils.XMLGenerator())
     p.setErrorHandler(xml.sax.ErrorHandler())
-    p.parse("../../../hamlet.xml")
+    p.parse("http://www.ibiblio.org/xml/examples/shakespeare/hamlet.xml")

Modified: python/branches/py3k/Misc/ACKS
==============================================================================
--- python/branches/py3k/Misc/ACKS	(original)
+++ python/branches/py3k/Misc/ACKS	Sun Jun 28 19:22:03 2009
@@ -482,6 +482,7 @@
 Craig McPheeters
 Lambert Meertens
 Bill van Melle
+Lucas Prado Melo
 Luke Mewburn
 Mike Meyer
 Steven Miale

Modified: python/branches/py3k/Modules/_ssl.c
==============================================================================
--- python/branches/py3k/Modules/_ssl.c	(original)
+++ python/branches/py3k/Modules/_ssl.c	Sun Jun 28 19:22:03 2009
@@ -658,7 +658,7 @@
 	char buf[2048];
 	char *vptr;
 	int len;
-	const unsigned char *p;
+	unsigned char *p;
 
 	if (certificate == NULL)
 		return peer_alt_names;

Modified: python/branches/py3k/Modules/_struct.c
==============================================================================
--- python/branches/py3k/Modules/_struct.c	(original)
+++ python/branches/py3k/Modules/_struct.c	Sun Jun 28 19:22:03 2009
@@ -132,6 +132,7 @@
 
 /* Same, but handling unsigned long */
 
+#ifndef PY_STRUCT_OVERFLOW_MASKING
 static int
 get_ulong(PyObject *v, unsigned long *p)
 {
@@ -152,6 +153,7 @@
 	*p = x;
 	return 0;
 }
+#endif  /* PY_STRUCT_OVERFLOW_MASKING */
 
 #ifdef HAVE_LONG_LONG
 

Modified: python/branches/py3k/Objects/funcobject.c
==============================================================================
--- python/branches/py3k/Objects/funcobject.c	(original)
+++ python/branches/py3k/Objects/funcobject.c	Sun Jun 28 19:22:03 2009
@@ -593,13 +593,14 @@
 {
 	PyObject *result;
 	PyObject *argdefs;
+	PyObject *kwtuple = NULL;
 	PyObject **d, **k;
 	Py_ssize_t nk, nd;
 
 	argdefs = PyFunction_GET_DEFAULTS(func);
 	if (argdefs != NULL && PyTuple_Check(argdefs)) {
 		d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
-		nd = PyTuple_Size(argdefs);
+		nd = PyTuple_GET_SIZE(argdefs);
 	}
 	else {
 		d = NULL;
@@ -609,16 +610,17 @@
 	if (kw != NULL && PyDict_Check(kw)) {
 		Py_ssize_t pos, i;
 		nk = PyDict_Size(kw);
-		k = PyMem_NEW(PyObject *, 2*nk);
-		if (k == NULL) {
-			PyErr_NoMemory();
+		kwtuple = PyTuple_New(2*nk);
+		if (kwtuple == NULL)
 			return NULL;
-		}
+		k = &PyTuple_GET_ITEM(kwtuple, 0);
 		pos = i = 0;
-		while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
+		while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) {
+			Py_INCREF(k[i]);
+			Py_INCREF(k[i+1]);
 			i += 2;
+		}
 		nk = i/2;
-		/* XXX This is broken if the caller deletes dict items! */
 	}
 	else {
 		k = NULL;
@@ -628,13 +630,12 @@
 	result = PyEval_EvalCodeEx(
 		(PyCodeObject *)PyFunction_GET_CODE(func),
 		PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
-		&PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
+		&PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg),
 		k, nk, d, nd,
 		PyFunction_GET_KW_DEFAULTS(func),
 		PyFunction_GET_CLOSURE(func));
 
-	if (k != NULL)
-		PyMem_DEL(k);
+	Py_XDECREF(kwtuple);
 
 	return result;
 }

Modified: python/branches/py3k/Parser/tokenizer.c
==============================================================================
--- python/branches/py3k/Parser/tokenizer.c	(original)
+++ python/branches/py3k/Parser/tokenizer.c	Sun Jun 28 19:22:03 2009
@@ -682,11 +682,8 @@
 	if (tok->enc != NULL) {
 		assert(utf8 == NULL);
 		utf8 = translate_into_utf8(str, tok->enc);
-		if (utf8 == NULL) {
-			PyErr_Format(PyExc_SyntaxError,
-				"unknown encoding: %s", tok->enc);
+		if (utf8 == NULL)
 			return error_ret(tok);
-		}
 		str = PyBytes_AS_STRING(utf8);
 	}
 	assert(tok->decoding_buffer == NULL);

Modified: python/branches/py3k/Python/compile.c
==============================================================================
--- python/branches/py3k/Python/compile.c	(original)
+++ python/branches/py3k/Python/compile.c	Sun Jun 28 19:22:03 2009
@@ -551,18 +551,6 @@
 
 }
 
-/* Allocate a new "anonymous" local variable.
-   Used by list comprehensions and with statements.
-*/
-
-static PyObject *
-compiler_new_tmpname(struct compiler *c)
-{
-	char tmpname[256];
-	PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
-	return PyUnicode_FromString(tmpname);
-}
-
 /* Allocate a new block and return a pointer to it.
    Returns NULL on error.
 */


More information about the Python-checkins mailing list