]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix writing out 64-bit size fields on 32-bit builds
authorAntoine Pitrou <solipsis@pitrou.net>
Sat, 23 Nov 2013 20:05:08 +0000 (21:05 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Sat, 23 Nov 2013 20:05:08 +0000 (21:05 +0100)
Lib/test/test_range.py
Modules/_pickle.c

index f088387c33e2194a0c822e56dba60c2b2bfd1916..d9d4cf88a2017fcb61651fbcc8ca3075db1aff46 100644 (file)
@@ -353,9 +353,10 @@ class RangeTest(unittest.TestCase):
                      (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
         for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             for t in testcases:
-                r = range(*t)
-                self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
-                                 list(r))
+                with self.subTest(proto=proto, test=t):
+                    r = range(*t)
+                    self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
+                                     list(r))
 
     def test_iterator_pickling(self):
         testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
index b63a7d92c54ff19f5cc04f54652d79c5ce5077c4..3411ce9b1b0ba7a7f1bd0f2e064c173db1d51a44 100644 (file)
@@ -699,18 +699,28 @@ _Pickler_ClearBuffer(PicklerObject *self)
     return 0;
 }
 
+static void
+_write_size64(char *out, size_t value)
+{
+    out[0] = (unsigned char)(value & 0xff);
+    out[1] = (unsigned char)((value >> 8) & 0xff);
+    out[2] = (unsigned char)((value >> 16) & 0xff);
+    out[3] = (unsigned char)((value >> 24) & 0xff);
+#if SIZEOF_SIZE_T >= 8
+    out[4] = (unsigned char)((value >> 32) & 0xff);
+    out[5] = (unsigned char)((value >> 40) & 0xff);
+    out[6] = (unsigned char)((value >> 48) & 0xff);
+    out[7] = (unsigned char)((value >> 56) & 0xff);
+#else
+    out[4] = out[5] = out[6] = out[7] = 0;
+#endif
+}
+
 static void
 _Pickler_WriteFrameHeader(PicklerObject *self, char *qdata, size_t frame_len)
 {
-    qdata[0] = (unsigned char)FRAME;
-    qdata[1] = (unsigned char)(frame_len & 0xff);
-    qdata[2] = (unsigned char)((frame_len >> 8) & 0xff);
-    qdata[3] = (unsigned char)((frame_len >> 16) & 0xff);
-    qdata[4] = (unsigned char)((frame_len >> 24) & 0xff);
-    qdata[5] = (unsigned char)((frame_len >> 32) & 0xff);
-    qdata[6] = (unsigned char)((frame_len >> 40) & 0xff);
-    qdata[7] = (unsigned char)((frame_len >> 48) & 0xff);
-    qdata[8] = (unsigned char)((frame_len >> 56) & 0xff);
+    qdata[0] = FRAME;
+    _write_size64(qdata + 1, frame_len);
 }
 
 static int
@@ -2017,7 +2027,7 @@ save_bytes(PicklerObject *self, PyObject *obj)
             int i;
             header[0] = BINBYTES8;
             for (i = 0; i < 8; i++) {
-                header[i+1] = (unsigned char)((size >> (8 * i)) & 0xff);
+                _write_size64(header + 1, size);
             }
             len = 8;
         }
@@ -2131,7 +2141,7 @@ write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
 
         header[0] = BINUNICODE8;
         for (i = 0; i < 8; i++) {
-            header[i+1] = (unsigned char)((size >> (8 * i)) & 0xff);
+            _write_size64(header + 1, size);
         }
         len = 9;
     }