Skip to content

Commit ca87a7e

Browse files
committed
Merge pull request #135 from pramukta/default_function_on_int_overflow
Default function on int overflow
2 parents 7d90037 + 6f02d25 commit ca87a7e

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

msgpack/_packer.pyx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,20 @@ cdef class Packer(object):
136136
elif PyLong_Check(o):
137137
# PyInt_Check(long) is True for Python 3.
138138
# Sow we should test long before int.
139-
if o > 0:
140-
ullval = o
141-
ret = msgpack_pack_unsigned_long_long(&self.pk, ullval)
142-
else:
143-
llval = o
144-
ret = msgpack_pack_long_long(&self.pk, llval)
139+
try:
140+
if o > 0:
141+
ullval = o
142+
ret = msgpack_pack_unsigned_long_long(&self.pk, ullval)
143+
else:
144+
llval = o
145+
ret = msgpack_pack_long_long(&self.pk, llval)
146+
except OverflowError, oe:
147+
if not default_used and self._default is not None:
148+
o = self._default(o)
149+
default_used = True
150+
continue
151+
else:
152+
raise
145153
elif PyInt_Check(o):
146154
longval = o
147155
ret = msgpack_pack_long(&self.pk, longval)

msgpack/fallback.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,10 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, isinstance=isinstance):
655655
return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
656656
if -0x8000000000000000 <= obj < -0x80000000:
657657
return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
658+
if not default_used and self._default is not None:
659+
obj = self._default(obj)
660+
default_used = True
661+
continue
658662
raise PackValueError("Integer value out of range")
659663
if self._use_bin_type and isinstance(obj, bytes):
660664
n = len(obj)

test/test_extension.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,22 @@ def ext_hook(code, data):
5555
s = msgpack.packb(obj, default=default)
5656
obj2 = msgpack.unpackb(s, ext_hook=ext_hook)
5757
assert obj == obj2
58+
59+
import sys
60+
if sys.version > '3':
61+
long = int
62+
63+
def test_overriding_hooks():
64+
def default(obj):
65+
if isinstance(obj, long):
66+
return {"__type__": "long", "__data__": str(obj)}
67+
else:
68+
return obj
69+
70+
obj = {"testval": long(1823746192837461928374619)}
71+
refobj = {"testval": default(obj["testval"])}
72+
refout = msgpack.packb(refobj)
73+
assert isinstance(refout, (str, bytes))
74+
testout = msgpack.packb(obj, default=default)
75+
76+
assert refout == testout

0 commit comments

Comments
 (0)