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