Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
strategy:
matrix:
os: ["ubuntu-latest", "windows-latest", "windows-11-arm", "macos-latest"]
py: ["3.14-dev", "3.13", "3.12", "3.11", "3.10", "3.9"]
py: ["3.14", "3.14t", "3.13", "3.12", "3.11", "3.10", "3.9"]
exclude:
- os: windows-11-arm
py: "3.9"
Expand Down
3 changes: 2 additions & 1 deletion msgpack/_cmsgpack.pyx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# coding: utf-8
#cython: embedsignature=True, c_string_encoding=ascii, language_level=3
#cython: freethreading_compatible = True
import cython
from cpython.datetime cimport import_datetime, datetime_new
import_datetime()

Expand Down
10 changes: 8 additions & 2 deletions msgpack/_packer.pyx
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# coding: utf-8

from cpython cimport *
from cpython.bytearray cimport PyByteArray_Check, PyByteArray_CheckExact
from cpython.datetime cimport (
Expand Down Expand Up @@ -129,6 +127,7 @@ cdef class Packer:
if self.exports > 0:
raise BufferError("Existing exports of data: Packer cannot be changed")

@cython.critical_section
def __init__(self, *, default=None,
bint use_single_float=False, bint autoreset=True, bint use_bin_type=True,
bint strict_types=False, bint datetime=False, unicode_errors=None,
Expand Down Expand Up @@ -269,6 +268,7 @@ cdef class Packer:
return ret
return self._pack_inner(o, 0, nest_limit)

@cython.critical_section
def pack(self, object obj):
cdef int ret
self._check_exports()
Expand All @@ -284,13 +284,15 @@ cdef class Packer:
self.pk.length = 0
return buf

@cython.critical_section
def pack_ext_type(self, typecode, data):
self._check_exports()
if len(data) > ITEM_LIMIT:
raise ValueError("ext data too large")
msgpack_pack_ext(&self.pk, typecode, len(data))
msgpack_pack_raw_body(&self.pk, data, len(data))

@cython.critical_section
def pack_array_header(self, long long size):
self._check_exports()
if size > ITEM_LIMIT:
Expand All @@ -301,6 +303,7 @@ cdef class Packer:
self.pk.length = 0
return buf

@cython.critical_section
def pack_map_header(self, long long size):
self._check_exports()
if size > ITEM_LIMIT:
Expand All @@ -311,6 +314,7 @@ cdef class Packer:
self.pk.length = 0
return buf

@cython.critical_section
def pack_map_pairs(self, object pairs):
"""
Pack *pairs* as msgpack map type.
Expand All @@ -331,6 +335,7 @@ cdef class Packer:
self.pk.length = 0
return buf

@cython.critical_section
def reset(self):
"""Reset internal buffer.

Expand All @@ -339,6 +344,7 @@ cdef class Packer:
self._check_exports()
self.pk.length = 0

@cython.critical_section
def bytes(self):
"""Return internal buffer contents as bytes object"""
return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length)
Expand Down
11 changes: 9 additions & 2 deletions msgpack/_unpacker.pyx
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# coding: utf-8

from cpython cimport *
cdef extern from "Python.h":
ctypedef struct PyObject
Expand Down Expand Up @@ -324,6 +322,7 @@ cdef class Unpacker:
PyMem_Free(self.buf)
self.buf = NULL

@cython.critical_section
def __init__(self, file_like=None, *, Py_ssize_t read_size=0,
bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True,
object object_hook=None, object object_pairs_hook=None, object list_hook=None,
Expand Down Expand Up @@ -384,6 +383,7 @@ cdef class Unpacker:
max_str_len, max_bin_len, max_array_len,
max_map_len, max_ext_len)

@cython.critical_section
def feed(self, object next_bytes):
"""Append `next_bytes` to internal buffer."""
cdef Py_buffer pybuff
Expand Down Expand Up @@ -484,6 +484,7 @@ cdef class Unpacker:
else:
raise ValueError("Unpack failed: error = %d" % (ret,))

@cython.critical_section
def read_bytes(self, Py_ssize_t nbytes):
"""Read a specified number of raw bytes from the stream"""
cdef Py_ssize_t nread
Expand All @@ -496,20 +497,23 @@ cdef class Unpacker:
self.stream_offset += nread
return ret

@cython.critical_section
def unpack(self):
"""Unpack one object
Raises `OutOfData` when there are no more bytes to unpack.
"""
return self._unpack(unpack_construct)

@cython.critical_section
def skip(self):
"""Read and ignore one object, returning None
Raises `OutOfData` when there are no more bytes to unpack.
"""
return self._unpack(unpack_skip)

@cython.critical_section
def read_array_header(self):
"""assuming the next object is an array, return its size n, such that
the next n unpack() calls will iterate over its contents.
Expand All @@ -518,6 +522,7 @@ cdef class Unpacker:
"""
return self._unpack(read_array_header)

@cython.critical_section
def read_map_header(self):
"""assuming the next object is a map, return its size n, such that the
next n * 2 unpack() calls will iterate over its key-value pairs.
Expand All @@ -526,6 +531,7 @@ cdef class Unpacker:
"""
return self._unpack(read_map_header)

@cython.critical_section
def tell(self):
"""Returns the current position of the Unpacker in bytes, i.e., the
number of bytes that were read from the input, also the starting
Expand All @@ -536,6 +542,7 @@ cdef class Unpacker:
def __iter__(self):
return self

@cython.critical_section
def __next__(self):
return self._unpack(unpack_construct, 1)

Expand Down