1
0
mirror of https://github.com/msgpack/msgpack-c.git synced 2025-03-24 09:32:49 +01:00

python: Support Python3.

This commit is contained in:
INADA Naoki 2010-09-02 01:29:57 +09:00
parent be6376ee2d
commit 4a15d8b6d2
3 changed files with 21 additions and 20 deletions

@ -1,3 +1,3 @@
# coding: utf-8 # coding: utf-8
from _msgpack import * from msgpack._msgpack import *

@ -1,26 +1,24 @@
# coding: utf-8 # coding: utf-8
import cStringIO
cdef extern from "Python.h": cdef extern from "Python.h":
ctypedef char* const_char_ptr "const char*" ctypedef char* const_char_ptr "const char*"
ctypedef struct PyObject ctypedef struct PyObject
cdef object PyString_FromStringAndSize(const_char_ptr b, Py_ssize_t len) cdef object PyBytes_FromStringAndSize(const_char_ptr b, Py_ssize_t len)
cdef PyObject* Py_True cdef PyObject* Py_True
cdef PyObject* Py_False cdef PyObject* Py_False
cdef char* PyString_AsString(object o)
cdef long long PyLong_AsLongLong(object o) cdef long long PyLong_AsLongLong(object o)
cdef unsigned long long PyLong_AsUnsignedLongLong(object o) cdef unsigned long long PyLong_AsUnsignedLongLong(object o)
cdef int PyMapping_Check(object o) cdef bint PyBool_Check(object o)
cdef int PySequence_Check(object o) cdef bint PyMapping_Check(object o)
cdef int PyLong_Check(object o) cdef bint PySequence_Check(object o)
cdef int PyInt_Check(object o) cdef bint PyLong_Check(object o)
cdef int PyFloat_Check(object o) cdef bint PyInt_Check(object o)
cdef int PyString_Check(object o) cdef bint PyFloat_Check(object o)
cdef int PyUnicode_Check(object o) cdef bint PyBytes_Check(object o)
cdef bint PyUnicode_Check(object o)
cdef extern from "stdlib.h": cdef extern from "stdlib.h":
void* malloc(size_t) void* malloc(size_t)
@ -81,10 +79,12 @@ cdef class Packer(object):
if o is None: if o is None:
ret = msgpack_pack_nil(&self.pk) ret = msgpack_pack_nil(&self.pk)
elif <PyObject*>o == Py_True: #elif PyBool_Check(o):
ret = msgpack_pack_true(&self.pk) elif isinstance(o, bool):
elif <PyObject*>o == Py_False: if o:
ret = msgpack_pack_false(&self.pk) ret = msgpack_pack_true(&self.pk)
else:
ret = msgpack_pack_false(&self.pk)
elif PyLong_Check(o): elif PyLong_Check(o):
if o > 0: if o > 0:
ullval = PyLong_AsUnsignedLongLong(o) ullval = PyLong_AsUnsignedLongLong(o)
@ -98,7 +98,7 @@ cdef class Packer(object):
elif PyFloat_Check(o): elif PyFloat_Check(o):
fval = o fval = o
ret = msgpack_pack_double(&self.pk, fval) ret = msgpack_pack_double(&self.pk, fval)
elif PyString_Check(o): elif PyBytes_Check(o):
rawval = o rawval = o
ret = msgpack_pack_raw(&self.pk, len(o)) ret = msgpack_pack_raw(&self.pk, len(o))
if ret == 0: if ret == 0:
@ -133,7 +133,7 @@ cdef class Packer(object):
ret = self.__pack(obj) ret = self.__pack(obj)
if ret: if ret:
raise TypeError raise TypeError
buf = PyString_FromStringAndSize(self.pk.buf, self.pk.length) buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length)
self.pk.length = 0 self.pk.length = 0
return buf return buf
@ -262,10 +262,11 @@ cdef class Unpacker(object):
cdef char* buf = self.buf cdef char* buf = self.buf
cdef Py_ssize_t tail = self.buf_tail cdef Py_ssize_t tail = self.buf_tail
cdef Py_ssize_t l cdef Py_ssize_t l
cdef bytes b
for b in self.waiting_bytes: for b in self.waiting_bytes:
l = len(b) l = len(b)
memcpy(buf + tail, PyString_AsString(b), l) memcpy(buf + tail, <char*>(b), l)
tail += l tail += l
self.buf_tail = tail self.buf_tail = tail
del self.waiting_bytes[:] del self.waiting_bytes[:]

@ -175,7 +175,7 @@ static inline int template_callback_map_item(unpack_user* u, msgpack_unpack_obje
static inline int template_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_unpack_object* o) static inline int template_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_unpack_object* o)
{ {
PyObject *py; PyObject *py;
py = PyString_FromStringAndSize(p, l); py = PyBytes_FromStringAndSize(p, l);
if (!py) if (!py)
return -1; return -1;
*o = py; *o = py;