From b8b8e7b6ae10d6a0ab9f3778705f1b075e760859 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 11 May 2016 00:12:09 +0200 Subject: evaluate: transfer right shifts to set reference side This provides a generic way to transfer shifts from the left hand side to the right hand range side of a relational expression when performing transformations from the evaluation step. Signed-off-by: Pablo Neira Ayuso --- src/evaluate.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/evaluate.c') diff --git a/src/evaluate.c b/src/evaluate.c index 60bbce1b..72a0e435 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1172,6 +1172,46 @@ static int binop_transfer(struct eval_ctx *ctx, struct expr **expr) list_add_tail(&i->list, &next->list); } break; + case EXPR_SET_REF: + list_for_each_entry(i, &(*expr)->right->set->init->expressions, list) { + switch (i->key->ops->type) { + case EXPR_VALUE: + err = binop_can_transfer(ctx, left, i->key); + if (err <= 0) + return err; + break; + case EXPR_RANGE: + err = binop_can_transfer(ctx, left, i->key->left); + if (err <= 0) + return err; + err = binop_can_transfer(ctx, left, i->key->right); + if (err <= 0) + return err; + break; + default: + break; + } + } + list_for_each_entry_safe(i, next, &(*expr)->right->set->init->expressions, + list) { + list_del(&i->list); + switch (i->key->ops->type) { + case EXPR_VALUE: + if (binop_transfer_one(ctx, left, &i->key) < 0) + return -1; + break; + case EXPR_RANGE: + if (binop_transfer_one(ctx, left, &i->key->left) < 0) + return -1; + if (binop_transfer_one(ctx, left, &i->key->right) < 0) + return -1; + break; + default: + break; + } + list_add_tail(&i->list, &next->list); + } + break; default: return 0; } -- cgit v1.2.3