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 {
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user