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:
@@ -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
37
mie/ir/register.c
Normal 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_name);
|
||||
}
|
||||
}
|
||||
@@ -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 = ®ion->r_blocks.items[i];
|
||||
struct walk_schedule_item *child
|
||||
= block_schedule_item_create(block);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user