summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-12-18 22:54:36 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-12-18 22:54:36 (GMT)
commitb8a99266e691ec5a2a13f10d6c775f4bdc0dbbc2 (patch)
treef18a43a0af5f0f2221c171c4d92a3c057102a600 /plugins
parent706710aef28a0af4bb8aa343c2631a2139d00955 (diff)
Made Python constant values storable using Pickle.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/pychrysalide/constval.c73
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;