From 39f8a5c2a48a209507dbc3fd407052999954a199 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 18 Oct 2020 23:24:25 +0200
Subject: Updated the code for the types built from expressions.

---
 plugins/itanium/component.c                |  5 ++++-
 plugins/pychrysalide/analysis/types/expr.c | 27 +++++++++++++++++++++------
 src/analysis/types/expr.c                  |  6 +++---
 src/analysis/types/expr.h                  |  2 +-
 4 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/plugins/itanium/component.c b/plugins/itanium/component.c
index 3baad57..25ea175 100644
--- a/plugins/itanium/component.c
+++ b/plugins/itanium/component.c
@@ -1407,6 +1407,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp, Routin
     GDataType *arg;                         /* Argument de prototype       */
     GDataType *members;                     /* Type de membres de tableau  */
     GDataType *param;                       /* Paramètre de gabarit        */
+    char *value;                            /* Valeur quelconque exprimée  */
 
     /* Pour GCC !? */
     result = NULL;
@@ -1855,7 +1856,9 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp, Routin
             break;
 
         case ICT_OPERATED_EXPRESSION:
-            result = g_expr_type_new(itd_translate_component(comp, NULL));
+            value = itd_translate_component(comp, NULL);
+            result = g_expr_type_new(value);
+            free(value);
             break;
 
         case ICT_STD_SUBST:
diff --git a/plugins/pychrysalide/analysis/types/expr.c b/plugins/pychrysalide/analysis/types/expr.c
index 0d68a60..02cb02f 100644
--- a/plugins/pychrysalide/analysis/types/expr.c
+++ b/plugins/pychrysalide/analysis/types/expr.c
@@ -67,10 +67,20 @@ static PyObject *py_expr_type_new(PyTypeObject *type, PyObject *args, PyObject *
     int ret;                                /* Bilan de lecture des args.  */
     GDataType *dtype;                       /* Version GLib du type        */
 
+#define EXPR_TYPE_DOC                                                       \
+    "The ExprType class handles raw expressions defined for some types.\n"  \
+    "\n"                                                                    \
+    "Instances can be created using the following constructor:\n"           \
+    "\n"                                                                    \
+    "    ExprType(value)"                                                   \
+    "\n"                                                                    \
+    "The *value* expression can be any string value, which is not further"  \
+    " processed."
+
     ret = PyArg_ParseTuple(args, "s", &value);
     if (!ret) return NULL;
 
-    dtype = g_expr_type_new(strdup(value));
+    dtype = g_expr_type_new(value);
     result = pygobject_new(G_OBJECT(dtype));
     g_object_unref(dtype);
 
@@ -98,6 +108,14 @@ static PyObject *py_expr_type_get_value(PyObject *self, void *closure)
     GExprType *type;                        /* Version GLib du type        */
     const char *value;                      /* Valeur exprimée             */
 
+#define EXPR_TYPE_VALUE_ATTRIB PYTHON_GET_DEF_FULL  \
+(                                                   \
+    value, py_expr_type,                            \
+    "Value of the expression type.\n"               \
+    "\n"                                            \
+    "This value can be any string."                 \
+)
+
     type = G_EXPR_TYPE(pygobject_get(self));
 
     value = g_expr_type_get_value(type);
@@ -128,10 +146,7 @@ PyTypeObject *get_python_expr_type_type(void)
     };
 
     static PyGetSetDef py_expr_type_getseters[] = {
-        {
-            "value", py_expr_type_get_value, NULL,
-            "Provide the value of the expression type.", NULL
-        },
+        EXPR_TYPE_VALUE_ATTRIB,
         { NULL }
     };
 
@@ -144,7 +159,7 @@ PyTypeObject *get_python_expr_type_type(void)
 
         .tp_flags       = Py_TPFLAGS_DEFAULT,
 
-        .tp_doc         = "PyChrysalide expr type",
+        .tp_doc         = EXPR_TYPE_DOC,
 
         .tp_methods     = py_expr_type_methods,
         .tp_getset      = py_expr_type_getseters,
diff --git a/src/analysis/types/expr.c b/src/analysis/types/expr.c
index 376b0b4..02005f4 100644
--- a/src/analysis/types/expr.c
+++ b/src/analysis/types/expr.c
@@ -175,13 +175,13 @@ static void g_expr_type_finalize(GExprType *type)
 *                                                                             *
 ******************************************************************************/
 
-GDataType *g_expr_type_new(char *value)
+GDataType *g_expr_type_new(const char *value)
 {
     GExprType *result;                   /* Structure à retourner       */
 
     result = g_object_new(G_TYPE_EXPR_TYPE, NULL);
 
-    result->value = value;
+    result->value = strdup(value);
 
     return G_DATA_TYPE(result);
 
@@ -204,7 +204,7 @@ static GDataType *g_expr_type_dup(const GExprType *type)
 {
     GDataType *result;                      /* Copie à retourner           */
 
-    result = g_expr_type_new(strdup(type->value));
+    result = g_expr_type_new(type->value);
 
     return result;
 
diff --git a/src/analysis/types/expr.h b/src/analysis/types/expr.h
index 3f7c953..45f66e3 100644
--- a/src/analysis/types/expr.h
+++ b/src/analysis/types/expr.h
@@ -51,7 +51,7 @@ typedef struct _GExprTypeClass GExprTypeClass;
 GType g_expr_type_get_type(void);
 
 /* Crée une représentation de type sous forme d'expressions. */
-GDataType *g_expr_type_new(char *);
+GDataType *g_expr_type_new(const char *);
 
 /* Fournit la valeur d'un type fourni sous forme de caractères. */
 const char *g_expr_type_get_value(const GExprType *);
-- 
cgit v0.11.2-87-g4458