mirror of
https://github.com/msgpack/msgpack-python.git
synced 2025-10-27 15:44:11 +00:00
Stop using c++ (#600)
Python 3.13a6+ & C++ & Cython cause compile error on some compilers.
This commit is contained in:
parent
0602baf3ea
commit
3e9a2a7419
7 changed files with 80 additions and 68 deletions
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: ["ubuntu-latest", "windows-latest", "macos-latest"]
|
os: ["ubuntu-latest", "windows-latest", "macos-latest"]
|
||||||
py: ["3.12", "3.11", "3.10", "3.9", "3.8"]
|
py: ["3.13-dev", "3.12", "3.11", "3.10", "3.9", "3.8"]
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
name: Run test with Python ${{ matrix.py }} on ${{ matrix.os }}
|
name: Run test with Python ${{ matrix.py }} on ${{ matrix.os }}
|
||||||
|
|
|
||||||
2
Makefile
2
Makefile
|
|
@ -22,7 +22,7 @@ pyupgrade:
|
||||||
|
|
||||||
.PHONY: cython
|
.PHONY: cython
|
||||||
cython:
|
cython:
|
||||||
cython --cplus msgpack/_cmsgpack.pyx
|
cython msgpack/_cmsgpack.pyx
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: cython
|
test: cython
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ cdef extern from "unpack.h":
|
||||||
PyObject* timestamp_t
|
PyObject* timestamp_t
|
||||||
PyObject *giga;
|
PyObject *giga;
|
||||||
PyObject *utc;
|
PyObject *utc;
|
||||||
char *unicode_errors
|
const char *unicode_errors
|
||||||
Py_ssize_t max_str_len
|
Py_ssize_t max_str_len
|
||||||
Py_ssize_t max_bin_len
|
Py_ssize_t max_bin_len
|
||||||
Py_ssize_t max_array_len
|
Py_ssize_t max_array_len
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
#else
|
||||||
|
#define bool char
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct msgpack_packer {
|
typedef struct msgpack_packer {
|
||||||
|
|
|
||||||
51
msgpack/unpack_container_header.h
Normal file
51
msgpack/unpack_container_header.h
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
static inline int unpack_container_header(unpack_context* ctx, const char* data, Py_ssize_t len, Py_ssize_t* off)
|
||||||
|
{
|
||||||
|
assert(len >= *off);
|
||||||
|
uint32_t size;
|
||||||
|
const unsigned char *const p = (unsigned char*)data + *off;
|
||||||
|
|
||||||
|
#define inc_offset(inc) \
|
||||||
|
if (len - *off < inc) \
|
||||||
|
return 0; \
|
||||||
|
*off += inc;
|
||||||
|
|
||||||
|
switch (*p) {
|
||||||
|
case var_offset:
|
||||||
|
inc_offset(3);
|
||||||
|
size = _msgpack_load16(uint16_t, p + 1);
|
||||||
|
break;
|
||||||
|
case var_offset + 1:
|
||||||
|
inc_offset(5);
|
||||||
|
size = _msgpack_load32(uint32_t, p + 1);
|
||||||
|
break;
|
||||||
|
#ifdef USE_CASE_RANGE
|
||||||
|
case fixed_offset + 0x0 ... fixed_offset + 0xf:
|
||||||
|
#else
|
||||||
|
case fixed_offset + 0x0:
|
||||||
|
case fixed_offset + 0x1:
|
||||||
|
case fixed_offset + 0x2:
|
||||||
|
case fixed_offset + 0x3:
|
||||||
|
case fixed_offset + 0x4:
|
||||||
|
case fixed_offset + 0x5:
|
||||||
|
case fixed_offset + 0x6:
|
||||||
|
case fixed_offset + 0x7:
|
||||||
|
case fixed_offset + 0x8:
|
||||||
|
case fixed_offset + 0x9:
|
||||||
|
case fixed_offset + 0xa:
|
||||||
|
case fixed_offset + 0xb:
|
||||||
|
case fixed_offset + 0xc:
|
||||||
|
case fixed_offset + 0xd:
|
||||||
|
case fixed_offset + 0xe:
|
||||||
|
case fixed_offset + 0xf:
|
||||||
|
#endif
|
||||||
|
++*off;
|
||||||
|
size = ((unsigned int)*p) & 0x0f;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PyErr_SetString(PyExc_ValueError, "Unexpected type header on stream");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
unpack_callback_uint32(&ctx->user, size, &ctx->stack[0].obj);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -75,8 +75,7 @@ static inline void unpack_clear(unpack_context *ctx)
|
||||||
Py_CLEAR(ctx->stack[0].obj);
|
Py_CLEAR(ctx->stack[0].obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool construct>
|
static inline int unpack_execute(bool construct, unpack_context* ctx, const char* data, Py_ssize_t len, Py_ssize_t* off)
|
||||||
static inline int unpack_execute(unpack_context* ctx, const char* data, Py_ssize_t len, Py_ssize_t* off)
|
|
||||||
{
|
{
|
||||||
assert(len >= *off);
|
assert(len >= *off);
|
||||||
|
|
||||||
|
|
@ -386,6 +385,7 @@ _end:
|
||||||
#undef construct_cb
|
#undef construct_cb
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef NEXT_CS
|
||||||
#undef SWITCH_RANGE_BEGIN
|
#undef SWITCH_RANGE_BEGIN
|
||||||
#undef SWITCH_RANGE
|
#undef SWITCH_RANGE
|
||||||
#undef SWITCH_RANGE_DEFAULT
|
#undef SWITCH_RANGE_DEFAULT
|
||||||
|
|
@ -397,68 +397,27 @@ _end:
|
||||||
#undef again_fixed_trail_if_zero
|
#undef again_fixed_trail_if_zero
|
||||||
#undef start_container
|
#undef start_container
|
||||||
|
|
||||||
template <unsigned int fixed_offset, unsigned int var_offset>
|
static int unpack_construct(unpack_context *ctx, const char *data, Py_ssize_t len, Py_ssize_t *off) {
|
||||||
static inline int unpack_container_header(unpack_context* ctx, const char* data, Py_ssize_t len, Py_ssize_t* off)
|
return unpack_execute(1, ctx, data, len, off);
|
||||||
{
|
|
||||||
assert(len >= *off);
|
|
||||||
uint32_t size;
|
|
||||||
const unsigned char *const p = (unsigned char*)data + *off;
|
|
||||||
|
|
||||||
#define inc_offset(inc) \
|
|
||||||
if (len - *off < inc) \
|
|
||||||
return 0; \
|
|
||||||
*off += inc;
|
|
||||||
|
|
||||||
switch (*p) {
|
|
||||||
case var_offset:
|
|
||||||
inc_offset(3);
|
|
||||||
size = _msgpack_load16(uint16_t, p + 1);
|
|
||||||
break;
|
|
||||||
case var_offset + 1:
|
|
||||||
inc_offset(5);
|
|
||||||
size = _msgpack_load32(uint32_t, p + 1);
|
|
||||||
break;
|
|
||||||
#ifdef USE_CASE_RANGE
|
|
||||||
case fixed_offset + 0x0 ... fixed_offset + 0xf:
|
|
||||||
#else
|
|
||||||
case fixed_offset + 0x0:
|
|
||||||
case fixed_offset + 0x1:
|
|
||||||
case fixed_offset + 0x2:
|
|
||||||
case fixed_offset + 0x3:
|
|
||||||
case fixed_offset + 0x4:
|
|
||||||
case fixed_offset + 0x5:
|
|
||||||
case fixed_offset + 0x6:
|
|
||||||
case fixed_offset + 0x7:
|
|
||||||
case fixed_offset + 0x8:
|
|
||||||
case fixed_offset + 0x9:
|
|
||||||
case fixed_offset + 0xa:
|
|
||||||
case fixed_offset + 0xb:
|
|
||||||
case fixed_offset + 0xc:
|
|
||||||
case fixed_offset + 0xd:
|
|
||||||
case fixed_offset + 0xe:
|
|
||||||
case fixed_offset + 0xf:
|
|
||||||
#endif
|
|
||||||
++*off;
|
|
||||||
size = ((unsigned int)*p) & 0x0f;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
PyErr_SetString(PyExc_ValueError, "Unexpected type header on stream");
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
unpack_callback_uint32(&ctx->user, size, &ctx->stack[0].obj);
|
static int unpack_skip(unpack_context *ctx, const char *data, Py_ssize_t len, Py_ssize_t *off) {
|
||||||
return 1;
|
return unpack_execute(0, ctx, data, len, off);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef SWITCH_RANGE_BEGIN
|
#define unpack_container_header read_array_header
|
||||||
#undef SWITCH_RANGE
|
#define fixed_offset 0x90
|
||||||
#undef SWITCH_RANGE_DEFAULT
|
#define var_offset 0xdc
|
||||||
#undef SWITCH_RANGE_END
|
#include "unpack_container_header.h"
|
||||||
|
#undef unpack_container_header
|
||||||
|
#undef fixed_offset
|
||||||
|
#undef var_offset
|
||||||
|
|
||||||
static const execute_fn unpack_construct = &unpack_execute<true>;
|
#define unpack_container_header read_map_header
|
||||||
static const execute_fn unpack_skip = &unpack_execute<false>;
|
#define fixed_offset 0x80
|
||||||
static const execute_fn read_array_header = &unpack_container_header<0x90, 0xdc>;
|
#define var_offset 0xde
|
||||||
static const execute_fn read_map_header = &unpack_container_header<0x80, 0xde>;
|
#include "unpack_container_header.h"
|
||||||
|
#undef unpack_container_header
|
||||||
#undef NEXT_CS
|
#undef fixed_offset
|
||||||
|
#undef var_offset
|
||||||
|
|
||||||
/* vim: set ts=4 sw=4 sts=4 expandtab */
|
/* vim: set ts=4 sw=4 sts=4 expandtab */
|
||||||
|
|
|
||||||
6
setup.py
6
setup.py
|
|
@ -25,7 +25,7 @@ def cythonize(src):
|
||||||
if not have_cython:
|
if not have_cython:
|
||||||
raise Exception("Cython is required for building from checkout")
|
raise Exception("Cython is required for building from checkout")
|
||||||
sys.stderr.write(f"cythonize: {src!r}\n")
|
sys.stderr.write(f"cythonize: {src!r}\n")
|
||||||
cython_compiler.compile([src], cplus=True)
|
cython_compiler.compile([src])
|
||||||
|
|
||||||
|
|
||||||
def ensure_source(src):
|
def ensure_source(src):
|
||||||
|
|
@ -51,17 +51,17 @@ class Sdist(sdist):
|
||||||
|
|
||||||
libraries = []
|
libraries = []
|
||||||
macros = []
|
macros = []
|
||||||
|
ext_modules = []
|
||||||
|
|
||||||
if sys.platform == "win32":
|
if sys.platform == "win32":
|
||||||
libraries.append("ws2_32")
|
libraries.append("ws2_32")
|
||||||
macros = [("__LITTLE_ENDIAN__", "1")]
|
macros = [("__LITTLE_ENDIAN__", "1")]
|
||||||
|
|
||||||
ext_modules = []
|
|
||||||
if not PYPY and not os.environ.get("MSGPACK_PUREPYTHON"):
|
if not PYPY and not os.environ.get("MSGPACK_PUREPYTHON"):
|
||||||
ext_modules.append(
|
ext_modules.append(
|
||||||
Extension(
|
Extension(
|
||||||
"msgpack._cmsgpack",
|
"msgpack._cmsgpack",
|
||||||
sources=["msgpack/_cmsgpack.cpp"],
|
sources=["msgpack/_cmsgpack.c"],
|
||||||
libraries=libraries,
|
libraries=libraries,
|
||||||
include_dirs=["."],
|
include_dirs=["."],
|
||||||
define_macros=macros,
|
define_macros=macros,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue