Merge branch 'majestic' of github.com:GrammaticalFramework/gf-core into majestic

This commit is contained in:
krangelov
2021-09-24 15:01:01 +02:00
4 changed files with 43 additions and 32 deletions

View File

@@ -28,8 +28,6 @@ PgfExnType handleError(PgfExn err)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// conversions // conversions
//
// You have to remember to call PyMem_Free on these things!
PgfText * PgfText *
CString_AsPgfText(const char *s, size_t size) { CString_AsPgfText(const char *s, size_t size) {
@@ -154,6 +152,15 @@ PyList_AsPgfPrintContext(PyObject *pylist)
return ctxt; return ctxt;
} }
// ----------------------------------------------------------------------------
// freers
void
FreePgfText(PgfText *txt)
{
PyMem_RawFree(txt);
}
void void
FreePgfPrintContext(PgfPrintContext *ctxt) 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); PyObject *PyList_FromHypos(PgfTypeHypo *hypos, const size_t n_hypos);
PgfPrintContext *PyList_AsPgfPrintContext(PyObject *pylist); PgfPrintContext *PyList_AsPgfPrintContext(PyObject *pylist);
void FreePgfText(PgfText *txt);
void FreePgfPrintContext(PgfPrintContext *ctxt); void FreePgfPrintContext(PgfPrintContext *ctxt);
PgfUnmarshaller unmarshaller; PgfUnmarshaller unmarshaller;

View File

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

View File

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