diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-12-18 22:54:36 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-12-18 22:54:36 (GMT) |
commit | b8a99266e691ec5a2a13f10d6c775f4bdc0dbbc2 (patch) | |
tree | f18a43a0af5f0f2221c171c4d92a3c057102a600 /plugins/pychrysalide | |
parent | 706710aef28a0af4bb8aa343c2631a2139d00955 (diff) |
Made Python constant values storable using Pickle.
Diffstat (limited to 'plugins/pychrysalide')
-rw-r--r-- | plugins/pychrysalide/constval.c | 73 |
1 files changed, 64 insertions, 9 deletions
diff --git a/plugins/pychrysalide/constval.c b/plugins/pychrysalide/constval.c index b6d20aa..7067770 100644 --- a/plugins/pychrysalide/constval.c +++ b/plugins/pychrysalide/constval.c @@ -26,6 +26,7 @@ #include <longintrepr.h> +#include <string.h> #include <i18n.h> @@ -46,7 +47,7 @@ typedef struct _PyConstvalObject * de l'objet PyLongObject, dont la taille est dynamique. */ - /*const char *name;*/ /* Désignation de la valeur */ + /*char *name;*/ /* Désignation de la valeur */ } PyConstvalObject; @@ -56,11 +57,14 @@ typedef struct _PyConstvalObject static PyObject *py_constval_new(PyTypeObject *, PyObject *, PyObject *); /* Calcule l'emplacement reservé pour une désignation de valeur. */ -static const char **py_constval_compute_name_ptr(PyConstvalObject *); +static char **py_constval_compute_name_ptr(PyConstvalObject *); /* Construit une représentation textuelle de l'objet. */ static PyObject *py_constval_str(PyObject *); +/* Fournit une réduction de l'objet en vue d'une sérialisation. */ +static PyObject *py_constval_reduce(PyObject *, PyObject *); + /****************************************************************************** @@ -79,9 +83,17 @@ static PyObject *py_constval_str(PyObject *); static PyObject *py_constval_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - PyErr_Format(PyExc_RuntimeError, _("%s is meant to be only used from C code"), type->tp_name); + PyObject *result; /* Instance à retourner */ + unsigned long value; /* Valeur entière */ + const char *name; /* Désignation humaine */ + int ret; /* Bilan de lecture des args. */ + + ret = PyArg_ParseTuple(args, "ks", &value, &name); + if (!ret) return NULL; + + result = build_constval_from_c_code(name, value); - return NULL; + return result; } @@ -98,7 +110,7 @@ static PyObject *py_constval_new(PyTypeObject *type, PyObject *args, PyObject *k * * ******************************************************************************/ -static const char **py_constval_compute_name_ptr(PyConstvalObject *self) +static char **py_constval_compute_name_ptr(PyConstvalObject *self) { digit *result; /* Adresse mémoire à retourner */ Py_ssize_t size; /* Taille supplémentaire */ @@ -110,7 +122,7 @@ static const char **py_constval_compute_name_ptr(PyConstvalObject *self) result = &self->base.ob_digit[size]; - return (const char **)result; + return (char **)result; } @@ -131,7 +143,7 @@ static PyObject *py_constval_str(PyObject *self) { PyObject *result; /* Elément à retourner */ PyConstvalObject *constval; /* Autre version de l'objet */ - const char **ptr; /* Désignation à convertir */ + char **ptr; /* Désignation à convertir */ constval = (PyConstvalObject *)self; @@ -146,6 +158,44 @@ static PyObject *py_constval_str(PyObject *self) /****************************************************************************** * * +* Paramètres : self = architecture concernée par la procédure. * +* args = instruction représentant le point de départ. * +* * +* Description : Fournit une réduction de l'objet en vue d'une sérialisation. * +* * +* Retour : Données utiles à une reconstruction. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_constval_reduce(PyObject *self, PyObject *args) +{ + PyObject *result; /* Données à retourner */ + unsigned long value; /* Valeur entière */ + PyConstvalObject *constval; /* Autre version de l'objet */ + char **ptr; /* Désignation à convertir */ + PyObject *params; /* Paramètres de construction */ + + value = PyLong_AsUnsignedLong(self); + + constval = (PyConstvalObject *)self; + + ptr = py_constval_compute_name_ptr(constval); + + params = Py_BuildValue("(ks)", value, *ptr); + + result = Py_BuildValue("(OO)", Py_TYPE(self), params); + + Py_DECREF(params); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : - * * * * Description : Fournit un accès à une définition de type à diffuser. * @@ -159,6 +209,11 @@ static PyObject *py_constval_str(PyObject *self) PyTypeObject *get_python_py_constval_type(void) { static PyMethodDef py_constval_methods[] = { + { + "__reduce__", py_constval_reduce, + METH_NOARGS, + "__reduce__($self, /)\n--\n\nProvide information to rebuild the object." + }, { NULL } }; @@ -249,7 +304,7 @@ PyObject *build_constval_from_c_code(const char *name, unsigned long value) Py_ssize_t size; /* Taille supplémentaire */ PyTypeObject *type; /* Type Python 'PyConstval...' */ PyConstvalObject *constval; /* Autre version de l'objet */ - const char **ptr; /* Désignation à convertir */ + char **ptr; /* Désignation à convertir */ /* Création d'une base de travail */ @@ -293,7 +348,7 @@ PyObject *build_constval_from_c_code(const char *name, unsigned long value) ptr = py_constval_compute_name_ptr(constval); - *ptr = name; + *ptr = strdup(name); return result; |