summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaoki INADA <inada-n@eagle>2009-06-29 10:09:04 +0900
committerNaoki INADA <inada-n@eagle>2009-06-29 10:09:04 +0900
commitf46498bcdfc862f9073ea7f520514cd722b03616 (patch)
treeaed49482489567f1cf94a4a44bdf6c8cd05f54fc
parentca0bda01f116f04f98009f13e1bc9def8200cbb6 (diff)
downloadmsgpack-python-f46498bcdfc862f9073ea7f520514cd722b03616.tar.gz
Fix error on packing unsigned long long.
-rw-r--r--msgpack/_msgpack.pyx34
-rw-r--r--test/test_case.py2
2 files changed, 22 insertions, 14 deletions
diff --git a/msgpack/_msgpack.pyx b/msgpack/_msgpack.pyx
index 279fdf5..e1c497b 100644
--- a/msgpack/_msgpack.pyx
+++ b/msgpack/_msgpack.pyx
@@ -9,6 +9,8 @@ cdef extern from "Python.h":
char* PyString_AsString(object o)
int PyMapping_Check(object o)
int PySequence_Check(object o)
+ long long PyLong_AsLongLong(object o)
+ unsigned long long PyLong_AsUnsignedLongLong(object o)
cdef extern from "stdlib.h":
void* malloc(size_t)
@@ -27,17 +29,18 @@ cdef extern from "pack.h":
msgpack_packer_write callback
void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback)
- void msgpack_pack_int(msgpack_packer* pk, int d)
- void msgpack_pack_nil(msgpack_packer* pk)
- void msgpack_pack_true(msgpack_packer* pk)
- void msgpack_pack_false(msgpack_packer* pk)
- void msgpack_pack_long(msgpack_packer* pk, long d)
- void msgpack_pack_long_long(msgpack_packer* pk, long long d)
- void msgpack_pack_double(msgpack_packer* pk, double d)
- void msgpack_pack_array(msgpack_packer* pk, size_t l)
- void msgpack_pack_map(msgpack_packer* pk, size_t l)
- void msgpack_pack_raw(msgpack_packer* pk, size_t l)
- void msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l)
+ int msgpack_pack_int(msgpack_packer* pk, int d)
+ int msgpack_pack_nil(msgpack_packer* pk)
+ int msgpack_pack_true(msgpack_packer* pk)
+ int msgpack_pack_false(msgpack_packer* pk)
+ int msgpack_pack_long(msgpack_packer* pk, long d)
+ int msgpack_pack_long_long(msgpack_packer* pk, long long d)
+ int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d)
+ int msgpack_pack_double(msgpack_packer* pk, double d)
+ int msgpack_pack_array(msgpack_packer* pk, size_t l)
+ int msgpack_pack_map(msgpack_packer* pk, size_t l)
+ int msgpack_pack_raw(msgpack_packer* pk, size_t l)
+ int msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l)
cdef class Packer(object):
@@ -103,6 +106,7 @@ cdef class Packer(object):
cdef __pack(self, object o):
cdef long long llval
+ cdef unsigned long long ullval
cdef long longval
cdef double fval
cdef char* rawval
@@ -114,8 +118,12 @@ cdef class Packer(object):
elif o is False:
msgpack_pack_false(&self.pk)
elif isinstance(o, long):
- llval = o
- msgpack_pack_long_long(&self.pk, llval)
+ if o > 0:
+ ullval = PyLong_AsUnsignedLongLong(o)
+ msgpack_pack_unsigned_long_long(&self.pk, ullval)
+ else:
+ llval = PyLong_AsLongLong(o)
+ msgpack_pack_long_long(&self.pk, llval)
elif isinstance(o, int):
longval = o
msgpack_pack_long(&self.pk, longval)
diff --git a/test/test_case.py b/test/test_case.py
index 3fafd8b..997027a 100644
--- a/test/test_case.py
+++ b/test/test_case.py
@@ -7,7 +7,7 @@ from msgpack import packs, unpacks
def check(length, obj):
v = packs(obj)
- assert_equal(len(v), length)
+ assert_equal(len(v), length, "%r length should be %r but get %r" % (obj, length, len(v)))
assert_equal(unpacks(v), obj)
def test_1():