summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorINADA Naoki <methane@users.noreply.github.com>2015-11-09 02:23:22 +0900
committerINADA Naoki <methane@users.noreply.github.com>2015-11-09 02:23:22 +0900
commitca87a7e539e0bd1b69ce8e715b1fd6ecab5f5553 (patch)
tree4c0bd9cc6e798eb715ef50ab7fc3d4f90f849f9d
parent7d900371c8f13fa64f06aaf336b6ae65c705bf2c (diff)
parent6f02d252e1dc66d67861b45c5bead8392ed822d4 (diff)
downloadmsgpack-python-ca87a7e539e0bd1b69ce8e715b1fd6ecab5f5553.tar.gz
Merge pull request #135 from pramukta/default_function_on_int_overflow
Default function on int overflow
-rw-r--r--msgpack/_packer.pyx20
-rw-r--r--msgpack/fallback.py4
-rw-r--r--test/test_extension.py19
3 files changed, 37 insertions, 6 deletions
diff --git a/msgpack/_packer.pyx b/msgpack/_packer.pyx
index fcd20a7..7129208 100644
--- a/msgpack/_packer.pyx
+++ b/msgpack/_packer.pyx
@@ -136,12 +136,20 @@ cdef class Packer(object):
elif PyLong_Check(o):
# PyInt_Check(long) is True for Python 3.
# Sow we should test long before int.
- if o > 0:
- ullval = o
- ret = msgpack_pack_unsigned_long_long(&self.pk, ullval)
- else:
- llval = o
- ret = msgpack_pack_long_long(&self.pk, llval)
+ try:
+ if o > 0:
+ ullval = o
+ ret = msgpack_pack_unsigned_long_long(&self.pk, ullval)
+ else:
+ llval = o
+ ret = msgpack_pack_long_long(&self.pk, llval)
+ except OverflowError, oe:
+ if not default_used and self._default is not None:
+ o = self._default(o)
+ default_used = True
+ continue
+ else:
+ raise
elif PyInt_Check(o):
longval = o
ret = msgpack_pack_long(&self.pk, longval)
diff --git a/msgpack/fallback.py b/msgpack/fallback.py
index 235c201..eb20002 100644
--- a/msgpack/fallback.py
+++ b/msgpack/fallback.py
@@ -655,6 +655,10 @@ class Packer(object):
return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
if -0x8000000000000000 <= obj < -0x80000000:
return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
+ if not default_used and self._default is not None:
+ obj = self._default(obj)
+ default_used = True
+ continue
raise PackValueError("Integer value out of range")
if self._use_bin_type and isinstance(obj, bytes):
n = len(obj)
diff --git a/test/test_extension.py b/test/test_extension.py
index 2f85ce3..c552498 100644
--- a/test/test_extension.py
+++ b/test/test_extension.py
@@ -55,3 +55,22 @@ def test_extension_type():
s = msgpack.packb(obj, default=default)
obj2 = msgpack.unpackb(s, ext_hook=ext_hook)
assert obj == obj2
+
+import sys
+if sys.version > '3':
+ long = int
+
+def test_overriding_hooks():
+ def default(obj):
+ if isinstance(obj, long):
+ return {"__type__": "long", "__data__": str(obj)}
+ else:
+ return obj
+
+ obj = {"testval": long(1823746192837461928374619)}
+ refobj = {"testval": default(obj["testval"])}
+ refout = msgpack.packb(refobj)
+ assert isinstance(refout, (str, bytes))
+ testout = msgpack.packb(obj, default=default)
+
+ assert refout == testout