]> granicus.if.org Git - python/commitdiff
SF #1693079 Array module cannot pickle empty arrays
authorRaymond Hettinger <python@rcn.com>
Mon, 2 Apr 2007 17:03:46 +0000 (17:03 +0000)
committerRaymond Hettinger <python@rcn.com>
Mon, 2 Apr 2007 17:03:46 +0000 (17:03 +0000)
Lib/test/test_array.py
Misc/NEWS
Modules/arraymodule.c

index 63e7f4ebb68fe38fe428e8f39d5c6eb22f742641..597f3b24219556185f2a11bc2544e1cd30695d5b 100755 (executable)
@@ -111,6 +111,21 @@ class BaseTest(unittest.TestCase):
             self.assertEqual(a.x, b.x)
             self.assertEqual(type(a), type(b))
 
+    def test_pickle_for_empty_array(self):
+        for protocol in (0, 1, 2):
+            a = array.array(self.typecode)
+            b = loads(dumps(a, protocol))
+            self.assertNotEqual(id(a), id(b))
+            self.assertEqual(a, b)
+
+            a = ArraySubclass(self.typecode)
+            a.x = 10
+            b = loads(dumps(a, protocol))
+            self.assertNotEqual(id(a), id(b))
+            self.assertEqual(a, b)
+            self.assertEqual(a.x, b.x)
+            self.assertEqual(type(a), type(b))
+
     def test_insert(self):
         a = array.array(self.typecode, self.example)
         a.insert(0, self.example[0])
index c795b80b16ff9518906f25f88ac0116733d10fe5..34d4d095b464d9c8c3fa689622c56a13a2c11579 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -134,6 +134,8 @@ Core and builtins
 Extension Modules
 -----------------
 
+- Bug #1693079: The array module can now successfully pickle empty arrays.
+
 - Bug #1688393: Prevent crash in socket.recvfrom if length is negative.
 
 - Bug #1622896: fix a rare corner case where the bz2 module raised an
index 210ada60f72483c23b33803500866cefdd57a8f3..0aeb64eeeee6d3056129e05e4ab66746432a8fa1 100644 (file)
@@ -1147,12 +1147,19 @@ array_reduce(arrayobject *array)
                dict = Py_None;
                Py_INCREF(dict);
        }
-       result = Py_BuildValue("O(cs#)O", 
-               array->ob_type, 
-               array->ob_descr->typecode,
-               array->ob_item,
-               array->ob_size * array->ob_descr->itemsize,
-               dict);
+       if (array->ob_size > 0) {
+               result = Py_BuildValue("O(cs#)O", 
+                       array->ob_type, 
+                       array->ob_descr->typecode,
+                       array->ob_item,
+                       array->ob_size * array->ob_descr->itemsize,
+                       dict);
+       } else {
+               result = Py_BuildValue("O(c)O", 
+                       array->ob_type, 
+                       array->ob_descr->typecode,
+                       dict);
+       }
        Py_DECREF(dict);
        return result;
 }