summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-os-memsize
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-os-memsize')
-rw-r--r--mrbgems/mruby-os-memsize/src/memsize.c18
-rw-r--r--mrbgems/mruby-os-memsize/test/memsize.rb16
2 files changed, 17 insertions, 17 deletions
diff --git a/mrbgems/mruby-os-memsize/src/memsize.c b/mrbgems/mruby-os-memsize/src/memsize.c
index d82c6b7ed..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)
{
@@ -54,6 +67,7 @@ os_memsize_of_object(mrb_state* mrb, mrb_value obj)
size += mrb_objspace_page_slot_size();
if (!RSTR_EMBED_P(RSTRING(obj)) && !RSTR_SHARED_P(RSTRING(obj))) {
size += RSTRING_CAPA(obj);
+ size++; /* NUL terminator */
}
break;
case MRB_TT_CLASS:
@@ -66,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;
diff --git a/mrbgems/mruby-os-memsize/test/memsize.rb b/mrbgems/mruby-os-memsize/test/memsize.rb
index c6b1b7b2d..6be8f1b06 100644
--- a/mrbgems/mruby-os-memsize/test/memsize.rb
+++ b/mrbgems/mruby-os-memsize/test/memsize.rb
@@ -12,7 +12,7 @@ assert 'ObjectSpace.memsize_of' do
assert_not_equal ObjectSpace.memsize_of('a'), 0, 'memsize of str'
if __ENCODING__ == "UTF-8"
- assert_not_equal ObjectSpace.memsize_of("縺薙s縺ォ縺。縺ッ荳也阜"), 0, 'memsize of utf8 str'
+ assert_not_equal ObjectSpace.memsize_of("こんにちは世界"), 0, 'memsize of utf8 str'
end
# class defs
@@ -22,20 +22,6 @@ assert 'ObjectSpace.memsize_of' do
empty_class_def_size = ObjectSpace.memsize_of Class.new
assert_not_equal empty_class_def_size, 0, 'Class def not zero'
- class_without_methods = Class.new do
- @a = 1
- @b = 2
- end
- class_total_size = empty_class_def_size + (int_size * 2)
- assert_equal ObjectSpace.memsize_of(class_without_methods), class_total_size, 'class without methods size'
-
- module_without_methods = Module.new do
- @a = 1
- @b = 2
- end
- module_total_size = empty_class_def_size + (int_size * 2)
- assert_equal ObjectSpace.memsize_of(module_without_methods), module_total_size, 'module without methods size'
-
proc_size = ObjectSpace.memsize_of Proc.new { x = 1; x }
assert_not_equal proc_size, 0