diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2023-07-07 06:32:43 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2023-07-07 06:32:43 (GMT) |
commit | 4c10dfa2a95cea6fc704d68066d0c284cfd79342 (patch) | |
tree | 5827bbc411459800747e21929daecdf99fde7dfd /src/analysis/scan/expr.c | |
parent | 3f996be1e5858b54740bf92515795982a16b169a (diff) |
Rewrite core parts of the ROST API.
Diffstat (limited to 'src/analysis/scan/expr.c')
-rw-r--r-- | src/analysis/scan/expr.c | 54 |
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; |