summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-objectspace
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-07-17 12:31:00 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-07-17 12:31:00 +0900
commit495c1a377a63f0f56916c478f616eeb667bb3811 (patch)
treecd700ccd9c784265736fdc76f030e50bdb45cec4 /mrbgems/mruby-objectspace
parent9f52bcfca9c23cba27f0ff50dacb1704057e1042 (diff)
downloadmruby-495c1a377a63f0f56916c478f616eeb667bb3811.tar.gz
mruby-495c1a377a63f0f56916c478f616eeb667bb3811.zip
Fix `memsize_of` to count method table size; #5032
Also avoid `mrb_funcall` to minimize VM recursion.
Diffstat (limited to 'mrbgems/mruby-objectspace')
-rw-r--r--mrbgems/mruby-objectspace/src/mruby_objectspace.c29
1 files changed, 6 insertions, 23 deletions
diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
index 9ad7ee619..d46c5c2d1 100644
--- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c
+++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
@@ -205,24 +205,7 @@ os_memsize_of_method(mrb_state* mrb, mrb_value method_obj)
struct RProc *proc = mrb_proc_ptr(proc_value);
size = sizeof(struct RProc);
- if(!MRB_PROC_CFUNC_P(proc)) size += os_memsize_of_irep(mrb, proc->body.irep);
- return size;
-}
-
-static mrb_int
-os_memsize_of_methods(mrb_state* mrb, mrb_value obj)
-{
- mrb_value method_list;
- mrb_int size = 0;
- mrb_int i;
-
- if(!mrb_respond_to(mrb, obj, mrb_intern_lit(mrb, "instance_methods"))) return 0;
- method_list = mrb_funcall(mrb, obj, "instance_methods", 1, mrb_false_value());
- for(i = 0; i < RARRAY_LEN(method_list); i++) {
- mrb_value method = mrb_funcall(mrb, obj, "instance_method", 1,
- mrb_ary_ref(mrb, method_list, i));
- size += os_memsize_of_method(mrb, method);
- }
+ if (!MRB_PROC_CFUNC_P(proc)) size += os_memsize_of_irep(mrb, proc->body.irep);
return size;
}
@@ -240,18 +223,18 @@ os_memsize_of_object(mrb_state* mrb, mrb_value obj)
break;
case MRB_TT_CLASS:
case MRB_TT_MODULE:
- case MRB_TT_EXCEPTION:
case MRB_TT_SCLASS:
case MRB_TT_ICLASS:
+ size += mrb_gc_mark_mt_size(mrb, mrb_class_ptr(obj)) * sizeof(mrb_method_t);
+ /* fall through */
+ case MRB_TT_EXCEPTION:
case MRB_TT_OBJECT: {
size += mrb_objspace_page_slot_size();
size += os_memsize_of_ivars(mrb, obj);
- if(mrb_obj_is_kind_of(mrb, obj, mrb_class_get(mrb, "UnboundMethod"))) {
+ if (mrb_obj_is_kind_of(mrb, obj, mrb_class_get(mrb, "UnboundMethod")) ||
+ mrb_obj_is_kind_of(mrb, obj, mrb_class_get(mrb, "Method"))){
size += os_memsize_of_method(mrb, obj);
}
- else {
- size += os_memsize_of_methods(mrb, obj);
- }
break;
}
case MRB_TT_HASH: {