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; }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: