From b3542651fb35abacdc085e8689546090eda71ab4 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 5 Jan 2021 22:57:45 +0100 Subject: [PATCH 1/3] Allocate unicodedata CAPI on the heap --- Modules/unicodedata.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 4b8c46c7797665..604259164a5867 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1308,10 +1308,24 @@ capi_getcode(const char* name, int namelen, Py_UCS4* code, } -static const _PyUnicode_Name_CAPI unicodedata_capi = +static void +udc_destroy_capi(PyObject *capsule) +{ + void *capi = PyCapsule_GetPointer(capsule, PyUnicodeData_CAPSULE_NAME); + PyMem_Free(capi); +} + +static _PyUnicode_Name_CAPI * +udc_get_capi(void) { - .getname = capi_getucname, - .getcode = capi_getcode, + _PyUnicode_Name_CAPI *capi = PyMem_Malloc(sizeof(_PyUnicode_Name_CAPI)); + if (capi == NULL) { + PyErr_NoMemory(); + return NULL; + } + capi->getname = capi_getucname; + capi->getcode = capi_getcode; + return capi; }; @@ -1477,13 +1491,19 @@ unicodedata_exec(PyObject *module) } /* Export C API */ - v = PyCapsule_New((void *)&unicodedata_capi, PyUnicodeData_CAPSULE_NAME, - NULL); - if (v == NULL) { + _PyUnicode_Name_CAPI *capi = udc_get_capi(); + if (capi == NULL) { return -1; } - if (PyModule_AddObject(module, "_ucnhash_CAPI", v) < 0) { - Py_DECREF(v); + PyObject *capsule = PyCapsule_New(capi, + PyUnicodeData_CAPSULE_NAME, + udc_destroy_capi); + if (capsule == NULL) { + PyMem_Free(capi); + return -1; + } + if (PyModule_AddObject(module, "_ucnhash_CAPI", capsule) < 0) { + Py_DECREF(capsule); return -1; } return 0; From bf0e6015017701e72a8ef2f9826a1a8f4f811409 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 10 Jan 2021 20:34:45 +0100 Subject: [PATCH 2/3] Address review: Use PyModule_AddObjectRef iso. PyModuel_AddObject --- Modules/unicodedata.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 604259164a5867..d72ee706d5a540 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1502,8 +1502,9 @@ unicodedata_exec(PyObject *module) PyMem_Free(capi); return -1; } - if (PyModule_AddObject(module, "_ucnhash_CAPI", capsule) < 0) { - Py_DECREF(capsule); + int rc = PyModule_AddObjectRef(module, "_ucnhash_CAPI", capsule); + Py_DECREF(capsule); + if (rc < 0) { return -1; } return 0; From 720ada4199fd713f0fe38d1b6a1c1d8bbcfc2775 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 20 Jan 2021 11:24:17 +0100 Subject: [PATCH 3/3] Address review --- Modules/unicodedata.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index d72ee706d5a540..aebae7da576561 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1309,14 +1309,14 @@ capi_getcode(const char* name, int namelen, Py_UCS4* code, } static void -udc_destroy_capi(PyObject *capsule) +unicodedata_destroy_capi(PyObject *capsule) { void *capi = PyCapsule_GetPointer(capsule, PyUnicodeData_CAPSULE_NAME); PyMem_Free(capi); } -static _PyUnicode_Name_CAPI * -udc_get_capi(void) +static PyObject * +unicodedata_create_capi(void) { _PyUnicode_Name_CAPI *capi = PyMem_Malloc(sizeof(_PyUnicode_Name_CAPI)); if (capi == NULL) { @@ -1325,7 +1325,14 @@ udc_get_capi(void) } capi->getname = capi_getucname; capi->getcode = capi_getcode; - return capi; + + PyObject *capsule = PyCapsule_New(capi, + PyUnicodeData_CAPSULE_NAME, + unicodedata_destroy_capi); + if (capsule == NULL) { + PyMem_Free(capi); + } + return capsule; }; @@ -1491,15 +1498,8 @@ unicodedata_exec(PyObject *module) } /* Export C API */ - _PyUnicode_Name_CAPI *capi = udc_get_capi(); - if (capi == NULL) { - return -1; - } - PyObject *capsule = PyCapsule_New(capi, - PyUnicodeData_CAPSULE_NAME, - udc_destroy_capi); + PyObject *capsule = unicodedata_create_capi(); if (capsule == NULL) { - PyMem_Free(capi); return -1; } int rc = PyModule_AddObjectRef(module, "_ucnhash_CAPI", capsule);