From b7cddf206bf21686ca50ba202024b47ca6ad0334 Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Mon, 6 Sep 2021 15:32:18 +0200 Subject: [PATCH] First attempts at marshalling in Python bindings, not really sure what I'm doing --- src/runtime/python/compat.h | 2 +- src/runtime/python/expr.c | 24 ++++------------ src/runtime/python/marshaller.c | 51 +++++++++++++++++++++++++++++++-- src/runtime/python/marshaller.h | 2 ++ 4 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/runtime/python/compat.h b/src/runtime/python/compat.h index a6080e55e..2824575d7 100644 --- a/src/runtime/python/compat.h +++ b/src/runtime/python/compat.h @@ -18,7 +18,7 @@ // #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyStringObject PyUnicodeObject - // #define PyString_Check PyUnicode_Check + #define PyString_Check PyUnicode_Check #define PyString_FromStringAndSize PyUnicode_FromStringAndSize // #define PyString_FromFormat PyUnicode_FromFormat // #define PyString_Concat(ps,s) {PyObject* tmp = *(ps); *(ps) = PyUnicode_Concat(tmp,s); Py_DECREF(tmp);} diff --git a/src/runtime/python/expr.c b/src/runtime/python/expr.c index 09726de98..23bc4977f 100644 --- a/src/runtime/python/expr.c +++ b/src/runtime/python/expr.c @@ -2,7 +2,9 @@ #include #include +#include "./compat.h" #include "./expr.h" +#include "./marshaller.h" // static ExprObject* // Expr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) @@ -810,24 +812,10 @@ // } static PyObject * -Type_repr(TypeObject *self) +Type_str(TypeObject *self) { - // GuPool* tmp_pool = gu_local_pool(); - // - // GuExn* err = gu_exn(tmp_pool); - // GuStringBuf* sbuf = gu_new_string_buf(tmp_pool); - // GuOut* out = gu_string_buf_out(sbuf); - // - // pgf_print_type(self->type, NULL, 0, out, err); - // - // PyObject* pystr = PyString_FromStringAndSize(gu_string_buf_data(sbuf), - // gu_string_buf_length(sbuf)); - // - // gu_pool_free(tmp_pool); - // return pystr; - - PyErr_SetString(PyExc_TypeError, "Type_repr: not implemented"); - Py_RETURN_NOTIMPLEMENTED; + PgfText *s = pgf_print_type((PgfType) &self, NULL, 0, &marshaller); + return PyString_FromStringAndSize(s->text, s->size); } static PyObject * @@ -1061,7 +1049,7 @@ PyTypeObject pgf_TypeType = { 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ - (reprfunc) Type_repr, /*tp_str*/ + (reprfunc) Type_str, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ diff --git a/src/runtime/python/marshaller.c b/src/runtime/python/marshaller.c index 22f87045d..c45917f7b 100644 --- a/src/runtime/python/marshaller.c +++ b/src/runtime/python/marshaller.c @@ -67,7 +67,7 @@ PgfLiteral lflt(PgfUnmarshaller *this, double v) PgfLiteral lstr(PgfUnmarshaller *this, PgfText *v) { - PyObject *s = PyUnicode_FromStringAndSize(v->text, v->size); + PyObject *s = PyString_FromStringAndSize(v->text, v->size); return (PgfLiteral) s; } @@ -97,7 +97,7 @@ void free_ref(PgfUnmarshaller *this, object x) Py_XDECREF(x); } -static PgfUnmarshallerVtbl unmarshallervtbl = +static PgfUnmarshallerVtbl unmarshallerVtbl = { eabs, eapp, @@ -115,4 +115,49 @@ static PgfUnmarshallerVtbl unmarshallervtbl = }; /* static */ -PgfUnmarshaller unmarshaller = { &unmarshallervtbl }; +PgfUnmarshaller unmarshaller = { &unmarshallerVtbl }; + +// ---------------------------------------------------------------------------- + +object match_lit(PgfUnmarshaller *u, PgfLiteral lit) +{ + if (PyString_Check(lit)) { + // PgfText t = { + // PyUnicode_GetLength((PyObject*) lit), + // lit, + // }; + // return lstr(u, &lit); + return 0; + } + else if (PyLong_Check(lit)) { + + return lint(u, 1, (uintmax_t *)lit); + } + else if (PyFloat_Check(lit)) { + return lflt(u, *(double *)lit); + } + else { + PyErr_SetString(PyExc_TypeError, "Unable to match on literal"); + return 0; + } +} + +object match_expr(PgfUnmarshaller *u, PgfExpr expr) +{ + return 0; +} + +object match_type(PgfUnmarshaller *u, PgfType ty) +{ + return 0; +} + +static PgfMarshallerVtbl marshallerVtbl = +{ + match_lit, + match_expr, + match_type +}; + +/* static */ +PgfMarshaller marshaller = { &marshallerVtbl }; diff --git a/src/runtime/python/marshaller.h b/src/runtime/python/marshaller.h index ba100967e..71793ec2c 100644 --- a/src/runtime/python/marshaller.h +++ b/src/runtime/python/marshaller.h @@ -8,4 +8,6 @@ extern PgfUnmarshaller unmarshaller; +extern PgfMarshaller marshaller; + #endif // PYPGF_MARSHALLER_H_