diff -r 84148898a606 Lib/plistlib.py --- a/Lib/plistlib.py Sun Dec 01 14:30:47 2013 +0100 +++ b/Lib/plistlib.py Mon Dec 02 17:34:58 2013 +0200 @@ -665,7 +665,8 @@ return b'' elif tokenH == 0x10: # int - return int.from_bytes(self._fp.read(1 << tokenL), 'big') + return int.from_bytes(self._fp.read(1 << tokenL), + 'big', signed=tokenL >= 3) elif token == 0x22: # real return struct.unpack('>f', self._fp.read(4))[0] @@ -871,14 +872,20 @@ self._fp.write(b'\x09') elif isinstance(value, int): - if value < 1 << 8: - self._fp.write(struct.pack('>BB', 0x10, value)) - elif value < 1 << 16: - self._fp.write(struct.pack('>BH', 0x11, value)) - elif value < 1 << 32: - self._fp.write(struct.pack('>BL', 0x12, value)) + if value >= 0: + if value < 1 << 8: + self._fp.write(struct.pack('>BB', 0x10, value)) + return + if value < 1 << 16: + self._fp.write(struct.pack('>BH', 0x11, value)) + return + if value < 1 << 32: + self._fp.write(struct.pack('>BL', 0x12, value)) + return + if -1 << 63 <= value < 1 << 63: + self._fp.write(struct.pack('>Bq', 0x13, value)) else: - self._fp.write(struct.pack('>BQ', 0x13, value)) + self._fp.write(b'\x14' + value.to_bytes(16, 'big', signed=True)) elif isinstance(value, float): self._fp.write(struct.pack('>Bd', 0x23, value)) diff -r 84148898a606 Lib/test/test_plistlib.py --- a/Lib/test/test_plistlib.py Sun Dec 01 14:30:47 2013 +0100 +++ b/Lib/test/test_plistlib.py Mon Dec 02 17:34:58 2013 +0200 @@ -133,6 +133,16 @@ self.assertRaises(AttributeError, plistlib.dump, pl, 'filename') self.assertRaises(AttributeError, plistlib.load, 'filename') + def test_int(self): + for pl in [0, 2**8-1, 2**8, 2**16-1, 2**16, 2**32-1, 2**32, + 2**63-1, 2**63, 2**127-1, -1, -2**63, -2**127]: + with self.subTest(pl=pl): + data = plistlib.dumps(pl) + pl2 = plistlib.loads(data) + self.assertIsInstance(pl2, int) + self.assertEqual(pl, pl2) + data2 = plistlib.dumps(pl2) + self.assertEqual(data, data2) def test_bytes(self): pl = self._create()