Stop using c++ (#600)

Python 3.13a6+ & C++ & Cython cause compile error on some compilers.
This commit is contained in:
Inada Naoki 2024-05-04 16:01:48 +09:00 committed by GitHub
parent 0602baf3ea
commit 3e9a2a7419
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 80 additions and 68 deletions

View file

@ -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 }}

View file

@ -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

View file

@ -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

View file

@ -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 {

View 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;
}

View file

@ -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); static int unpack_skip(unpack_context *ctx, const char *data, Py_ssize_t len, Py_ssize_t *off) {
uint32_t size; return unpack_execute(0, ctx, data, len, off);
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;
} }
#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 */

View file

@ -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,