diff --git a/mie/ctx.c b/mie/ctx.c index fb80aa9..faccd59 100644 --- a/mie/ctx.c +++ b/mie/ctx.c @@ -43,6 +43,14 @@ struct mie_ctx *mie_ctx_create(void) out->ctx_true = MIE_CONST(mie_ctx_get_int(out, 1, 1)); out->ctx_false = MIE_CONST(mie_ctx_get_int(out, 0, 1)); + out->ctx_null = malloc(sizeof *out->ctx_null); + if (!out->ctx_null) { + mie_ctx_destroy(out); + return NULL; + } + + mie_value_init(out->ctx_null, MIE_VALUE_NONE); + out->ctx_sel_cache = b_hashmap_create(free, free); out->ctx_string_cache = b_hashmap_create(free, free); @@ -81,6 +89,10 @@ void mie_ctx_destroy(struct mie_ctx *ctx) } } + if (ctx->ctx_null) { + mie_value_destroy(ctx->ctx_null); + } + b_hashmap_release(ctx->ctx_sel_cache); free(ctx); @@ -107,6 +119,11 @@ struct mie_type *mie_ctx_get_type(struct mie_ctx *ctx, enum mie_type_id type_id) return type; } +struct mie_value *mie_ctx_get_null(struct mie_ctx *ctx) +{ + return ctx->ctx_null; +} + struct mie_type *mie_ctx_get_int_type(struct mie_ctx *ctx, unsigned int nr_bits) { struct ctx_int_cache_entry *entry diff --git a/mie/include/mie/ctx.h b/mie/include/mie/ctx.h index 5732f17..00c61aa 100644 --- a/mie/include/mie/ctx.h +++ b/mie/include/mie/ctx.h @@ -6,6 +6,7 @@ struct mie_ctx { struct mie_const *ctx_true, *ctx_false; + struct mie_value *ctx_null; struct mie_type *ctx_types[__MIE_TYPE_COUNT]; b_btree ctx_int_cache; struct b_hashmap *ctx_sel_cache; @@ -19,6 +20,7 @@ extern struct mie_type *mie_ctx_get_type( struct mie_ctx *ctx, enum mie_type_id type_id); extern struct mie_type *mie_ctx_get_int_type( struct mie_ctx *ctx, unsigned int nr_bits); +extern struct mie_value *mie_ctx_get_null(struct mie_ctx *ctx); extern struct mie_value *mie_ctx_get_bool(struct mie_ctx *ctx, bool val); extern struct mie_value *mie_ctx_get_int( struct mie_ctx *ctx, long long val, unsigned int nr_bits); diff --git a/mie/ir/convert/text-write.c b/mie/ir/convert/text-write.c index a1e8316..e48783d 100644 --- a/mie/ir/convert/text-write.c +++ b/mie/ir/convert/text-write.c @@ -259,11 +259,14 @@ static b_status write_operand( struct mie_ir_converter *converter, struct mie_value *value, int flags) { if (!value) { - write_string(converter, ""); + write_string(converter, ""); return B_SUCCESS; } switch (value->v_type->t_id) { + case MIE_VALUE_NONE: + write_string(converter, "null"); + return B_SUCCESS; case MIE_VALUE_CONST: return write_operand_const(converter, value, flags); case MIE_VALUE_INSTR: diff --git a/mie/ir/value.c b/mie/ir/value.c index 2419dd4..c35d376 100644 --- a/mie/ir/value.c +++ b/mie/ir/value.c @@ -2,6 +2,10 @@ #include #include +const struct mie_value_type null_value_type = { + .t_id = MIE_VALUE_NONE, +}; + extern const struct mie_value_type module_value_type; extern const struct mie_value_type record_value_type; extern const struct mie_value_type func_value_type; @@ -12,7 +16,7 @@ extern const struct mie_value_type const_value_type; extern const struct mie_value_type data_value_type; static const struct mie_value_type *value_types[] = { - [MIE_VALUE_NONE] = NULL, + [MIE_VALUE_NONE] = &null_value_type, [MIE_VALUE_MODULE] = &module_value_type, [MIE_VALUE_RECORD] = &record_value_type, [MIE_VALUE_FUNC] = &func_value_type,