1
0
forked from GitHub/gf-core

Add variable expressions

This commit is contained in:
John J. Camilleri
2021-09-13 22:29:23 +02:00
parent cf7673525f
commit e78e9102be
5 changed files with 141 additions and 11 deletions

View File

@@ -38,7 +38,7 @@ PgfExpr elit(PgfUnmarshaller *this, PgfLiteral lit)
PgfExpr emeta(PgfUnmarshaller *this, PgfMetaId meta)
{
ExprMetaObject *pyexpr = (ExprMetaObject *)pgf_ExprMetaType.tp_alloc(&pgf_ExprMetaType, 0);
pyexpr->index = PyLong_FromLong(meta);
pyexpr->id = PyLong_FromLong(meta);
return (PgfExpr) pyexpr;
}
@@ -50,8 +50,9 @@ PgfExpr efun(PgfUnmarshaller *this, PgfText *name)
PgfExpr evar(PgfUnmarshaller *this, int index)
{
PyErr_SetString(PyExc_NotImplementedError, "evar not implemented");
return 0;
ExprVarObject *pyexpr = (ExprVarObject *)pgf_ExprVarType.tp_alloc(&pgf_ExprVarType, 0);
pyexpr->index = PyLong_FromLong(index);
return (PgfExpr) pyexpr;
}
PgfExpr etyped(PgfUnmarshaller *this, PgfExpr expr, PgfType typ)
@@ -221,14 +222,21 @@ object match_lit(PgfMarshaller *this, PgfUnmarshaller *u, PgfLiteral lit)
}
}
object match_expr(PgfMarshaller *this, PgfUnmarshaller *u, PgfExpr ex)
object match_expr(PgfMarshaller *this, PgfUnmarshaller *u, PgfExpr expr)
{
ExprObject *expr = (ExprObject *)ex;
PyObject *pyobj = (PyObject *)expr;
if (expr->ob_base.ob_type == &pgf_ExprLitType) { // use PyObject_IsInstance ?
ExprLitObject *elit= (ExprLitObject *)expr;
if (PyObject_TypeCheck(pyobj, &pgf_ExprLitType)) {
ExprLitObject *elit = (ExprLitObject *)expr;
return this->vtbl->match_lit(this, u, (PgfLiteral) elit->value);
} else if (PyObject_TypeCheck(pyobj, &pgf_ExprMetaType)) {
ExprMetaObject *emeta = (ExprMetaObject *)expr;
return u->vtbl->emeta(u, (PgfMetaId) PyLong_AsLong(emeta->id));
} else if (PyObject_TypeCheck(pyobj, &pgf_ExprVarType)) {
ExprVarObject *evar = (ExprVarObject *)expr;
return u->vtbl->evar(u, PyLong_AsLong(evar->index));
} else {
PyErr_SetString(PyExc_TypeError, "unable to match on expression");
return 0;
}
}