compile.c: make pinned_list embedable

This saves some malloc churn for small pin lists.
This commit is contained in:
Jean Boussier 2023-11-20 16:35:58 +01:00 committed by Jean Boussier
parent 5b0256e3c4
commit 05028f4d55

View File

@ -11131,7 +11131,7 @@ struct ibf_load {
struct pinned_list {
long size;
VALUE * buffer;
VALUE buffer[1];
};
static void
@ -11146,25 +11146,16 @@ pinned_list_mark(void *ptr)
}
}
static void
pinned_list_free(void *ptr)
{
struct pinned_list *list = (struct pinned_list *)ptr;
xfree(list->buffer);
xfree(ptr);
}
static size_t
pinned_list_memsize(const void *ptr)
{
struct pinned_list *list = (struct pinned_list *)ptr;
return sizeof(struct pinned_list) + (list->size * sizeof(VALUE *));
return 0;
}
static const rb_data_type_t pinned_list_type = {
"pinned_list",
{pinned_list_mark, pinned_list_free, pinned_list_memsize,},
0, 0, RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY
{pinned_list_mark, RUBY_DEFAULT_FREE, pinned_list_memsize,},
0, 0, RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_EMBEDDABLE
};
static VALUE
@ -11198,13 +11189,10 @@ pinned_list_store(VALUE list, long offset, VALUE object)
static VALUE
pinned_list_new(long size)
{
struct pinned_list * ptr;
VALUE obj_list =
TypedData_Make_Struct(0, struct pinned_list, &pinned_list_type, ptr);
ptr->buffer = xcalloc(size, sizeof(VALUE));
size_t memsize = offsetof(struct pinned_list, buffer) + size * sizeof(VALUE);
VALUE obj_list = rb_data_typed_object_zalloc(0, memsize, &pinned_list_type);
struct pinned_list * ptr = RTYPEDDATA_GET_DATA(obj_list);
ptr->size = size;
return obj_list;
}