return new_init;
}
+static struct expr *expr_value(struct expr *expr)
+{
+ switch (expr->etype) {
+ case EXPR_MAPPING:
+ return expr->left->key;
+ case EXPR_SET_ELEM:
+ return expr->key;
+ case EXPR_VALUE:
+ return expr;
+ default:
+ BUG("invalid expression type %s\n", expr_name(expr));
+ }
+}
+
static struct expr *get_set_interval_find(const struct set *cache_set,
struct expr *left,
struct expr *right)
{
const struct set *set = cache_set;
struct expr *range = NULL;
- struct expr *i;
+ struct expr *i, *key;
mpz_t val;
mpz_init2(val, set->key->len);
list_for_each_entry(i, &set->init->expressions, list) {
- switch (i->key->etype) {
+ key = expr_value(i);
+ switch (key->etype) {
case EXPR_VALUE:
if (expr_basetype(i->key)->type != TYPE_STRING)
break;
case EXPR_PREFIX:
case EXPR_RANGE:
range_expr_value_low(val, i);
- if (left && mpz_cmp(left->key->value, val))
+ if (left && mpz_cmp(expr_value(left)->value, val))
break;
range_expr_value_high(val, i);
- if (right && mpz_cmp(right->key->value, val))
+ if (right && mpz_cmp(expr_value(right)->value, val))
break;
- range = expr_clone(i->key);
+ range = expr_clone(i);
goto out;
default:
break;
return range;
}
-static struct expr *expr_value(struct expr *expr)
-{
- switch (expr->etype) {
- case EXPR_MAPPING:
- return expr->left->key;
- case EXPR_SET_ELEM:
- return expr->key;
- case EXPR_VALUE:
- return expr;
- default:
- BUG("invalid expression type %s\n", expr_name(expr));
- }
-}
-
static struct expr *__expr_to_set_elem(struct expr *low, struct expr *expr)
{
struct expr *elem = set_elem_expr_alloc(&low->location, expr);