compile.c: make pinned_list embedable
This saves some malloc churn for small pin lists.
This commit is contained in:
parent
5b0256e3c4
commit
05028f4d55
26
compile.c
26
compile.c
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user