Add FreePgfText function

This commit is contained in:
John J. Camilleri
2021-09-24 15:00:10 +02:00
parent d17ca06faf
commit 4719e509a5
4 changed files with 43 additions and 32 deletions

View File

@@ -28,8 +28,6 @@ PgfExnType handleError(PgfExn err)
// ----------------------------------------------------------------------------
// conversions
//
// You have to remember to call PyMem_Free on these things!
PgfText *
CString_AsPgfText(const char *s, size_t size) {
@@ -154,6 +152,15 @@ PyList_AsPgfPrintContext(PyObject *pylist)
return ctxt;
}
// ----------------------------------------------------------------------------
// freers
void
FreePgfText(PgfText *txt)
{
PyMem_RawFree(txt);
}
void
FreePgfPrintContext(PgfPrintContext *ctxt)
{

View File

@@ -24,6 +24,8 @@ PgfTypeHypo *PyList_AsHypos(PyObject *pylist, Py_ssize_t *n_hypos);
PyObject *PyList_FromHypos(PgfTypeHypo *hypos, const size_t n_hypos);
PgfPrintContext *PyList_AsPgfPrintContext(PyObject *pylist);
void FreePgfText(PgfText *txt);
void FreePgfPrintContext(PgfPrintContext *ctxt);
PgfUnmarshaller unmarshaller;

View File

@@ -125,7 +125,7 @@ PGF_categoryContext(PGFObject *self, PyObject *args)
PgfExn err;
size_t n_hypos;
PgfTypeHypo *hypos = pgf_category_context(self->db, self->revision, catname, &n_hypos, &unmarshaller, &err);
PyMem_RawFree(catname);
FreePgfText(catname);
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
}
@@ -205,14 +205,14 @@ PGF_functionsByCat(PGFObject *self, PyObject *args)
PyObject *functions = PyList_New(0);
if (functions == NULL) {
PyMem_RawFree(catname);
FreePgfText(catname);
return NULL;
}
PgfExn err;
PyPGFClosure clo = { { _collect_funs }, self, functions };
pgf_iter_functions_by_cat(self->db, self->revision, catname, &clo.fn, &err);
PyMem_RawFree(catname);
FreePgfText(catname);
if (handleError(err) != PGF_EXN_NONE) {
Py_DECREF(functions);
return NULL;
@@ -233,7 +233,7 @@ PGF_functionType(PGFObject *self, PyObject *args)
PgfExn err;
PgfType type = pgf_function_type(self->db, self->revision, funname, &unmarshaller, &err);
PyMem_RawFree(funname);
FreePgfText(funname);
if (type == 0) {
PyErr_Format(PyExc_KeyError, "function '%s' is not defined", s);
return NULL;
@@ -257,7 +257,7 @@ PGF_functionIsConstructor(PGFObject *self, PyObject *args)
PgfExn err;
int isCon = pgf_function_is_constructor(self->db, self->revision, funname, &err);
PyMem_RawFree(funname);
FreePgfText(funname);
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
}
@@ -277,7 +277,7 @@ PGF_functionProbability(PGFObject *self, PyObject *args)
PgfExn err;
prob_t prob = pgf_function_prob(self->db, self->revision, funname, &err);
PyMem_RawFree(funname);
FreePgfText(funname);
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
}
@@ -460,7 +460,7 @@ pgf_newNGF(PyObject *self, PyObject *args)
// Read the NGF grammar.
PgfExn err;
py_pgf->db = pgf_new_ngf(absname, fpath, &py_pgf->revision, &err);
PyMem_RawFree(absname);
FreePgfText(absname);
if (handleError(err) != PGF_EXN_NONE) {
Py_DECREF(py_pgf);
return NULL;
@@ -480,7 +480,7 @@ pgf_readExpr(PyObject *self, PyObject *args)
PgfText *input = CString_AsPgfText(s, size);
PgfExpr expr = pgf_read_expr(input, &unmarshaller);
PyMem_RawFree(input);
FreePgfText(input);
if (expr == 0) {
PyErr_SetString(PGFError, "expression cannot be parsed");
return NULL;
@@ -501,7 +501,7 @@ pgf_showExpr(PyObject *self, PyObject *args)
PgfText *s = pgf_print_expr((PgfExpr) expr, ctxt, 0, &marshaller);
FreePgfPrintContext(ctxt);
PyObject *str = PyUnicode_FromStringAndSize(s->text, s->size);
PyMem_RawFree(s);
FreePgfText(s);
return str;
}
@@ -516,7 +516,7 @@ pgf_readType(PyObject *self, PyObject *args)
PgfText *input = CString_AsPgfText(s, size);
PgfType type = pgf_read_type(input, &unmarshaller);
PyMem_RawFree(input);
FreePgfText(input);
if (type == 0) {
PyErr_SetString(PGFError, "type cannot be parsed");
return NULL;
@@ -537,7 +537,7 @@ pgf_showType(PyObject *self, PyObject *args)
PgfText *s = pgf_print_type((PgfType) type, ctxt, 0, &marshaller);
FreePgfPrintContext(ctxt);
PyObject *str = PyUnicode_FromStringAndSize(s->text, s->size);
PyMem_RawFree(s);
FreePgfText(s);
return str;
}
@@ -686,40 +686,40 @@ MOD_INIT(pgf)
Py_INCREF(PGFError);
PyModule_AddObject(m, "PGF", (PyObject *) &pgf_PGFType);
Py_INCREF(&pgf_PGFType);
// Py_INCREF(&pgf_PGFType);
PyModule_AddObject(m, "Transaction", (PyObject *) &pgf_TransactionType);
Py_INCREF(&pgf_TransactionType);
// Py_INCREF(&pgf_TransactionType);
PyModule_AddObject(m, "Expr", (PyObject *) &pgf_ExprType);
Py_INCREF(&pgf_ExprType);
// Py_INCREF(&pgf_ExprType);
PyModule_AddObject(m, "ExprAbs", (PyObject *) &pgf_ExprAbsType);
Py_INCREF(&pgf_ExprAbsType);
// Py_INCREF(&pgf_ExprAbsType);
PyModule_AddObject(m, "ExprApp", (PyObject *) &pgf_ExprAppType);
Py_INCREF(&pgf_ExprAppType);
// Py_INCREF(&pgf_ExprAppType);
PyModule_AddObject(m, "ExprLit", (PyObject *) &pgf_ExprLitType);
Py_INCREF(&pgf_ExprLitType);
// Py_INCREF(&pgf_ExprLitType);
PyModule_AddObject(m, "ExprMeta", (PyObject *) &pgf_ExprMetaType);
Py_INCREF(&pgf_ExprMetaType);
// Py_INCREF(&pgf_ExprMetaType);
PyModule_AddObject(m, "ExprFun", (PyObject *) &pgf_ExprFunType);
Py_INCREF(&pgf_ExprFunType);
// Py_INCREF(&pgf_ExprFunType);
PyModule_AddObject(m, "ExprVar", (PyObject *) &pgf_ExprVarType);
Py_INCREF(&pgf_ExprVarType);
// Py_INCREF(&pgf_ExprVarType);
PyModule_AddObject(m, "ExprTyped", (PyObject *) &pgf_ExprTypedType);
Py_INCREF(&pgf_ExprTypedType);
// Py_INCREF(&pgf_ExprTypedType);
PyModule_AddObject(m, "ExprImplArg", (PyObject *) &pgf_ExprImplArgType);
Py_INCREF(&pgf_ExprImplArgType);
// Py_INCREF(&pgf_ExprImplArgType);
PyModule_AddObject(m, "Type", (PyObject *) &pgf_TypeType);
Py_INCREF(&pgf_TypeType);
// Py_INCREF(&pgf_TypeType);
PyModule_AddIntConstant(m, "BIND_TYPE_EXPLICIT", 0);

View File

@@ -19,7 +19,7 @@ PGF_checkoutBranch(PGFObject *self, PyObject *args)
PgfExn err;
PgfRevision rev = pgf_checkout_revision(self->db, name, &err);
PyMem_RawFree(name);
FreePgfText(name);
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
}
@@ -50,7 +50,7 @@ PGF_newTransaction(PGFObject *self, PyObject *args)
PgfExn err;
PgfRevision rev = pgf_clone_revision(self->db, self->revision, name, &err);
if (name != NULL) {
PyMem_RawFree(name);
FreePgfText(name);
}
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
@@ -63,6 +63,8 @@ PGF_newTransaction(PGFObject *self, PyObject *args)
return trans;
}
// ----------------------------------------------------------------------------
static PyObject *
Transaction_commit(TransactionObject *self, PyObject *args)
{
@@ -94,7 +96,7 @@ Transaction_createFunction(TransactionObject *self, PyObject *args)
PgfExn err;
pgf_create_function(self->pgf->db, self->revision, funname, (PgfType) type, arity, prob, &marshaller, &err);
PyMem_RawFree(funname);
FreePgfText(funname);
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
}
@@ -114,7 +116,7 @@ Transaction_dropFunction(TransactionObject *self, PyObject *args)
PgfExn err;
pgf_drop_function(self->pgf->db, self->revision, funname, &err);
PyMem_RawFree(funname);
FreePgfText(funname);
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
}
@@ -143,13 +145,13 @@ Transaction_createCategory(TransactionObject *self, PyObject *args)
Py_ssize_t n_hypos;
PgfTypeHypo *context = PyList_AsHypos(hypos, &n_hypos);
if (PyErr_Occurred()) {
PyMem_RawFree(catname);
FreePgfText(catname);
return NULL;
}
PgfExn err;
pgf_create_category(self->pgf->db, self->revision, catname, n_hypos, context, prob, &marshaller, &err);
PyMem_RawFree(catname);
FreePgfText(catname);
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
}
@@ -169,7 +171,7 @@ Transaction_dropCategory(TransactionObject *self, PyObject *args)
PgfExn err;
pgf_drop_category(self->pgf->db, self->revision, catname, &err);
PyMem_RawFree(catname);
FreePgfText(catname);
if (handleError(err) != PGF_EXN_NONE) {
return NULL;
}