]> granicus.if.org Git - python/commitdiff
Merged revisions 64119,64147,64150,64165,64219-64221,64229-64230,64233,64235,64253...
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 17 Jun 2008 21:11:29 +0000 (21:11 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 17 Jun 2008 21:11:29 +0000 (21:11 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r64119 | andrew.kuchling | 2008-06-11 14:53:14 +0200 (mer., 11 juin 2008) | 1 line

  Note PEP 371 section
........
  r64147 | benjamin.peterson | 2008-06-11 22:04:30 +0200 (mer., 11 juin 2008) | 2 lines

  update ACKS and NEWs for multiprocessing
........
  r64150 | georg.brandl | 2008-06-11 22:28:06 +0200 (mer., 11 juin 2008) | 2 lines

  Can we agree to put dots at entry ends? Thanks.
........
  r64165 | armin.rigo | 2008-06-12 11:50:58 +0200 (jeu., 12 juin 2008) | 3 lines

  Sounds obvious, but I didn't even realize that you can put non-string
  keys in type dictionaries without using this locals() hack.
........
  r64219 | neal.norwitz | 2008-06-13 08:00:46 +0200 (ven., 13 juin 2008) | 1 line

  Check for memory alloc failure
........
  r64220 | neal.norwitz | 2008-06-13 08:02:26 +0200 (ven., 13 juin 2008) | 3 lines

  Fix some memory dealloc problems when exceptions occur.
  It caused: "Fatal Python error: UNREF invalid object" in the DoubleTest.
........
  r64221 | neal.norwitz | 2008-06-13 08:03:25 +0200 (ven., 13 juin 2008) | 3 lines

  Fix typo in method name.  The LT class implemented less than.  The LE class
  should implement less than or equal to (as the code does).
........
  r64229 | georg.brandl | 2008-06-13 15:26:54 +0200 (ven., 13 juin 2008) | 2 lines

  Clarification.
........
  r64230 | robert.schuppenies | 2008-06-13 15:29:37 +0200 (ven., 13 juin 2008) | 2 lines

  Fixed: sys.getsizeof does not take the actual length of the tuples into account.
........
  r64233 | benjamin.peterson | 2008-06-13 17:11:50 +0200 (ven., 13 juin 2008) | 2 lines

  platform.uname now tries to fill empty values even when os.uname is present
........
  r64235 | benjamin.peterson | 2008-06-13 17:41:09 +0200 (ven., 13 juin 2008) | 1 line

  set svn:ignore on multiprocessing
........
  r64253 | andrew.kuchling | 2008-06-13 21:38:18 +0200 (ven., 13 juin 2008) | 1 line

  Typo fixes
........
  r64278 | martin.v.loewis | 2008-06-14 16:24:47 +0200 (sam., 14 juin 2008) | 2 lines

  Disable UAC by default.
........
  r64280 | gregory.p.smith | 2008-06-14 19:34:09 +0200 (sam., 14 juin 2008) | 3 lines

  silence the test when it is skipped on some platforms.  should fix a
  buildbot.
........
  r64301 | georg.brandl | 2008-06-15 21:54:36 +0200 (dim., 15 juin 2008) | 2 lines

  Forward-port new test from r64300.
........
  r64303 | raymond.hettinger | 2008-06-16 03:42:40 +0200 (lun., 16 juin 2008) | 1 line

  Issue 3116: fix quadratic behavior in marshal.dumps().
........
  r64320 | georg.brandl | 2008-06-16 23:00:47 +0200 (lun., 16 juin 2008) | 2 lines

  Add Jesse Noller to the developers list.
........
  r64328 | georg.brandl | 2008-06-17 11:01:35 +0200 (mar., 17 juin 2008) | 2 lines

  Split the HTML index.
........
  r64338 | vinay.sajip | 2008-06-17 13:02:14 +0200 (mar., 17 juin 2008) | 1 line

  Bug #3126: StreamHandler and FileHandler check before calling "flush" and "close" that the stream object has these, using hasattr (thanks to bobf for the patch).
........
  r64339 | vinay.sajip | 2008-06-17 13:04:02 +0200 (mar., 17 juin 2008) | 1 line

  Updated with fix for #3126.
........

18 files changed:
Doc/conf.py
Doc/library/optparse.rst
Doc/whatsnew/2.6.rst
Lib/logging/__init__.py
Lib/platform.py
Lib/test/crashers/loosing_mro_ref.py
Lib/test/test_grammar.py
Lib/test/test_heapq.py
Lib/test/test_struct.py
Lib/test/test_sys.py
Misc/ACKS
Misc/developers.txt
Modules/_ctypes/callproc.c
Modules/_struct.c
Modules/arraymodule.c
Objects/tupleobject.c
Python/marshal.c
Tools/msi/msilib.py

index 8b1514bae9e88d49327de294f292860c13d86eea..0cfbea60bfa4329c1b949317ec876bb2434dc067 100644 (file)
@@ -95,6 +95,9 @@ html_static_path = ['tools/sphinxext/static']
 # Output file base name for HTML help builder.
 htmlhelp_basename = 'python' + release.replace('.', '')
 
+# Split the index
+html_split_index = True
+
 
 # Options for LaTeX output
 # ------------------------
index 3bdfab4600033d2e247584d56887d1a619b9fdaf..bd0b02a8fc56ebb80f56a98ddce6695f62c67474 100644 (file)
@@ -636,9 +636,9 @@ Or, where the user fails to pass a value at all::
 option involved in the error; be sure to do the same when calling
 ``parser.error()`` from your application code.
 
-If :mod:`optparse`'s default error-handling behaviour does not suite your needs,
-you'll need to subclass OptionParser and override ``exit()`` and/or
-:meth:`error`.
+If :mod:`optparse`'s default error-handling behaviour does not suit your needs,
+you'll need to subclass OptionParser and override its :meth:`exit` and/or
+:meth:`error` methods.
 
 
 .. _optparse-putting-it-all-together:
index c4c909379a95641e210bf977baae6364961337c6..f3b03e760fd8314056e01693628f677cbd7428e9 100644 (file)
@@ -521,6 +521,21 @@ environment variable.
   
 .. ======================================================================
 
+.. _pep-0371:
+
+PEP 371: The ``multiprocessing`` Package
+=====================================================
+
+XXX write this.
+
+.. seealso::
+
+   :pep:`371` - Per-user ``site-packages`` Directory
+     PEP written by Jesse Noller and Richard Oudkerk; 
+     implemented by Jesse Noller.
+
+.. ======================================================================
+
 .. _pep-3101:
 
 PEP 3101: Advanced String Formatting
index 742eac2682bd342f233f37ba4d5142ab04e73a48..9727d4f091afcd259533ede9e3dfd7abf42359b7 100644 (file)
@@ -731,7 +731,7 @@ class StreamHandler(Handler):
         """
         Flushes the stream.
         """
-        if self.stream:
+        if self.stream and hasattr(self.stream, "flush"):
             self.stream.flush()
 
     def emit(self, record):
@@ -787,7 +787,8 @@ class FileHandler(StreamHandler):
         """
         if self.stream:
             self.flush()
-            self.stream.close()
+            if hasattr(self.stream, "close"):
+                self.stream.close()
             StreamHandler.close(self)
             self.stream = None
 
index 8447d41f67ae0d1aa054b73f7dd993739f344e50..33033ff0e0b41784535ef26b4b62d81b678992ba 100755 (executable)
@@ -1066,23 +1066,30 @@ def uname():
 
     """
     global _uname_cache
+    no_os_uname = 0
 
     if _uname_cache is not None:
         return _uname_cache
 
+    processor = ''
+
     # Get some infos from the builtin os.uname API...
     try:
         system,node,release,version,machine = os.uname()
-
     except AttributeError:
-        # Hmm, no uname... we'll have to poke around the system then.
-        system = sys.platform
-        release = ''
-        version = ''
-        node = _node()
-        machine = ''
-        processor = ''
-        use_syscmd_ver = 1
+        no_os_uname = 1
+
+    if no_os_uname or not filter(None, (system, node, release, version, machine)):
+        # Hmm, no there is either no uname or uname has returned
+        #'unknowns'... we'll have to poke around the system then.
+        if no_os_uname:
+            system = sys.platform
+            release = ''
+            version = ''
+            node = _node()
+            machine = ''
+
+        use_syscmd_ver = 01
 
         # Try win32_ver() on win32 platforms
         if system == 'win32':
@@ -1093,8 +1100,10 @@ def uname():
             # available on Win XP and later; see
             # http://support.microsoft.com/kb/888731 and
             # http://www.geocities.com/rick_lively/MANUALS/ENV/MSWIN/PROCESSI.HTM
-            machine = os.environ.get('PROCESSOR_ARCHITECTURE', '')
-            processor = os.environ.get('PROCESSOR_IDENTIFIER', machine)
+            if not machine:
+                machine = os.environ.get('PROCESSOR_ARCHITECTURE', '')
+            if not processor:
+                processor = os.environ.get('PROCESSOR_IDENTIFIER', machine)
 
         # Try the 'ver' system command available on some
         # platforms
@@ -1136,30 +1145,28 @@ def uname():
             release,(version,stage,nonrel),machine = mac_ver()
             system = 'MacOS'
 
-    else:
-        # System specific extensions
-        if system == 'OpenVMS':
-            # OpenVMS seems to have release and version mixed up
-            if not release or release == '0':
-                release = version
-                version = ''
-            # Get processor information
-            try:
-                import vms_lib
-            except ImportError:
-                pass
-            else:
-                csid, cpu_number = vms_lib.getsyi('SYI$_CPU',0)
-                if (cpu_number >= 128):
-                    processor = 'Alpha'
-                else:
-                    processor = 'VAX'
+    # System specific extensions
+    if system == 'OpenVMS':
+        # OpenVMS seems to have release and version mixed up
+        if not release or release == '0':
+            release = version
+            version = ''
+        # Get processor information
+        try:
+            import vms_lib
+        except ImportError:
+            pass
         else:
-            # Get processor information from the uname system command
-            processor = _syscmd_uname('-p','')
+            csid, cpu_number = vms_lib.getsyi('SYI$_CPU',0)
+            if (cpu_number >= 128):
+                processor = 'Alpha'
+            else:
+                processor = 'VAX'
+    if not processor:
+        # Get processor information from the uname system command
+        processor = _syscmd_uname('-p','')
 
-    # 'unknown' is not really any useful as information; we'll convert
-    # it to '' which is more portable
+    #If any unknowns still exist, replace them with ''s, which are more portable
     if system == 'unknown':
         system = ''
     if node == 'unknown':
index 5ecde638208b4efd7bd71a4718a755030d80b690..a8c6e63ee2bc7562c435b4541bb2784fdc2e3c86 100644 (file)
@@ -27,10 +27,9 @@ class Base(object):
 class Base2(object):
     mykey = 'from Base2'
 
-class X(Base):
-    # you can't add a non-string key to X.__dict__, but it can be
-    # there from the beginning :-)
-    locals()[MyKey()] = 5
+# you can't add a non-string key to X.__dict__, but it can be
+# there from the beginning :-)
+X = type('X', (Base,), {MyKey(): 5})
 
 print(X.mykey)
 # I get a segfault, or a slightly wrong assertion error in a debug build.
index 1a34ff8b74dd96d894d92a3a0f43472bbf5a0b60..acfe1f1573378beae5453ae9ba891e1a0a20c84c 100644 (file)
@@ -335,6 +335,7 @@ class GrammarTests(unittest.TestCase):
         self.assertEquals(l5(1, 2), 5)
         self.assertEquals(l5(1, 2, 3), 6)
         check_syntax_error(self, "lambda x: x = 2")
+        check_syntax_error(self, "lambda (None,): None")
         l6 = lambda x, y, *, k=20: x+y+k
         self.assertEquals(l6(1,2), 1+2+20)
         self.assertEquals(l6(1,2,k=10), 1+2+10)
index 1c7c97fa48e5122b687e96e15103d3da29ec0cf3..fba4fd71f855033772730baca995c60344d6b614 100644 (file)
@@ -211,10 +211,11 @@ class TestHeapC(TestHeap):
         class LE:
             def __init__(self, x):
                 self.x = x
-            def __lt__(self, other):
+            def __le__(self, other):
                 return self.x >= other.x
         data = [random.random() for i in range(100)]
         target = sorted(data, reverse=True)
+        print("HASATTR", hasattr(LE(0), "__lt__"), LE(0).__lt__)
         self.assertEqual(hsort(data, LT), target)
         self.assertEqual(hsort(data, LE), target)
 
index 917f62695bc77653ab2e79050e0063087a44733f..616e6658d54fd42b90ba01b5fd744172a36451d8 100644 (file)
@@ -8,6 +8,7 @@ from test.support import TestFailed, verbose, run_unittest, catch_warning
 
 import sys
 ISBIGENDIAN = sys.byteorder == "big"
+IS32BIT = sys.maxsize == 0x7fffffff
 del sys
 
 try:
@@ -580,6 +581,11 @@ class StructTest(unittest.TestCase):
             for c in [b'\x01', b'\x7f', b'\xff', b'\x0f', b'\xf0']:
                 self.assertTrue(struct.unpack('>?', c)[0])
 
+    if IS32BIT:
+        def test_crasher(self):
+            self.assertRaises(MemoryError, struct.pack, "357913941b", "a")
+
+
 def test_main():
     run_unittest(StructTest)
 
index 404980296938f7d5fc4f338b9be7a0eea34c7b0a..08fc909dcab7185d4d17bb61d0aeec5e46ef94f0 100644 (file)
@@ -520,6 +520,9 @@ class SizeofTest(unittest.TestCase):
         self.check_sizeof(32768, h + self.align(2) + 2)
         self.check_sizeof(32768*32768-1, h + self.align(2) + 2)
         self.check_sizeof(32768*32768, h + self.align(2) + 4)
+        # tuple
+        self.check_sizeof((), h)
+        self.check_sizeof((1,2,3), h + 3*p)
 
 
 def test_main():
index f34163ae00476cd7b1e223dc896b35ab050f3a61..31fd5d398ab24c9872ab46180c38ed3b0dcebf55 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -486,6 +486,7 @@ Samuel Nicolary
 Gustavo Niemeyer
 Oscar Nierstrasz
 Hrvoje Niksic
+Jesse Noller
 Bill Noon
 Stefan Norberg
 Tim Northover
@@ -502,6 +503,7 @@ Jason Orendorff
 Douglas Orr
 Denis S. Otkidach
 Michael Otteneder
+R. M. Oudkerk
 Russel Owen
 Ondrej Palkovsky
 Mike Pall
@@ -673,6 +675,7 @@ Steven Taschuk
 Monty Taylor
 Amy Taylor
 Tobias Thelen
+James Thomas
 Robin Thomas
 Eric Tiedemann
 Tracy Tims
index 2904a6840a5666f898e899153c53d4f699fbf080..9db80fb3589a4674ee889437d01bd5df95741b6d 100644 (file)
@@ -17,6 +17,9 @@ the format to accommodate documentation needs as they arise.
 Permissions History
 -------------------
 
+- Jesse Noller was given SVN access on 16 June 2008 by Georg Brandl,
+  for work on the multiprocessing module.
+
 - Gregor Lingl was given SVN access on 10 June 2008 by MvL,
   for work on the turtle module.
 
index 53677c066a103a5244b39d882036e537a7faae42..0a305ed89dee836b9eb75277859927fb89d3051d 100644 (file)
@@ -1815,6 +1815,8 @@ buffer_info(PyObject *self, PyObject *arg)
                return NULL;
        }
        shape = PyTuple_New(dict->ndim);
+       if (shape == NULL)
+               return NULL;
        for (i = 0; i < (int)dict->ndim; ++i)
                PyTuple_SET_ITEM(shape, i, PyLong_FromSsize_t(dict->shape[i]));
 
index e7cbd4bf11d491bf958fe157a579ea136e0e3254..6be4557acf9258aa8d23a9c87ad6bec1cc7e88fb 100644 (file)
@@ -1383,6 +1383,12 @@ prepare_s(PyStructObject *self)
                }
        }
 
