mie: re-implement vectors of blocks and registers using vector move callbacks

vector move callbacks allow mie_name instances to be stored in movable memory,
as the internal bst pointers can now be fixed during vector resize operations.
This commit is contained in:
2026-01-18 22:58:17 +00:00
parent 759aaf9fd8
commit 55161cd6c8
17 changed files with 122 additions and 45 deletions

View File

@@ -5,14 +5,5 @@
struct mie_block *mie_region_add_block(struct mie_region *region)
{
struct mie_block *block = malloc(sizeof *block);
if (!block) {
return NULL;
}
memset(block, 0x0, sizeof *block);
mie_vector_push_back(region->r_blocks, &block, NULL);
return block;
return mie_vector_emplace_back(region->r_blocks, &mie_block_vector_ops);
}

37
mie/ir/register.c Normal file
View File

@@ -0,0 +1,37 @@
#include <assert.h>
#include <mie/ir/register.h>
static enum mie_status cleanup(void *p)
{
mie_register_cleanup(p);
return MIE_SUCCESS;
}
static enum mie_status move(void *dst, void *src, size_t itemsz)
{
assert(itemsz == sizeof(struct mie_register));
struct mie_register *dest_reg = dst, *src_reg = src;
mie_register_move(dest_reg, src_reg);
return MIE_SUCCESS;
}
struct mie_vector_ops mie_register_vector_ops = {
.v_destroy = cleanup,
.v_move = move,
};
void mie_register_move(struct mie_register *dest, struct mie_register *src)
{
memmove(dest, src, sizeof *dest);
if (src->reg_flags & MIE_REGISTER_F_VIRTUAL) {
mie_name_move(&dest->reg_name, &src->reg_name);
}
}
void mie_register_cleanup(struct mie_register *reg)
{
if (reg->reg_flags & MIE_REGISTER_F_VIRTUAL) {
mie_name_destroy(&reg->reg_name);
}
}

View File

@@ -163,7 +163,7 @@ static enum mie_status schedule_children_of_region(
b_queue_entry *tmp = &item->i_entry;
for (size_t i = 0; i < MIE_VECTOR_COUNT(region->r_blocks); i++) {
struct mie_block *block = region->r_blocks.items[i];
struct mie_block *block = &region->r_blocks.items[i];
struct walk_schedule_item *child
= block_schedule_item_create(block);