mruby-os-memsize: more precise memory size for method tables

This commit is contained in:
Yukihiro "Matz" Matsumoto
2023-07-05 23:12:23 +09:00
parent 0a4473bf64
commit aa5ffb686f
3 changed files with 11 additions and 1 deletions
+1
View File
@@ -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);
+1 -1
View File
@@ -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: {
+9
View File
@@ -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)
{