From a6a0346e1c4e8a4329a8fe8fbc779dd39ebea333 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 24 Jun 2025 13:56:07 +0900 Subject: [PATCH] mruby-os-memsize: support Set class --- include/mruby/internal.h | 1 + mrbgems/mruby-os-memsize/src/memsize.c | 5 +++++ mrbgems/mruby-set/src/set.c | 12 ++++++++++++ 3 files changed, 18 insertions(+) diff --git a/include/mruby/internal.h b/include/mruby/internal.h index d0873b3cd..e4be2d1ac 100644 --- a/include/mruby/internal.h +++ b/include/mruby/internal.h @@ -136,6 +136,7 @@ int mrb_rational_mark(mrb_state *mrb, struct RBasic *rat); #ifdef MRB_USE_SET size_t mrb_gc_mark_set(mrb_state *mrb, struct RBasic *set); void mrb_gc_free_set(mrb_state *mrb, struct RBasic *set); +size_t mrb_set_memsize(mrb_value); #endif #ifdef MRUBY_PROC_H diff --git a/mrbgems/mruby-os-memsize/src/memsize.c b/mrbgems/mruby-os-memsize/src/memsize.c index 61ae10370..5420dbde4 100644 --- a/mrbgems/mruby-os-memsize/src/memsize.c +++ b/mrbgems/mruby-os-memsize/src/memsize.c @@ -156,6 +156,11 @@ os_memsize_of_object(mrb_state* mrb, mrb_value obj) size += mrb_objspace_page_slot_size(); #endif break; +#if defined(MRB_USE_SET) + case MRB_TT_SET: + size += mrb_set_memsize(obj); + break; +#endif case MRB_TT_BIGINT: #if defined(MRB_USE_BIGINT) size += mrb_bint_memsize(obj); diff --git a/mrbgems/mruby-set/src/set.c b/mrbgems/mruby-set/src/set.c index 5e08eacc3..52c49cb1e 100644 --- a/mrbgems/mruby-set/src/set.c +++ b/mrbgems/mruby-set/src/set.c @@ -80,6 +80,18 @@ mrb_gc_free_set(mrb_state *mrb, struct RBasic *obj) } } +size_t +mrb_set_memsize(mrb_value set) +{ + + size_t size = mrb_objspace_page_slot_size(); + struct RSet *s = mrb_set_ptr(set); + if (s->kh) { + size += kh_size(s->kh) * sizeof(mrb_value); + } + return size; +} + /* Helper function to check if a value is a Set and return a boolean result */ static mrb_bool set_is_set(mrb_state *mrb, mrb_value obj)