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)