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.
38 lines
829 B
C
38 lines
829 B
C
#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);
|
|
}
|
|
}
|