From 548a5d0863265427184875ffaae7924d296d859b Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 5 Jan 2021 14:56:07 +0100 Subject: [PATCH 1/5] bpo-41798: Allocate _decimal extension module CAPI on the heap --- Modules/_decimal/_decimal.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 9c85d76c6b5b8a..fadf53c563124b 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -5574,8 +5574,6 @@ static PyTypeObject PyDecContext_Type = /* C-API */ /****************************************************************************/ -static void *_decimal_api[CPYTHON_DECIMAL_MAX_API]; - /* Simple API */ static int PyDec_TypeCheck(const PyObject *v) @@ -5699,9 +5697,29 @@ PyDec_GetConst(const PyObject *v) return MPD(v); } +static void +free_api(void *capi) +{ + PyMem_Free(capi); +} + +#define CAPSULE_NAME "_decimal._API" +static void +destroy_api(PyObject *obj) +{ + void *capi = PyCapsule_GetPointer(obj, CAPSULE_NAME); + free_api(capi); +} + static PyObject * init_api(void) { + void **_decimal_api = PyMem_Malloc(CPYTHON_DECIMAL_MAX_API * sizeof(void *)); + if (_decimal_api == NULL) { + PyErr_NoMemory(); + return NULL; + } + /* Simple API */ _decimal_api[PyDec_TypeCheck_INDEX] = (void *)PyDec_TypeCheck; _decimal_api[PyDec_IsSpecial_INDEX] = (void *)PyDec_IsSpecial; @@ -5716,8 +5734,13 @@ init_api(void) _decimal_api[PyDec_Get_INDEX] = (void *)PyDec_Get; _decimal_api[PyDec_GetConst_INDEX] = (void *)PyDec_GetConst; - return PyCapsule_New(_decimal_api, "_decimal._API", NULL); + PyObject *capsule = PyCapsule_New(_decimal_api, CAPSULE_NAME, destroy_api); + if (!capsule) { + free_api(_decimal_api); + } + return capsule; } +#undef CAPSULE_NAME /****************************************************************************/ @@ -6080,8 +6103,7 @@ PyInit__decimal(void) CHECK_INT(PyModule_AddStringConstant(m, "__libmpdec_version__", mpd_version())); /* Add capsule API */ - Py_INCREF(capsule); - if (PyModule_AddObject(m, "_API", capsule) < 0) { + if (PyModule_AddObjectRef(m, "_API", capsule) < 0) { goto error; } @@ -6107,6 +6129,7 @@ PyInit__decimal(void) Py_CLEAR(basic_context_template); /* GCOV_NOT_REACHED */ Py_CLEAR(extended_context_template); /* GCOV_NOT_REACHED */ Py_CLEAR(m); /* GCOV_NOT_REACHED */ + Py_CLEAR(capsule); /* GCOV_NOT_REACHED */ return NULL; /* GCOV_NOT_REACHED */ } From d54e7d5f9ee038b6a0fa6267fc1bdad8d7e9796a Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 5 Jan 2021 20:44:29 +0100 Subject: [PATCH 2/5] Address review: Move capsule name macro to header file --- Include/pydecimal.h | 4 +++- Modules/_decimal/_decimal.c | 6 ++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Include/pydecimal.h b/Include/pydecimal.h index 9b6440e1c2ab1c..f82e41f0aac054 100644 --- a/Include/pydecimal.h +++ b/Include/pydecimal.h @@ -66,6 +66,8 @@ typedef struct { /* Capsule API */ /****************************************************************************/ +#define PyDec_CAPSULE_NAME "_decimal._API" + /* Simple API */ #define PyDec_TypeCheck_INDEX 0 #define PyDec_TypeCheck_RETURN int @@ -164,7 +166,7 @@ static void **_decimal_api; static int import_decimal(void) { - _decimal_api = (void **)PyCapsule_Import("_decimal._API", 0); + _decimal_api = (void **)PyCapsule_Import(PyDec_CAPSULE_NAME, 0); if (_decimal_api == NULL) { return -1; } diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index fadf53c563124b..912546be3a520f 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -5703,11 +5703,10 @@ free_api(void *capi) PyMem_Free(capi); } -#define CAPSULE_NAME "_decimal._API" static void destroy_api(PyObject *obj) { - void *capi = PyCapsule_GetPointer(obj, CAPSULE_NAME); + void *capi = PyCapsule_GetPointer(obj, PyDec_CAPSULE_NAME); free_api(capi); } @@ -5734,13 +5733,12 @@ init_api(void) _decimal_api[PyDec_Get_INDEX] = (void *)PyDec_Get; _decimal_api[PyDec_GetConst_INDEX] = (void *)PyDec_GetConst; - PyObject *capsule = PyCapsule_New(_decimal_api, CAPSULE_NAME, destroy_api); + PyObject *capsule = PyCapsule_New(_decimal_api, PyDec_CAPSULE_NAME, destroy_api); if (!capsule) { free_api(_decimal_api); } return capsule; } -#undef CAPSULE_NAME /****************************************************************************/ From aa5a4e7ac5551cd6b81b3ea63671918d99c4326a Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 5 Jan 2021 20:46:29 +0100 Subject: [PATCH 3/5] Address review: Use calloc iso. malloc --- Modules/_decimal/_decimal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 912546be3a520f..477a1bcb60479c 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -5713,7 +5713,7 @@ destroy_api(PyObject *obj) static PyObject * init_api(void) { - void **_decimal_api = PyMem_Malloc(CPYTHON_DECIMAL_MAX_API * sizeof(void *)); + void **_decimal_api = PyMem_Calloc(CPYTHON_DECIMAL_MAX_API, sizeof(void *)); if (_decimal_api == NULL) { PyErr_NoMemory(); return NULL; From 545994384f3cdbb7ab755224f83444c6c8b0f18d Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 5 Jan 2021 20:51:19 +0100 Subject: [PATCH 4/5] Address review: Drop free_api() aux. method --- Modules/_decimal/_decimal.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 477a1bcb60479c..5b7c7d91feccda 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -5697,17 +5697,11 @@ PyDec_GetConst(const PyObject *v) return MPD(v); } -static void -free_api(void *capi) -{ - PyMem_Free(capi); -} - static void destroy_api(PyObject *obj) { void *capi = PyCapsule_GetPointer(obj, PyDec_CAPSULE_NAME); - free_api(capi); + PyMem_Free(capi); } static PyObject * @@ -5735,7 +5729,7 @@ init_api(void) PyObject *capsule = PyCapsule_New(_decimal_api, PyDec_CAPSULE_NAME, destroy_api); if (!capsule) { - free_api(_decimal_api); + PyMem_Free(_decimal_api); } return capsule; } From a8c17a4e9181b26e2b26bbc3a03861d78fdbe3d1 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 5 Jan 2021 23:08:39 +0100 Subject: [PATCH 5/5] Improve naming --- Modules/_decimal/_decimal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 5b7c7d91feccda..664d45a90481df 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -5698,9 +5698,9 @@ PyDec_GetConst(const PyObject *v) } static void -destroy_api(PyObject *obj) +destroy_api(PyObject *capsule) { - void *capi = PyCapsule_GetPointer(obj, PyDec_CAPSULE_NAME); + void *capi = PyCapsule_GetPointer(capsule, PyDec_CAPSULE_NAME); PyMem_Free(capi); }