diff options
author | INADA Naoki <methane@users.noreply.github.com> | 2015-11-09 02:23:22 +0900 |
---|---|---|
committer | INADA Naoki <methane@users.noreply.github.com> | 2015-11-09 02:23:22 +0900 |
commit | ca87a7e539e0bd1b69ce8e715b1fd6ecab5f5553 (patch) | |
tree | 4c0bd9cc6e798eb715ef50ab7fc3d4f90f849f9d /msgpack | |
parent | 7d900371c8f13fa64f06aaf336b6ae65c705bf2c (diff) | |
parent | 6f02d252e1dc66d67861b45c5bead8392ed822d4 (diff) | |
download | msgpack-python-ca87a7e539e0bd1b69ce8e715b1fd6ecab5f5553.tar.gz |
Merge pull request #135 from pramukta/default_function_on_int_overflow
Default function on int overflow
Diffstat (limited to 'msgpack')
-rw-r--r-- | msgpack/_packer.pyx | 20 | ||||
-rw-r--r-- | msgpack/fallback.py | 4 |
2 files changed, 18 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) |