]> granicus.if.org Git - python/commitdiff
bpo-32011: Revert "Issue GH-15480: Remove the deprecated and unused TYPE_INT64 code...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 15 Nov 2017 16:05:58 +0000 (08:05 -0800)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 15 Nov 2017 16:05:58 +0000 (18:05 +0200)
Simplify the reverted code.

This reverts commit e9bbe8b87ba2874efba0474af5cc7d5941dbf742.
(cherry picked from commit 00987f6230fcdbecc8d9ab4b2b9fae8f99a1a4a9)

Lib/test/test_marshal.py
Misc/NEWS.d/next/Library/2017-11-12-20-47-59.bpo-32011.NzVDdZ.rst [new file with mode: 0644]
Python/marshal.c

index b378ffea00c0a787217ed92173b5c862b15c3bfd..29dda987d0bb7f28c59e16ccb4769acb469ce00a 100644 (file)
@@ -34,6 +34,29 @@ class IntTestCase(unittest.TestCase, HelperMixin):
                 self.helper(expected)
             n = n >> 1
 
+    def test_int64(self):
+        # Simulate int marshaling with TYPE_INT64.
+        maxint64 = (1 << 63) - 1
+        minint64 = -maxint64-1
+        for base in maxint64, minint64, -maxint64, -(minint64 >> 1):
+            while base:
+                s = b'I' + int.to_bytes(base, 8, 'little', signed=True)
+                got = marshal.loads(s)
+                self.assertEqual(base, got)
+                if base == -1:  # a fixed-point for shifting right 1
+                    base = 0
+                else:
+                    base >>= 1
+
+        got = marshal.loads(b'I\xfe\xdc\xba\x98\x76\x54\x32\x10')
+        self.assertEqual(got, 0x1032547698badcfe)
+        got = marshal.loads(b'I\x01\x23\x45\x67\x89\xab\xcd\xef')
+        self.assertEqual(got, -0x1032547698badcff)
+        got = marshal.loads(b'I\x08\x19\x2a\x3b\x4c\x5d\x6e\x7f')
+        self.assertEqual(got, 0x7f6e5d4c3b2a1908)
+        got = marshal.loads(b'I\xf7\xe6\xd5\xc4\xb3\xa2\x91\x80')
+        self.assertEqual(got, -0x7f6e5d4c3b2a1909)
+
     def test_bool(self):
         for b in (True, False):
             self.helper(b)
diff --git a/Misc/NEWS.d/next/Library/2017-11-12-20-47-59.bpo-32011.NzVDdZ.rst b/Misc/NEWS.d/next/Library/2017-11-12-20-47-59.bpo-32011.NzVDdZ.rst
new file mode 100644 (file)
index 0000000..e2ba502
--- /dev/null
@@ -0,0 +1,2 @@
+Restored support of loading marshal files with the TYPE_INT64 code. These
+files can be produced in Python 2.7.
index 22ca49c75629edc783844909655115b723466231..91a57c293b09b6aa287836d377e1f96f76f0ff66 100644 (file)
@@ -32,6 +32,9 @@
 #define TYPE_STOPITER           'S'
 #define TYPE_ELLIPSIS           '.'
 #define TYPE_INT                'i'
+/* TYPE_INT64 is not generated anymore.
+   Supported for backward compatibility only. */
+#define TYPE_INT64              'I'
 #define TYPE_FLOAT              'f'
 #define TYPE_BINARY_FLOAT       'g'
 #define TYPE_COMPLEX            'x'
@@ -777,6 +780,19 @@ r_long(RFILE *p)
     return x;
 }
 
+/* r_long64 deals with the TYPE_INT64 code. */
+static PyObject *
+r_long64(RFILE *p)
+{
+    const unsigned char *buffer = (const unsigned char *) r_string(8, p);
+    if (buffer == NULL) {
+        return NULL;
+    }
+    return _PyLong_FromByteArray(buffer, 8,
+                                 1 /* little endian */,
+                                 1 /* signed */);
+}
+
 static PyObject *
 r_PyLong(RFILE *p)
 {
@@ -976,6 +992,11 @@ r_object(RFILE *p)
         R_REF(retval);
         break;
 
+    case TYPE_INT64:
+        retval = r_long64(p);
+        R_REF(retval);
+        break;
+
     case TYPE_LONG:
         retval = r_PyLong(p);
         R_REF(retval);