forked from GitHub/gf-core
restore Expr_unpack
This commit is contained in:
@@ -239,6 +239,53 @@ Expr_call(ExprObject* self, PyObject* args, PyObject* kw)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject*
|
||||||
|
Expr_unpack(ExprObject *self, PyObject *fargs)
|
||||||
|
{
|
||||||
|
ExprObject *expr = self;
|
||||||
|
PyObject *args = PyList_New(0);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (PyObject_TypeCheck(expr, &pgf_ExprAbsType)) {
|
||||||
|
ExprAbsObject *eabs = (ExprAbsObject *) expr;
|
||||||
|
PyObject* res =
|
||||||
|
Py_BuildValue("OOOO", eabs->bind_type, eabs->name, eabs->body, args);
|
||||||
|
Py_DECREF(args);
|
||||||
|
return res;
|
||||||
|
} else if (PyObject_TypeCheck(expr, &pgf_ExprAppType)) {
|
||||||
|
if (PyList_Insert(args, 0, (PyObject*) ((ExprAppObject *) expr)->arg) == -1) {
|
||||||
|
Py_DECREF(args);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
expr = ((ExprAppObject *) expr)->fun;
|
||||||
|
} else if (PyObject_TypeCheck(expr, &pgf_ExprLitType)) {
|
||||||
|
PyObject* res = ((ExprLitObject *) expr)->lit;
|
||||||
|
Py_INCREF(res);
|
||||||
|
Py_DECREF(args);
|
||||||
|
return res;
|
||||||
|
} else if (PyObject_TypeCheck(expr, &pgf_ExprMetaType)) {
|
||||||
|
PyObject* res = Py_BuildValue("OO", Py_None, args);
|
||||||
|
Py_DECREF(args);
|
||||||
|
return res;
|
||||||
|
} else if (PyObject_TypeCheck(expr, &pgf_ExprFunType)) {
|
||||||
|
PyObject* res = Py_BuildValue("OO", ((ExprFunObject *) expr)->name, args);
|
||||||
|
Py_DECREF(args);
|
||||||
|
return res;
|
||||||
|
} else if (PyObject_TypeCheck(expr, &pgf_ExprVarType)) {
|
||||||
|
PyObject* res = Py_BuildValue("OO", ((ExprVarObject *) expr)->var, args);
|
||||||
|
Py_DECREF(args);
|
||||||
|
return res;
|
||||||
|
} else if (PyObject_TypeCheck(expr, &pgf_ExprTypedType)) {
|
||||||
|
expr = ((ExprTypedObject *) expr)->expr;
|
||||||
|
} else if (PyObject_TypeCheck(expr, &pgf_ExprImplArgType)) {
|
||||||
|
expr = ((ExprImplArgObject *) expr)->expr;
|
||||||
|
} else {
|
||||||
|
PyErr_SetString(PyExc_TypeError, "Unsupported kind of abstract expression");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
Expr_visit(ExprObject* self, PyObject *args)
|
Expr_visit(ExprObject* self, PyObject *args)
|
||||||
{
|
{
|
||||||
@@ -345,6 +392,9 @@ Expr_reduce_ex(ExprObject* self, PyObject *args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static PyMethodDef Expr_methods[] = {
|
static PyMethodDef Expr_methods[] = {
|
||||||
|
{"unpack", (PyCFunction)Expr_unpack, METH_VARARGS,
|
||||||
|
"Decomposes an expression into its components"
|
||||||
|
},
|
||||||
{"visit", (PyCFunction)Expr_visit, METH_VARARGS,
|
{"visit", (PyCFunction)Expr_visit, METH_VARARGS,
|
||||||
"Implementation of the visitor pattern for abstract syntax trees. "
|
"Implementation of the visitor pattern for abstract syntax trees. "
|
||||||
"If e is an expression equal to f a1 .. an then "
|
"If e is an expression equal to f a1 .. an then "
|
||||||
|
|||||||
Reference in New Issue
Block a user