]> granicus.if.org Git - python/commitdiff
Merged revisions 65339-65340,65342 via svnmerge from
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Fri, 1 Aug 2008 01:06:32 +0000 (01:06 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Fri, 1 Aug 2008 01:06:32 +0000 (01:06 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r65339 | amaury.forgeotdarc | 2008-07-31 23:28:03 +0200 (jeu., 31 juil. 2008) | 5 lines

  #3479: unichr(2**32) used to return u'\x00'.
  The argument was fetched in a long, but PyUnicode_FromOrdinal takes an int.

  (why doesn't gcc issue a truncation warning in this case?)
........
  r65340 | amaury.forgeotdarc | 2008-07-31 23:35:03 +0200 (jeu., 31 juil. 2008) | 2 lines

  Remove a dummy test that was checked in by mistake
........
  r65342 | amaury.forgeotdarc | 2008-08-01 01:39:05 +0200 (ven., 01 août 2008) | 8 lines

  Correct a crash when two successive unicode allocations fail with a MemoryError:
  the freelist contained half-initialized objects with freed pointers.

  The comment
  /* XXX UNREF/NEWREF interface should be more symmetrical */
  was copied from tupleobject.c, and appears in some other places.
  I sign the petition.
........

Lib/test/test_builtin.py
Lib/test/test_exceptions.py
Lib/test/test_unicode.py
Objects/unicodeobject.c
Python/bltinmodule.c

index 7a898b25de4a4c2450293e74e6e516b10ee35ad7..f8d4ae0e44d6c1559b177586fd0d801a80aee471 100644 (file)
@@ -216,6 +216,7 @@ class BuiltinTest(unittest.TestCase):
         self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
         self.assertRaises(ValueError, chr, -1)
         self.assertRaises(ValueError, chr, 0x00110000)
+        self.assertRaises((OverflowError, ValueError), chr, 2**32)
 
     def test_cmp(self):
         self.assertEqual(cmp(-1, 1), -1)
index b742fcefd735d267d71b0a0692384cbeeb7e22ce..95c2dd143b318f7fceb1782bf3124718436d7518 100644 (file)
@@ -12,14 +12,6 @@ from test.support import TESTFN, unlink, run_unittest, captured_output
 
 class ExceptionTests(unittest.TestCase):
 
-    def test00(self):
-        try:
-            sys.exit(ValueError('aaa'))
-        except SystemExit:
-            pass
-        finally:
-            pass
-
     def raise_catch(self, exc, excname):
         try:
             raise exc("spam")
index 604fdf28ed40a8dafe109bb4226276dbcb045dfc..fdd90ca1665ea55ff00b28e6ab0f663e8777a0e3 100644 (file)
@@ -1156,6 +1156,20 @@ class UnicodeTest(
         self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxsize)
 
 
+    def test_raiseMemError(self):
+        # Ensure that the freelist contains a consistent object, even
+        # when a string allocation fails with a MemoryError.
+        # This used to crash the interpreter,
+        # or leak references when the number was smaller.
+        try:
+            "a" * (sys.maxsize // 2 - 100)
+        except MemoryError:
+            pass
+        try:
+            "a" * (sys.maxsize // 2 - 100)
+        except MemoryError:
+            pass
+
 def test_main():
     support.run_unittest(__name__)
 
index 838f537e02bf3e23eb12c0a90727c0168d296599..5925f8077f552fdceee7689f0f35e6dc4bd8a2cb 100644 (file)
@@ -322,7 +322,7 @@ PyUnicodeObject *_PyUnicode_New(Py_ssize_t length)
            if ((unicode->length < length) &&
                 unicode_resize(unicode, length) < 0) {
                PyObject_DEL(unicode->str);
-               goto onError;
+               unicode->str = NULL;
            }
        }
         else {
@@ -360,6 +360,8 @@ PyUnicodeObject *_PyUnicode_New(Py_ssize_t length)
     return unicode;
 
  onError:
+    /* XXX UNREF/NEWREF interface should be more symmetrical */
+    _Py_DEC_REFTOTAL;
     _Py_ForgetReference((PyObject *)unicode);
     PyObject_Del(unicode);
     return NULL;
index 723c307b8f05d982415f5e121ef98c21e95a7634..27a3d8c005e79fa96b58ea2594266cd2fd6388ff 100644 (file)
@@ -454,9 +454,9 @@ format_spec defaults to \"\"");
 static PyObject *
 builtin_chr(PyObject *self, PyObject *args)
 {
-       long x;
+       int x;
 
-       if (!PyArg_ParseTuple(args, "l:chr", &x))
+       if (!PyArg_ParseTuple(args, "i:chr", &x))
                return NULL;
 
        return PyUnicode_FromOrdinal(x);