From ad0832903a7cd1e8621cf0ca57e7aa4ff9dfea7d Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Thu, 30 Sep 2021 10:45:01 +0200 Subject: [PATCH] Add FreeHypos function. Remove old Python 2 preproc definition --- src/runtime/python/ffi.c | 19 +++++++++++-------- src/runtime/python/ffi.h | 1 + src/runtime/python/pypgf.c | 22 +++++++--------------- src/runtime/python/transactions.c | 7 ++----- 4 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/runtime/python/ffi.c b/src/runtime/python/ffi.c index 4df306b62..23890a55a 100644 --- a/src/runtime/python/ffi.c +++ b/src/runtime/python/ffi.c @@ -42,9 +42,6 @@ PyUnicode_AsPgfText(PyObject *pystr) PyErr_SetString(PyExc_TypeError, "input to PyUnicode_AsPgfText is not a string"); return NULL; } - if (PyUnicode_READY(pystr) != 0) { - return NULL; - } Py_ssize_t size; const char *enc = PyUnicode_AsUTF8AndSize(pystr, &size); @@ -186,6 +183,16 @@ FreePgfText(PgfText *txt) PyMem_RawFree(txt); } +void +FreeHypos(PgfTypeHypo *hypos, Py_ssize_t n_hypos) +{ + for (Py_ssize_t i = 0; i < n_hypos; i++) { + FreePgfText(hypos[i].cid); + Py_DECREF(hypos[i].type); + } + PyMem_RawFree(hypos); +} + void FreePgfPrintContext(PgfPrintContext *ctxt) { @@ -508,11 +515,7 @@ match_type(PgfMarshaller *this, PgfUnmarshaller *u, PgfType ty) for (Py_ssize_t i = 0; i < n_exprs; i++) { Py_DECREF(exprs[i]); } - for (Py_ssize_t i = 0; i < n_hypos; i++) { - free(hypos[i].cid); - Py_DECREF(hypos[i].type); - } - PyMem_Free(hypos); + FreeHypos(hypos, n_hypos); FreePgfText(cat); return res; diff --git a/src/runtime/python/ffi.h b/src/runtime/python/ffi.h index c5381d9d5..1d3ca3f25 100644 --- a/src/runtime/python/ffi.h +++ b/src/runtime/python/ffi.h @@ -26,6 +26,7 @@ PyObject *PyList_FromHypos(PgfTypeHypo *hypos, const size_t n_hypos); PgfPrintContext *PyList_AsPgfPrintContext(PyObject *pylist); void FreePgfText(PgfText *txt); +void FreeHypos(PgfTypeHypo *hypos, Py_ssize_t n_hypos); void FreePgfPrintContext(PgfPrintContext *ctxt); PgfUnmarshaller unmarshaller; diff --git a/src/runtime/python/pypgf.c b/src/runtime/python/pypgf.c index 02d9a756a..0354904d6 100644 --- a/src/runtime/python/pypgf.c +++ b/src/runtime/python/pypgf.c @@ -724,21 +724,13 @@ static PyMethodDef module_methods[] = { {NULL, NULL, 0, NULL} /* Sentinel */ }; -#if PY_MAJOR_VERSION >= 3 - #define MOD_ERROR_VAL NULL - #define MOD_SUCCESS_VAL(val) val - #define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) - #define MOD_DEF(ob, name, doc, methods) \ - static struct PyModuleDef moduledef = { \ - PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ - ob = PyModule_Create(&moduledef); -#else - #define MOD_ERROR_VAL - #define MOD_SUCCESS_VAL(val) - #define MOD_INIT(name) void init##name(void) - #define MOD_DEF(ob, name, doc, methods) \ - ob = Py_InitModule3(name, methods, doc); -#endif +#define MOD_ERROR_VAL NULL +#define MOD_SUCCESS_VAL(val) val +#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) +#define MOD_DEF(ob, name, doc, methods) \ + static struct PyModuleDef moduledef = { \ + PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ + ob = PyModule_Create(&moduledef); #define TYPE_READY(type) \ if (PyType_Ready(&type) < 0) \ diff --git a/src/runtime/python/transactions.c b/src/runtime/python/transactions.c index f2c5d5249..ce265dbce 100644 --- a/src/runtime/python/transactions.c +++ b/src/runtime/python/transactions.c @@ -205,12 +205,9 @@ Transaction_createCategory(TransactionObject *self, PyObject *args) pgf_create_category(self->pgf->db, self->revision, catname, n_hypos, context, prob, &marshaller, &err); FreePgfText(catname); - for (Py_ssize_t i = 0; i < n_hypos; i++) { - FreePgfText(context[i].cid); - } - PyMem_Free(context); + FreeHypos(context, n_hypos); - if (handleError(err) != PGF_EXN_NONE) { + if (handleError(err) != PGF_EXN_NONE) { return NULL; }