summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/datatype.h3
-rw-r--r--src/datatype.c3
-rw-r--r--src/evaluate.c2
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)