summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authordearblue <[email protected]>2020-07-21 23:45:53 +0900
committerdearblue <[email protected]>2020-07-24 11:42:26 +0900
commitc9ba761b9e23e720da9200be1c4df103a04e51b2 (patch)
tree74459d5dc4caef20721a197c21e2841b3d12e0b0
parent2b588b8566a50ed33f4f9878aa10fdbe05a3feeb (diff)
downloadmruby-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.c17
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;