diff options
| author | dearblue <[email protected]> | 2020-07-21 23:45:53 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2020-07-24 11:42:26 +0900 |
| commit | c9ba761b9e23e720da9200be1c4df103a04e51b2 (patch) | |
| tree | 74459d5dc4caef20721a197c21e2841b3d12e0b0 | |
| parent | 2b588b8566a50ed33f4f9878aa10fdbe05a3feeb (diff) | |
| download | mruby-c9ba761b9e23e720da9200be1c4df103a04e51b2.tar.gz mruby-c9ba761b9e23e720da9200be1c4df103a04e51b2.zip | |
Support without `mruby-method` for `mruby-os-memsize`; ref #5032
| -rw-r--r-- | mrbgems/mruby-os-memsize/src/memsize.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/mrbgems/mruby-os-memsize/src/memsize.c b/mrbgems/mruby-os-memsize/src/memsize.c index 70887a3ae..14f90109d 100644 --- a/mrbgems/mruby-os-memsize/src/memsize.c +++ b/mrbgems/mruby-os-memsize/src/memsize.c @@ -44,6 +44,19 @@ os_memsize_of_method(mrb_state* mrb, mrb_value method_obj) return size; } +static mrb_bool +obj_is_kind_of_checked(mrb_state *mrb, mrb_value obj, const char *classname) +{ + mrb_value objclass = mrb_obj_value(mrb->object_class); + + if (mrb_const_defined(mrb, objclass, mrb_intern_cstr(mrb, classname))) { + struct RClass *klass = mrb_class_get(mrb, classname); + return mrb_obj_is_kind_of(mrb, obj, klass); + } + + return FALSE; +} + static mrb_int os_memsize_of_object(mrb_state* mrb, mrb_value obj) { @@ -67,8 +80,8 @@ os_memsize_of_object(mrb_state* mrb, mrb_value obj) 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")) || - mrb_obj_is_kind_of(mrb, obj, mrb_class_get(mrb, "Method"))){ + if (obj_is_kind_of_checked(mrb, obj, "UnboundMethod") || + obj_is_kind_of_checked(mrb, obj, "Method")) { size += os_memsize_of_method(mrb, obj); } break; |
