diff options
-rw-r--r-- | include/datatype.h | 3 | ||||
-rw-r--r-- | src/datatype.c | 3 | ||||
-rw-r--r-- | src/evaluate.c | 2 |
3 files changed, 6 insertions, 2 deletions
diff --git a/include/datatype.h b/include/datatype.h index 50b85c31..ca6ba9fe 100644 --- a/include/datatype.h +++ b/include/datatype.h @@ -82,6 +82,9 @@ enum datatypes { }; #define TYPE_MAX (__TYPE_MAX - 1) +#define TYPE_BITS 6 +#define TYPE_MASK ((1 << TYPE_BITS) - 1) + /** * enum byteorder * diff --git a/src/datatype.c b/src/datatype.c index 8583531f..91e5ed6d 100644 --- a/src/datatype.c +++ b/src/datatype.c @@ -51,6 +51,7 @@ static const struct datatype *datatypes[TYPE_MAX + 1] = { void datatype_register(const struct datatype *dtype) { + BUILD_BUG_ON(TYPE_MAX & ~TYPE_MASK); datatypes[dtype->type] = dtype; } @@ -939,7 +940,7 @@ const struct datatype *concat_type_alloc(const struct expr *expr) strncat(desc, i->dtype->desc, sizeof(desc) - strlen(desc) - 1); strncat(name, i->dtype->name, sizeof(name) - strlen(name) - 1); - type <<= 8; + type <<= TYPE_BITS; type |= i->dtype->type; size += i->dtype->size; subtypes++; diff --git a/src/evaluate.c b/src/evaluate.c index 79edf021..9cb2376a 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -617,7 +617,7 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr) "unexpected concat component, " "expecting %s", dtype->desc); - tmp = datatype_lookup((type >> 8 * --off) & 0xff); + tmp = datatype_lookup((type >> TYPE_BITS * --off) & TYPE_MASK); expr_set_context(&ctx->ectx, tmp, tmp->size); if (list_member_evaluate(ctx, &i) < 0) |