From aa5ffb686f2d63c99ac346298d4d452f0c451519 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 5 Jul 2023 23:12:23 +0900 Subject: [PATCH] mruby-os-memsize: more precise memory size for method tables --- include/mruby/internal.h | 1 + mrbgems/mruby-os-memsize/src/memsize.c | 2 +- src/class.c | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/mruby/internal.h b/include/mruby/internal.h index 1069019d4..62e5fcf61 100644 --- a/include/mruby/internal.h +++ b/include/mruby/internal.h @@ -27,6 +27,7 @@ mrb_noreturn void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value sel mrb_method_t mrb_vm_find_method(mrb_state *mrb, struct RClass *c, struct RClass **cp, mrb_sym mid); mrb_value mrb_mod_const_missing(mrb_state *mrb, mrb_value mod); mrb_value mrb_const_missing(mrb_state *mrb, mrb_value mod, mrb_sym sym); +size_t mrb_class_mt_memsize(mrb_state*, struct RClass*); #endif mrb_value mrb_obj_equal_m(mrb_state *mrb, mrb_value); diff --git a/mrbgems/mruby-os-memsize/src/memsize.c b/mrbgems/mruby-os-memsize/src/memsize.c index 476aadf2c..0dc9dbd1a 100644 --- a/mrbgems/mruby-os-memsize/src/memsize.c +++ b/mrbgems/mruby-os-memsize/src/memsize.c @@ -72,7 +72,7 @@ os_memsize_of_object(mrb_state* mrb, mrb_value obj) case MRB_TT_MODULE: case MRB_TT_SCLASS: case MRB_TT_ICLASS: - size += mrb_gc_mark_mt_size(mrb, mrb_class_ptr(obj)) * sizeof(mrb_method_t); + size += mrb_class_mt_memsize(mrb, mrb_class_ptr(obj)); /* fall through */ case MRB_TT_EXCEPTION: case MRB_TT_OBJECT: { diff --git a/src/class.c b/src/class.c index f178b0ce1..6d0385e3a 100644 --- a/src/class.c +++ b/src/class.c @@ -310,6 +310,15 @@ mrb_gc_mark_mt_size(mrb_state *mrb, struct RClass *c) return (size_t)h->size; } +size_t +mrb_class_mt_memsize(mrb_state *mrb, struct RClass *c) +{ + struct mt_tbl *h = c->mt; + + if (!h) return 0; + return sizeof(struct mt_tbl) + (size_t)h->size * sizeof(mrb_method_t); +} + void mrb_gc_free_mt(mrb_state *mrb, struct RClass *c) {