+       /* check for overflow */
+       if ((len + 1) > (PY_SSIZE_T_MAX / sizeof(formatcode))) {
+               PyErr_NoMemory();
+               return -1;
+       }
+
        self->s_size = size;
        self->s_len = len;
        codes = PyMem_MALLOC((len + 1) * sizeof(formatcode));
index da2e9c2ceb90d93f4b4e8d8a6c1d90b58b12d991..3e263695999318725c8c95746ca298a3541aa71d 100644 (file)
@@ -421,6 +421,9 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
        if (op == NULL) {
                return NULL;
        }
+       op->ob_descr = descr;
+       op->allocated = size;
+       op->weakreflist = NULL;
        Py_SIZE(op) = size;
        if (size <= 0) {
                op->ob_item = NULL;
@@ -428,13 +431,10 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
        else {
                op->ob_item = PyMem_NEW(char, nbytes);
                if (op->ob_item == NULL) {
-                       PyObject_Del(op);
+                       Py_DECREF(op);
                        return PyErr_NoMemory();
                }
        }
-       op->ob_descr = descr;
-       op->allocated = size;
-       op->weakreflist = NULL;
         op->ob_exports = 0;
        return (PyObject *) op;
 }
@@ -808,11 +808,15 @@ array_do_extend(arrayobject *self, PyObject *bb)
                             "can only extend with array of same kind");
                return -1;
        }
