summaryrefslogtreecommitdiff
path: root/src/analysis/scan/expr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/expr.c')
-rw-r--r--src/analysis/scan/expr.c54
1 files changed, 48 insertions, 6 deletions
diff --git a/src/analysis/scan/expr.c b/src/analysis/scan/expr.c
index 0b81e01..52d2c42 100644
--- a/src/analysis/scan/expr.c
+++ b/src/analysis/scan/expr.c
@@ -24,6 +24,9 @@
#include "expr.h"
+#include <assert.h>
+
+
#include "expr-int.h"
@@ -46,6 +49,10 @@ static void g_scan_expression_dispose(GScanExpression *);
/* Procède à la libération totale de la mémoire. */
static void g_scan_expression_finalize(GScanExpression *);
+/* Reproduit une expression en place dans une nouvelle instance. */
+static void g_scan_expression_copy(GScanExpression *, const GScanExpression *);
+
+
/* ----------------------- INTERFACE OFFRANT DES COMPARAISONS ----------------------- */
@@ -86,6 +93,8 @@ static void g_scan_expression_class_init(GScanExpressionClass *klass)
object->dispose = (GObjectFinalizeFunc/* ! */)g_scan_expression_dispose;
object->finalize = (GObjectFinalizeFunc)g_scan_expression_finalize;
+ klass->copy = g_scan_expression_copy;
+
}
@@ -241,6 +250,26 @@ bool g_scan_expression_check_validity(const GScanExpression *expr)
/******************************************************************************
* *
+* Paramètres : dest = emplacement d'enregistrement à constituer. [OUT] *
+* src = expression source à copier. *
+* *
+* Description : Reproduit une expression en place dans une nouvelle instance.*
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_scan_expression_copy(GScanExpression *dest, const GScanExpression *src)
+{
+ dest->value_type = src->value_type;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : expr = expression à copier. *
* *
* Description : Reproduit une expression en place dans une nouvelle instance.*
@@ -254,11 +283,16 @@ bool g_scan_expression_check_validity(const GScanExpression *expr)
GScanExpression *g_scan_expression_duplicate(const GScanExpression *expr)
{
GScanExpression *result; /* Instance copiée à retourner */
+ GType type; /* Type d'objet à copier */
GScanExpressionClass *class; /* Classe à activer */
+ type = G_TYPE_FROM_INSTANCE(expr);
+
+ result = g_object_new(type, NULL);
+
class = G_SCAN_EXPRESSION_GET_CLASS(expr);
- result = class->dup(expr);
+ class->copy(result, expr);
return result;
@@ -269,24 +303,32 @@ GScanExpression *g_scan_expression_duplicate(const GScanExpression *expr)
* *
* Paramètres : expr = expression à consulter. *
* ctx = contexte de suivi de l'analyse courante. *
-* final = indique une ultime conversion dans le cycle en cours.*
+* scope = portée courante des variables locales. *
+* out = zone d'enregistrement de la réduction opérée. [OUT] *
* *
* Description : Réduit une expression à une forme plus simple. *
* *
-* Retour : Réduction correspondante, expression déjà réduite, ou NULL. *
+* Retour : Bilan de l'opération : false en cas d'erreur irrécupérable. *
* *
* Remarques : - *
* *
******************************************************************************/
-GScanExpression *g_scan_expression_reduce(GScanExpression *expr, GScanContext *ctx, bool final)
+bool g_scan_expression_reduce(GScanExpression *expr, GScanContext *ctx, GScanScope *scope, GScanExpression **out)
{
- GScanExpression *result; /* Instance à renvoyer */
+ bool result; /* Bilan à retourner */
GScanExpressionClass *class; /* Classe à activer */
+ *out = NULL;
+
class = G_SCAN_EXPRESSION_GET_CLASS(expr);
- result = class->reduce(expr, ctx, final);
+ result = class->reduce(expr, ctx, scope, out);
+
+#ifndef NDEBUG
+ if (*out != NULL)
+ assert(result);
+#endif
return result;