Skip to content

Commit f46498b

Browse files
author
Naoki INADA
committed
Fix error on packing unsigned long long.
1 parent ca0bda0 commit f46498b

2 files changed

Lines changed: 22 additions & 14 deletions

File tree

msgpack/_msgpack.pyx

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ cdef extern from "Python.h":
99
char* PyString_AsString(object o)
1010
int PyMapping_Check(object o)
1111
int PySequence_Check(object o)
12+
long long PyLong_AsLongLong(object o)
13+
unsigned long long PyLong_AsUnsignedLongLong(object o)
1214

1315
cdef extern from "stdlib.h":
1416
void* malloc(size_t)
@@ -27,17 +29,18 @@ cdef extern from "pack.h":
2729
msgpack_packer_write callback
2830

2931
void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback)
30-
void msgpack_pack_int(msgpack_packer* pk, int d)
31-
void msgpack_pack_nil(msgpack_packer* pk)
32-
void msgpack_pack_true(msgpack_packer* pk)
33-
void msgpack_pack_false(msgpack_packer* pk)
34-
void msgpack_pack_long(msgpack_packer* pk, long d)
35-
void msgpack_pack_long_long(msgpack_packer* pk, long long d)
36-
void msgpack_pack_double(msgpack_packer* pk, double d)
37-
void msgpack_pack_array(msgpack_packer* pk, size_t l)
38-
void msgpack_pack_map(msgpack_packer* pk, size_t l)
39-
void msgpack_pack_raw(msgpack_packer* pk, size_t l)
40-
void msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l)
32+
int msgpack_pack_int(msgpack_packer* pk, int d)
33+
int msgpack_pack_nil(msgpack_packer* pk)
34+
int msgpack_pack_true(msgpack_packer* pk)
35+
int msgpack_pack_false(msgpack_packer* pk)
36+
int msgpack_pack_long(msgpack_packer* pk, long d)
37+
int msgpack_pack_long_long(msgpack_packer* pk, long long d)
38+
int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d)
39+
int msgpack_pack_double(msgpack_packer* pk, double d)
40+
int msgpack_pack_array(msgpack_packer* pk, size_t l)
41+
int msgpack_pack_map(msgpack_packer* pk, size_t l)
42+
int msgpack_pack_raw(msgpack_packer* pk, size_t l)
43+
int msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l)
4144

4245

4346
cdef class Packer(object):
@@ -103,6 +106,7 @@ cdef class Packer(object):
103106

104107
cdef __pack(self, object o):
105108
cdef long long llval
109+
cdef unsigned long long ullval
106110
cdef long longval
107111
cdef double fval
108112
cdef char* rawval
@@ -114,8 +118,12 @@ cdef class Packer(object):
114118
elif o is False:
115119
msgpack_pack_false(&self.pk)
116120
elif isinstance(o, long):
117-
llval = o
118-
msgpack_pack_long_long(&self.pk, llval)
121+
if o > 0:
122+
ullval = PyLong_AsUnsignedLongLong(o)
123+
msgpack_pack_unsigned_long_long(&self.pk, ullval)
124+
else:
125+
llval = PyLong_AsLongLong(o)
126+
msgpack_pack_long_long(&self.pk, llval)
119127
elif isinstance(o, int):
120128
longval = o
121129
msgpack_pack_long(&self.pk, longval)

test/test_case.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
def check(length, obj):
99
v = packs(obj)
10-
assert_equal(len(v), length)
10+
assert_equal(len(v), length, "%r length should be %r but get %r" % (obj, length, len(v)))
1111
assert_equal(unpacks(v), obj)
1212

1313
def test_1():

0 commit comments

Comments
 (0)