+       if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
+               ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
+               PyErr_NoMemory();
+               return -1;
+       }
        size = Py_SIZE(self) + Py_SIZE(b);
         PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
         if (self->ob_item == NULL) {
-                PyObject_Del(self);
-                PyErr_NoMemory();
+               PyErr_NoMemory();
                return -1;
         }
        memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
index 819253c7c44a9a5bcc63155b8d104d81cf69183e..7ff957e66601e473724d1dbe9a6f34f0b9674b3c 100644 (file)
@@ -683,13 +683,25 @@ tuple_getnewargs(PyTupleObject *v)
        
 }
 
+static PyObject *
+tuple_sizeof(PyTupleObject *self)
+{
+       Py_ssize_t res;
+
+       res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
+       return PyLong_FromSsize_t(res);
+}
+
 PyDoc_STRVAR(index_doc,
 "T.index(value, [start, [stop]]) -> integer -- return first index of value");
 PyDoc_STRVAR(count_doc,
 "T.count(value) -> integer -- return number of occurrences of value");
+PyDoc_STRVAR(sizeof_doc,
+"T.__sizeof__() -- size of T in memory, in bytes");
 
 static PyMethodDef tuple_methods[] = {
        {"__getnewargs__",      (PyCFunction)tuple_getnewargs,  METH_NOARGS},
+       {"__sizeof__",  (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
        {"index",       (PyCFunction)tupleindex,  METH_VARARGS, index_doc},
        {"count",       (PyCFunction)tuplecount,  METH_O, count_doc},
        {NULL,          NULL}           /* sentinel */
index d4755c9d672e7dc052d4a0954bcd51bd014657e8..e3619a64affe02ea29ca16e955834abe9410f797 100644 (file)
@@ -70,7 +70,7 @@ w_more(int c, WFILE *p)
        size = PyBytes_Size(p->str);
        newsize = size + size + 1024;
        if (newsize > 32*1024*1024) {
-               newsize = size + 1024*1024;
+               newsize = size + (size >> 3);   /* 12.5% overallocation */
        }
        if (_PyBytes_Resize(&p->str, newsize) != 0) {
                p->ptr = p->end = NULL;
index 9245a22986f520bcfb0c1403a2c3152bfc633b06..6b8a2b52894c2f7aded460631e9b305b77efc536 100644 (file)
@@ -284,7 +284,8 @@ def add_stream(db, name, path):
 
 def init_database(name, schema,
                   ProductName, ProductCode, ProductVersion,
-                  Manufacturer):
+                  Manufacturer,
+                  request_uac = False):
     try:
         os.unlink(name)
     except OSError:
@@ -306,7 +307,11 @@ def init_database(name, schema,
     si.SetProperty(PID_AUTHOR, Manufacturer)
     si.SetProperty(PID_TEMPLATE, msi_type)
     si.SetProperty(PID_REVNUMBER, gen_uuid())
-    si.SetProperty(PID_WORDCOUNT, 2) # long file names, compressed, original media
+    if request_uac:
+        wc = 2 # long file names, compressed, original media
+    else:
+        wc = 2 | 8 # +never invoke UAC
+    si.SetProperty(PID_WORDCOUNT, wc)
     si.SetProperty(PID_PAGECOUNT, 200)
     si.SetProperty(PID_APPNAME, "Python MSI Library")
     # XXX more properties