summaryrefslogtreecommitdiffstats
path: root/Modules/_pickle.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2013-11-23 20:05:08 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2013-11-23 20:05:08 (GMT)
commit8f2ee6e407fe38375095f488b18d2c8c0cbab631 (patch)
tree960405e690e6fdc8dedce7e87416c91803ecbe50 /Modules/_pickle.c
parentb3d3ee4fef6d1beb547671d12c514c86657b9223 (diff)
downloadcpython-8f2ee6e407fe38375095f488b18d2c8c0cbab631.zip
cpython-8f2ee6e407fe38375095f488b18d2c8c0cbab631.tar.gz
cpython-8f2ee6e407fe38375095f488b18d2c8c0cbab631.tar.bz2
Fix writing out 64-bit size fields on 32-bit builds
Diffstat (limited to 'Modules/_pickle.c')
-rw-r--r--Modules/_pickle.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index b63a7d9..3411ce9 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -700,17 +700,27 @@ _Pickler_ClearBuffer(PicklerObject *self)
}
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;
}