Skip to content

Commit 61d2639

Browse files
author
Erlend Egeberg Aasland
authored
bpo-41798: Allocate unicodedata CAPI on the heap (GH-24128)
1 parent 1459fed commit 61d2639

File tree

1 file changed

+29
-8
lines changed

1 file changed

+29
-8
lines changed

Diff for: Modules/unicodedata.c

+29-8
Original file line numberDiff line numberDiff line change
@@ -1308,10 +1308,31 @@ capi_getcode(const char* name, int namelen, Py_UCS4* code,
13081308

13091309
}
13101310

1311-
static const _PyUnicode_Name_CAPI unicodedata_capi =
1311+
static void
1312+
unicodedata_destroy_capi(PyObject *capsule)
13121313
{
1313-
.getname = capi_getucname,
1314-
.getcode = capi_getcode,
1314+
void *capi = PyCapsule_GetPointer(capsule, PyUnicodeData_CAPSULE_NAME);
1315+
PyMem_Free(capi);
1316+
}
1317+
1318+
static PyObject *
1319+
unicodedata_create_capi(void)
1320+
{
1321+
_PyUnicode_Name_CAPI *capi = PyMem_Malloc(sizeof(_PyUnicode_Name_CAPI));
1322+
if (capi == NULL) {
1323+
PyErr_NoMemory();
1324+
return NULL;
1325+
}
1326+
capi->getname = capi_getucname;
1327+
capi->getcode = capi_getcode;
1328+
1329+
PyObject *capsule = PyCapsule_New(capi,
1330+
PyUnicodeData_CAPSULE_NAME,
1331+
unicodedata_destroy_capi);
1332+
if (capsule == NULL) {
1333+
PyMem_Free(capi);
1334+
}
1335+
return capsule;
13151336
};
13161337

13171338

@@ -1477,13 +1498,13 @@ unicodedata_exec(PyObject *module)
14771498
}
14781499

14791500
/* Export C API */
1480-
v = PyCapsule_New((void *)&unicodedata_capi, PyUnicodeData_CAPSULE_NAME,
1481-
NULL);
1482-
if (v == NULL) {
1501+
PyObject *capsule = unicodedata_create_capi();
1502+
if (capsule == NULL) {
14831503
return -1;
14841504
}
1485-
if (PyModule_AddObject(module, "_ucnhash_CAPI", v) < 0) {
1486-
Py_DECREF(v);
1505+
int rc = PyModule_AddObjectRef(module, "_ucnhash_CAPI", capsule);
1506+
Py_DECREF(capsule);
1507+
if (rc < 0) {
14871508
return -1;
14881509
}
14891510
return 0;

0 commit comments

Comments
 (0)