mie: implement caching and emitting string data

This commit is contained in:
2025-04-17 22:55:17 +01:00
parent abb7cfaf0e
commit 9cce4bf541
11 changed files with 211 additions and 58 deletions

View File

@@ -66,43 +66,39 @@ void mie_builder_put_record(
b_queue_push_back(&builder->b_module->m_records, &rec->r_base.v_entry);
}
#if 0
void mie_builder_put_data(struct mie_builder *builder, struct mie_data *data)
{
if (!builder->b_module) {
return;
}
b_queue_iterator it = {};
b_queue_foreach (&it, &builder->b_module->m_data) {
struct mie_value *cur
= b_unbox(struct mie_value, it.entry, v_entry);
if (!strcmp(cur->v_name.n_str, data->d_base.v_name.n_str)) {
return;
}
const char *data_name = data->d_base.v_name.n_str;
struct mie_data *v = mie_module_get_data(builder->b_module, data_name);
if (v) {
return;
}
b_queue_push_back(&builder->b_module->m_data, &data->d_base.v_entry);
mie_module_put_data(builder->b_module, data);
}
#endif
#if 0
void mie_builder_put_type(struct mie_builder *builder, struct mie_type *type)
{
if (!builder->b_module) {
return;
}
b_queue_iterator it = {};
b_queue_foreach (&it, &builder->b_module->m_types) {
struct mie_value *cur
= b_unbox(struct mie_value, it.entry, v_entry);
if (!strcmp(cur->v_name.n_str, type->t_base.v_name.n_str)) {
return;
}
const char *type_name = type->t_base.v_name.n_str;
struct mie_data *v = mie_module_get_data(builder->b_module, type_name);
if (v) {
return;
}
b_queue_push_back(&builder->b_module->m_data, &type->t_base.v_entry);
mie_module_put_data(builder->b_module, MIE_VALUE);
}
#endif
void mie_builder_set_insert_point(
struct mie_builder *builder, struct mie_block *block)
@@ -127,7 +123,32 @@ struct mie_value *mie_builder_get_data_ptr(
return NULL;
}
mie_module_put_data(builder->b_module, data);
mie_module_put_data(builder->b_module, data, data_ident);
}
return MIE_VALUE(data);
}
struct mie_value *mie_builder_get_string_ptr(
struct mie_builder *builder, const char *s)
{
if (!builder->b_module) {
return NULL;
}
struct mie_data *data = mie_module_get_string_ptr(builder->b_module, s);
if (!data) {
struct mie_type *str
= mie_ctx_get_type(builder->b_ctx, MIE_TYPE_STR);
struct mie_value *value = mie_ctx_get_string(builder->b_ctx, s);
data = mie_data_create_const((struct mie_const *)value);
if (!data) {
return NULL;
}
mie_module_put_data(builder->b_module, data, ".str");
}
return MIE_VALUE(data);