aboutsummaryrefslogtreecommitdiffstats
path: root/compile.c
diff options
context:
space:
mode:
authorJean Boussier <byroot@ruby-lang.org>2023-11-20 16:35:58 +0100
committerJean Boussier <jean.boussier@gmail.com>2023-11-20 17:27:32 +0100
commit05028f4d553776793467fa585b1080075f7c448e (patch)
treebd6d5e856cab915953dfcd6ba19a5a4f0ef1d58e /compile.c
parent5b0256e3c47c0ff783291c80573489937abf163c (diff)
downloadruby-05028f4d553776793467fa585b1080075f7c448e.tar.gz
compile.c: make pinned_list embedable
This saves some malloc churn for small pin lists.
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c26
1 files changed, 7 insertions, 19 deletions
diff --git a/compile.c b/compile.c
index 6c92b15acd..66eabedd1a 100644
--- a/compile.c
+++ b/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;
}