From fa9b12b6edee0a0a33f2d33741a4a3a272ddbe32 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 9 May 2025 16:05:02 +0100 Subject: [PATCH 1/6] Replace add_type_to_module with ADD_TYPE --- Modules/_zstd/_zstdmodule.c | 72 ++++++++++++------------------------ Modules/_zstd/_zstdmodule.h | 6 +-- Modules/_zstd/compressor.c | 2 +- Modules/_zstd/decompressor.c | 2 +- Modules/_zstd/zstddict.c | 2 +- 5 files changed, 30 insertions(+), 54 deletions(-) diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index 1307eb832ae779..2bc387564e5788 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -642,22 +642,6 @@ add_vars_to_module(PyObject *m) } \ } while(0) -static inline int -add_type_to_module(PyObject *module, const char *name, - PyType_Spec *type_spec, PyTypeObject **dest) -{ - PyObject *temp = PyType_FromModuleAndSpec(module, type_spec, NULL); - - if (PyModule_AddObjectRef(module, name, temp) < 0) { - Py_XDECREF(temp); - return -1; - } - - *dest = (PyTypeObject*) temp; - - return 0; -} - static inline int add_constant_to_type(PyTypeObject *type, const char *name, long value) { @@ -673,8 +657,20 @@ add_constant_to_type(PyTypeObject *type, const char *name, long value) return rc; } -static int _zstd_exec(PyObject *module) { - _zstd_state* const mod_state = get_zstd_state(module); +static int _zstd_exec(PyObject *m) +{ +#define ADD_TYPE(TYPE, SPEC) \ +do { \ + TYPE = (PyTypeObject *)PyType_FromModuleAndSpec(m, &(SPEC), NULL); \ + if (TYPE == NULL) { \ + return -1; \ + } \ + if (PyModule_AddType(m, TYPE) < 0) { \ + return -1; \ + } \ +} while (0) + + _zstd_state* const mod_state = get_zstd_state(m); /* Reusable objects & variables */ mod_state->empty_bytes = PyBytes_FromStringAndSize(NULL, 0); @@ -698,40 +694,26 @@ static int _zstd_exec(PyObject *module) { mod_state->DParameter_type = NULL; /* Add variables to module */ - if (add_vars_to_module(module) < 0) { + if (add_vars_to_module(m) < 0) { return -1; } - /* ZstdError */ + /* Create and add heap types */ + ADD_TYPE(mod_state->ZstdDict_type, zstd_dict_type_spec); + ADD_TYPE(mod_state->ZstdCompressor_type, zstd_compressor_type_spec); + ADD_TYPE(mod_state->ZstdDecompressor_type, zstd_decompressor_type_spec); mod_state->ZstdError = PyErr_NewExceptionWithDoc( - "_zstd.ZstdError", - "Call to the underlying zstd library failed.", - NULL, NULL); + "_zstd.ZstdError", + "An error occurred in the zstd library.", + NULL, NULL); if (mod_state->ZstdError == NULL) { return -1; } - - if (PyModule_AddObjectRef(module, "ZstdError", mod_state->ZstdError) < 0) { + if (PyModule_AddType(m, (PyTypeObject *)mod_state->ZstdError) < 0) { Py_DECREF(mod_state->ZstdError); return -1; } - /* ZstdDict */ - if (add_type_to_module(module, - "ZstdDict", - &zstddict_type_spec, - &mod_state->ZstdDict_type) < 0) { - return -1; - } - - // ZstdCompressor - if (add_type_to_module(module, - "ZstdCompressor", - &zstdcompressor_type_spec, - &mod_state->ZstdCompressor_type) < 0) { - return -1; - } - // Add EndDirective enum to ZstdCompressor if (add_constant_to_type(mod_state->ZstdCompressor_type, "CONTINUE", @@ -751,13 +733,7 @@ static int _zstd_exec(PyObject *module) { return -1; } - // ZstdDecompressor - if (add_type_to_module(module, - "ZstdDecompressor", - &zstddecompressor_type_spec, - &mod_state->ZstdDecompressor_type) < 0) { - return -1; - } +#undef ADD_TYPE return 0; } diff --git a/Modules/_zstd/_zstdmodule.h b/Modules/_zstd/_zstdmodule.h index 5d2ffdb559db57..144819d8b974c4 100644 --- a/Modules/_zstd/_zstdmodule.h +++ b/Modules/_zstd/_zstdmodule.h @@ -30,9 +30,9 @@ get_zstd_state_from_type(PyTypeObject *type) { return (_zstd_state *)state; } -extern PyType_Spec zstddict_type_spec; -extern PyType_Spec zstdcompressor_type_spec; -extern PyType_Spec zstddecompressor_type_spec; +extern PyType_Spec zstd_dict_type_spec; +extern PyType_Spec zstd_compressor_type_spec; +extern PyType_Spec zstd_decompressor_type_spec; struct _zstd_state { PyObject *empty_bytes; diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c index fc1d3b9d210639..48ecf4b0da99dc 100644 --- a/Modules/_zstd/compressor.c +++ b/Modules/_zstd/compressor.c @@ -699,7 +699,7 @@ static PyType_Slot zstdcompressor_slots[] = { {0} }; -PyType_Spec zstdcompressor_type_spec = { +PyType_Spec zstd_compressor_type_spec = { .name = "_zstd.ZstdCompressor", .basicsize = sizeof(ZstdCompressor), .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c index 4ac28d9c987d82..d141e68efded26 100644 --- a/Modules/_zstd/decompressor.c +++ b/Modules/_zstd/decompressor.c @@ -883,7 +883,7 @@ static PyType_Slot ZstdDecompressor_slots[] = { {0} }; -PyType_Spec zstddecompressor_type_spec = { +PyType_Spec zstd_decompressor_type_spec = { .name = "_zstd.ZstdDecompressor", .basicsize = sizeof(ZstdDecompressor), .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, diff --git a/Modules/_zstd/zstddict.c b/Modules/_zstd/zstddict.c index 53c96b104104e0..b411eadfc95625 100644 --- a/Modules/_zstd/zstddict.c +++ b/Modules/_zstd/zstddict.c @@ -278,7 +278,7 @@ static PyType_Slot zstddict_slots[] = { {0} }; -PyType_Spec zstddict_type_spec = { +PyType_Spec zstd_dict_type_spec = { .name = "_zstd.ZstdDict", .basicsize = sizeof(ZstdDict), .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, From daf2e315cf290dfad24f4b22d4691f8145b813ea Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 9 May 2025 16:09:33 +0100 Subject: [PATCH 2/6] Remove unused variables from module state --- Modules/_zstd/_zstdmodule.c | 30 ------------------------------ Modules/_zstd/_zstdmodule.h | 5 ----- 2 files changed, 35 deletions(-) diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index 2bc387564e5788..4ef807cd2d1bf5 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -634,14 +634,6 @@ add_vars_to_module(PyObject *m) return 0; } -#define ADD_STR_TO_STATE_MACRO(STR) \ - do { \ - mod_state->str_##STR = PyUnicode_FromString(#STR); \ - if (mod_state->str_##STR == NULL) { \ - return -1; \ - } \ - } while(0) - static inline int add_constant_to_type(PyTypeObject *type, const char *name, long value) { @@ -678,18 +670,6 @@ do { \ return -1; } - mod_state->empty_readonly_memoryview = - PyMemoryView_FromMemory((char*)mod_state, 0, PyBUF_READ); - if (mod_state->empty_readonly_memoryview == NULL) { - return -1; - } - - /* Add str to module state */ - ADD_STR_TO_STATE_MACRO(read); - ADD_STR_TO_STATE_MACRO(readinto); - ADD_STR_TO_STATE_MACRO(write); - ADD_STR_TO_STATE_MACRO(flush); - mod_state->CParameter_type = NULL; mod_state->DParameter_type = NULL; @@ -744,11 +724,6 @@ _zstd_traverse(PyObject *module, visitproc visit, void *arg) _zstd_state* const mod_state = get_zstd_state(module); Py_VISIT(mod_state->empty_bytes); - Py_VISIT(mod_state->empty_readonly_memoryview); - Py_VISIT(mod_state->str_read); - Py_VISIT(mod_state->str_readinto); - Py_VISIT(mod_state->str_write); - Py_VISIT(mod_state->str_flush); Py_VISIT(mod_state->ZstdDict_type); Py_VISIT(mod_state->ZstdCompressor_type); @@ -768,11 +743,6 @@ _zstd_clear(PyObject *module) _zstd_state* const mod_state = get_zstd_state(module); Py_CLEAR(mod_state->empty_bytes); - Py_CLEAR(mod_state->empty_readonly_memoryview); - Py_CLEAR(mod_state->str_read); - Py_CLEAR(mod_state->str_readinto); - Py_CLEAR(mod_state->str_write); - Py_CLEAR(mod_state->str_flush); Py_CLEAR(mod_state->ZstdDict_type); Py_CLEAR(mod_state->ZstdCompressor_type); diff --git a/Modules/_zstd/_zstdmodule.h b/Modules/_zstd/_zstdmodule.h index 144819d8b974c4..58622a5cb48b5e 100644 --- a/Modules/_zstd/_zstdmodule.h +++ b/Modules/_zstd/_zstdmodule.h @@ -36,11 +36,6 @@ extern PyType_Spec zstd_decompressor_type_spec; struct _zstd_state { PyObject *empty_bytes; - PyObject *empty_readonly_memoryview; - PyObject *str_read; - PyObject *str_readinto; - PyObject *str_write; - PyObject *str_flush; PyTypeObject *ZstdDict_type; PyTypeObject *ZstdCompressor_type; From 55f876a5a1843f303a8b307905c6454f13d0f4ca Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 9 May 2025 16:26:50 +0100 Subject: [PATCH 3/6] Add constants to ZstdCompressor in Python --- Lib/compression/zstd/__init__.py | 5 ++++ Lib/compression/zstd/_zstdfile.py | 6 ++--- Modules/_zstd/_zstdmodule.c | 39 ++++--------------------------- 3 files changed, 13 insertions(+), 37 deletions(-) diff --git a/Lib/compression/zstd/__init__.py b/Lib/compression/zstd/__init__.py index a1054adb64170b..f34d4ca2bc9c4f 100644 --- a/Lib/compression/zstd/__init__.py +++ b/Lib/compression/zstd/__init__.py @@ -40,6 +40,11 @@ COMPRESSION_LEVEL_DEFAULT = _zstd.ZSTD_CLEVEL_DEFAULT """The default compression level for Zstandard, currently '3'.""" +# Set ZSTD_EndDirective constants on ZstdCompressor +ZstdCompressor.CONTINUE = _zstd.ZSTD_e_continue +ZstdCompressor.FLUSH_BLOCK = _zstd.ZSTD_e_flush +ZstdCompressor.FLUSH_FRAME = _zstd.ZSTD_e_end + class FrameInfo: """Information about a Zstandard frame.""" diff --git a/Lib/compression/zstd/_zstdfile.py b/Lib/compression/zstd/_zstdfile.py index 1ff249965692ae..9c423a74579276 100644 --- a/Lib/compression/zstd/_zstdfile.py +++ b/Lib/compression/zstd/_zstdfile.py @@ -1,7 +1,7 @@ import io from os import PathLike from _zstd import (ZstdCompressor, ZstdDecompressor, ZstdError, - ZSTD_DStreamOutSize) + ZSTD_DStreamOutSize, ZSTD_e_end, ZSTD_e_flush) from compression._common import _streams __all__ = ("ZstdFile", "open") @@ -28,8 +28,8 @@ class ZstdFile(_streams.BaseStream): bytes, and may only be written to objects that support the Buffer Protocol. """ - FLUSH_BLOCK = ZstdCompressor.FLUSH_BLOCK - FLUSH_FRAME = ZstdCompressor.FLUSH_FRAME + FLUSH_BLOCK = ZSTD_e_flush # ZstdCompressor.FLUSH_BLOCK + FLUSH_FRAME = ZSTD_e_end # ZstdCompressor.FLUSH_FRAME def __init__(self, file, /, mode="r", *, level=None, options=None, zstd_dict=None): diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index 4ef807cd2d1bf5..7dc6ac42528ffe 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -629,26 +629,16 @@ add_vars_to_module(PyObject *m) ADD_INT_MACRO(ZSTD_btultra); ADD_INT_MACRO(ZSTD_btultra2); + /* ZSTD_EndDirective enum */ + ADD_INT_MACRO(ZSTD_e_continue); + ADD_INT_MACRO(ZSTD_e_flush); + ADD_INT_MACRO(ZSTD_e_end); + #undef ADD_INT_MACRO return 0; } -static inline int -add_constant_to_type(PyTypeObject *type, const char *name, long value) -{ - PyObject *temp; - - temp = PyLong_FromLong(value); - if (temp == NULL) { - return -1; - } - - int rc = PyObject_SetAttrString((PyObject*) type, name, temp); - Py_DECREF(temp); - return rc; -} - static int _zstd_exec(PyObject *m) { #define ADD_TYPE(TYPE, SPEC) \ @@ -694,25 +684,6 @@ do { \ return -1; } - // Add EndDirective enum to ZstdCompressor - if (add_constant_to_type(mod_state->ZstdCompressor_type, - "CONTINUE", - ZSTD_e_continue) < 0) { - return -1; - } - - if (add_constant_to_type(mod_state->ZstdCompressor_type, - "FLUSH_BLOCK", - ZSTD_e_flush) < 0) { - return -1; - } - - if (add_constant_to_type(mod_state->ZstdCompressor_type, - "FLUSH_FRAME", - ZSTD_e_end) < 0) { - return -1; - } - #undef ADD_TYPE return 0; From 6a3a1353e4fa418b3cbe597ab336afc118406fed Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 9 May 2025 16:44:21 +0100 Subject: [PATCH 4/6] Merge add_vars_to_module into _zstd_exec --- Modules/_zstd/_zstdmodule.c | 102 +++++++++++++++--------------------- 1 file changed, 43 insertions(+), 59 deletions(-) diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index 7dc6ac42528ffe..c9290a3ad62bcd 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -554,28 +554,62 @@ static PyMethodDef _zstd_methods[] = { {0} }; - -static inline int -add_vars_to_module(PyObject *m) +static int _zstd_exec(PyObject *m) { +#define ADD_TYPE(TYPE, SPEC) \ +do { \ + TYPE = (PyTypeObject *)PyType_FromModuleAndSpec(m, &(SPEC), NULL); \ + if (TYPE == NULL) { \ + return -1; \ + } \ + if (PyModule_AddType(m, TYPE) < 0) { \ + return -1; \ + } \ +} while (0) + #define ADD_INT_MACRO(MACRO) \ if (PyModule_AddIntConstant((m), #MACRO, (MACRO)) < 0) { \ return -1; \ } - /* zstd_version_number, int */ + _zstd_state* const mod_state = get_zstd_state(m); + + /* Reusable objects & variables */ + mod_state->empty_bytes = PyBytes_FromStringAndSize(NULL, 0); + if (mod_state->empty_bytes == NULL) { + return -1; + } + + mod_state->CParameter_type = NULL; + mod_state->DParameter_type = NULL; + + /* Create and add heap types */ + ADD_TYPE(mod_state->ZstdDict_type, zstd_dict_type_spec); + ADD_TYPE(mod_state->ZstdCompressor_type, zstd_compressor_type_spec); + ADD_TYPE(mod_state->ZstdDecompressor_type, zstd_decompressor_type_spec); + mod_state->ZstdError = PyErr_NewExceptionWithDoc( + "_zstd.ZstdError", + "An error occurred in the zstd library.", + NULL, NULL); + if (mod_state->ZstdError == NULL) { + return -1; + } + if (PyModule_AddType(m, (PyTypeObject *)mod_state->ZstdError) < 0) { + Py_DECREF(mod_state->ZstdError); + return -1; + } + + /* Add constants */ if (PyModule_AddIntConstant(m, "zstd_version_number", ZSTD_versionNumber()) < 0) { return -1; } - /* zstd_version, str */ if (PyModule_AddStringConstant(m, "zstd_version", ZSTD_versionString()) < 0) { return -1; } - /* ZSTD_CLEVEL_DEFAULT, int */ #if ZSTD_VERSION_NUMBER >= 10500 if (PyModule_AddIntConstant(m, "ZSTD_CLEVEL_DEFAULT", ZSTD_defaultCLevel()) < 0) { @@ -585,7 +619,6 @@ add_vars_to_module(PyObject *m) ADD_INT_MACRO(ZSTD_CLEVEL_DEFAULT); #endif - /* ZSTD_DStreamOutSize, int */ if (PyModule_Add(m, "ZSTD_DStreamOutSize", PyLong_FromSize_t(ZSTD_DStreamOutSize())) < 0) { return -1; @@ -618,7 +651,7 @@ add_vars_to_module(PyObject *m) /* Add zstd decompression parameters. All should also be in dp_list. */ ADD_INT_MACRO(ZSTD_d_windowLogMax); - /* ZSTD_strategy enum */ + /* Add ZSTD_strategy enum members */ ADD_INT_MACRO(ZSTD_fast); ADD_INT_MACRO(ZSTD_dfast); ADD_INT_MACRO(ZSTD_greedy); @@ -629,62 +662,13 @@ add_vars_to_module(PyObject *m) ADD_INT_MACRO(ZSTD_btultra); ADD_INT_MACRO(ZSTD_btultra2); - /* ZSTD_EndDirective enum */ + /* Add ZSTD_EndDirective enum members */ ADD_INT_MACRO(ZSTD_e_continue); ADD_INT_MACRO(ZSTD_e_flush); ADD_INT_MACRO(ZSTD_e_end); -#undef ADD_INT_MACRO - - return 0; -} - -static int _zstd_exec(PyObject *m) -{ -#define ADD_TYPE(TYPE, SPEC) \ -do { \ - TYPE = (PyTypeObject *)PyType_FromModuleAndSpec(m, &(SPEC), NULL); \ - if (TYPE == NULL) { \ - return -1; \ - } \ - if (PyModule_AddType(m, TYPE) < 0) { \ - return -1; \ - } \ -} while (0) - - _zstd_state* const mod_state = get_zstd_state(m); - - /* Reusable objects & variables */ - mod_state->empty_bytes = PyBytes_FromStringAndSize(NULL, 0); - if (mod_state->empty_bytes == NULL) { - return -1; - } - - mod_state->CParameter_type = NULL; - mod_state->DParameter_type = NULL; - - /* Add variables to module */ - if (add_vars_to_module(m) < 0) { - return -1; - } - - /* Create and add heap types */ - ADD_TYPE(mod_state->ZstdDict_type, zstd_dict_type_spec); - ADD_TYPE(mod_state->ZstdCompressor_type, zstd_compressor_type_spec); - ADD_TYPE(mod_state->ZstdDecompressor_type, zstd_decompressor_type_spec); - mod_state->ZstdError = PyErr_NewExceptionWithDoc( - "_zstd.ZstdError", - "An error occurred in the zstd library.", - NULL, NULL); - if (mod_state->ZstdError == NULL) { - return -1; - } - if (PyModule_AddType(m, (PyTypeObject *)mod_state->ZstdError) < 0) { - Py_DECREF(mod_state->ZstdError); - return -1; - } - #undef ADD_TYPE +#undef ADD_INT_MACRO return 0; } From d5ff6d322011f0022df764b1ae0891f6745a9a82 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 9 May 2025 17:30:41 +0100 Subject: [PATCH 5/6] PEP 7 --- Modules/_zstd/_zstdmodule.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index c9290a3ad62bcd..7178d4e57bf49b 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -554,7 +554,8 @@ static PyMethodDef _zstd_methods[] = { {0} }; -static int _zstd_exec(PyObject *m) +static int +_zstd_exec(PyObject *m) { #define ADD_TYPE(TYPE, SPEC) \ do { \ From 9f402d7e36f0e196bab363a84ae0dfc891f52341 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 9 May 2025 19:23:16 +0100 Subject: [PATCH 6/6] Add constants to ZstdCompressor in C --- Lib/compression/zstd/__init__.py | 5 ----- Lib/compression/zstd/_zstdfile.py | 6 +++--- Modules/_zstd/_zstdmodule.c | 23 +++++++++++++++++++---- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Lib/compression/zstd/__init__.py b/Lib/compression/zstd/__init__.py index f34d4ca2bc9c4f..a1054adb64170b 100644 --- a/Lib/compression/zstd/__init__.py +++ b/Lib/compression/zstd/__init__.py @@ -40,11 +40,6 @@ COMPRESSION_LEVEL_DEFAULT = _zstd.ZSTD_CLEVEL_DEFAULT """The default compression level for Zstandard, currently '3'.""" -# Set ZSTD_EndDirective constants on ZstdCompressor -ZstdCompressor.CONTINUE = _zstd.ZSTD_e_continue -ZstdCompressor.FLUSH_BLOCK = _zstd.ZSTD_e_flush -ZstdCompressor.FLUSH_FRAME = _zstd.ZSTD_e_end - class FrameInfo: """Information about a Zstandard frame.""" diff --git a/Lib/compression/zstd/_zstdfile.py b/Lib/compression/zstd/_zstdfile.py index 9c423a74579276..1ff249965692ae 100644 --- a/Lib/compression/zstd/_zstdfile.py +++ b/Lib/compression/zstd/_zstdfile.py @@ -1,7 +1,7 @@ import io from os import PathLike from _zstd import (ZstdCompressor, ZstdDecompressor, ZstdError, - ZSTD_DStreamOutSize, ZSTD_e_end, ZSTD_e_flush) + ZSTD_DStreamOutSize) from compression._common import _streams __all__ = ("ZstdFile", "open") @@ -28,8 +28,8 @@ class ZstdFile(_streams.BaseStream): bytes, and may only be written to objects that support the Buffer Protocol. """ - FLUSH_BLOCK = ZSTD_e_flush # ZstdCompressor.FLUSH_BLOCK - FLUSH_FRAME = ZSTD_e_end # ZstdCompressor.FLUSH_FRAME + FLUSH_BLOCK = ZstdCompressor.FLUSH_BLOCK + FLUSH_FRAME = ZstdCompressor.FLUSH_FRAME def __init__(self, file, /, mode="r", *, level=None, options=None, zstd_dict=None): diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index 7178d4e57bf49b..4004bbb3461393 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -573,6 +573,17 @@ do { \ return -1; \ } +#define ADD_INT_CONST_TO_TYPE(TYPE, NAME, VALUE) \ +do { \ + PyObject *v = PyLong_FromLong((VALUE)); \ + if (v == NULL || PyObject_SetAttrString((PyObject *)(TYPE), \ + (NAME), v) < 0) { \ + Py_XDECREF(v); \ + return -1; \ + } \ + Py_DECREF(v); \ +} while (0) + _zstd_state* const mod_state = get_zstd_state(m); /* Reusable objects & variables */ @@ -663,13 +674,17 @@ do { \ ADD_INT_MACRO(ZSTD_btultra); ADD_INT_MACRO(ZSTD_btultra2); - /* Add ZSTD_EndDirective enum members */ - ADD_INT_MACRO(ZSTD_e_continue); - ADD_INT_MACRO(ZSTD_e_flush); - ADD_INT_MACRO(ZSTD_e_end); + /* Add ZSTD_EndDirective enum members to ZstdCompressor */ + ADD_INT_CONST_TO_TYPE(mod_state->ZstdCompressor_type, + "CONTINUE", ZSTD_e_continue); + ADD_INT_CONST_TO_TYPE(mod_state->ZstdCompressor_type, + "FLUSH_BLOCK", ZSTD_e_flush); + ADD_INT_CONST_TO_TYPE(mod_state->ZstdCompressor_type, + "FLUSH_FRAME", ZSTD_e_end); #undef ADD_TYPE #undef ADD_INT_MACRO +#undef ADD_ZSTD_COMPRESSOR_INT_CONST return 0; }