summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-07-19 06:43:13 +0900
committerGitHub <[email protected]>2020-07-19 06:43:13 +0900
commit667ace2bfe190ab1329e77dafde44eff2a121676 (patch)
tree6381eab2a855c900109cb5a4a28243506f9cc4f2
parent1952004d5a4a3c0758036baca6158aa51e93d4d3 (diff)
parentffe8bf6323a6fd9a0b68b3e84745ccc820b2bc49 (diff)
downloadmruby-667ace2bfe190ab1329e77dafde44eff2a121676.tar.gz
mruby-667ace2bfe190ab1329e77dafde44eff2a121676.zip
Merge pull request #5040 from RoryO/add-memsize-of-all
Add ObjectSpace.memsize_of_all
-rw-r--r--mrbgems/mruby-objectspace/src/mruby_objectspace.c33
-rw-r--r--mrbgems/mruby-objectspace/test/objectspace.rb15
2 files changed, 47 insertions, 1 deletions
diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
index 9ac75c710..b3e8605d7 100644
--- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c
+++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
@@ -344,6 +344,38 @@ os_memsize_of(mrb_state *mrb, mrb_value self)
return mrb_fixnum_value(total);
}
+struct os_memsize_of_all_cb_data {
+ mrb_int t;
+ struct RClass *type;
+};
+
+static int
+os_memsize_of_all_cb(mrb_state *mrb, struct RBasic *obj, void *d)
+{
+ struct os_memsize_of_all_cb_data *data = (struct os_memsize_of_all_cb_data *)d;
+ if(mrb_class_real(obj->c) == data->type) data->t += os_memsize_of_object(mrb, mrb_obj_value(obj));
+ return 0;
+}
+
+/*
+ * call-seq:
+ * ObjectSpace.memsize_of_all([klass]) -> Numeric
+ *
+ * Return consuming memory size of all living objects of type klass.
+ *
+ */
+
+static mrb_value
+os_memsize_of_all(mrb_state *mrb, mrb_value self)
+{
+ mrb_value type;
+ struct os_memsize_of_all_cb_data data = { 0 };
+ mrb_get_args(mrb, "C", &type);
+ data.type = mrb_class_ptr(type);
+ mrb_objspace_each_objects(mrb, os_memsize_of_all_cb, &data);
+ return mrb_fixnum_value(data.t);
+}
+
void
mrb_mruby_objectspace_gem_init(mrb_state *mrb)
{
@@ -351,6 +383,7 @@ mrb_mruby_objectspace_gem_init(mrb_state *mrb)
mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_OPT(1));
mrb_define_class_method(mrb, os, "each_object", os_each_object, MRB_ARGS_OPT(1));
mrb_define_class_method(mrb, os, "memsize_of", os_memsize_of, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
+ mrb_define_class_method(mrb, os, "memsize_of_all", os_memsize_of_all, MRB_ARGS_REQ(1));
}
void
diff --git a/mrbgems/mruby-objectspace/test/objectspace.rb b/mrbgems/mruby-objectspace/test/objectspace.rb
index d029a2f43..e5783b942 100644
--- a/mrbgems/mruby-objectspace/test/objectspace.rb
+++ b/mrbgems/mruby-objectspace/test/objectspace.rb
@@ -1,4 +1,3 @@
-# coding: cp932
assert('ObjectSpace.count_objects') do
h = {}
f = Fiber.new {} if Object.const_defined?(:Fiber)
@@ -134,3 +133,17 @@ assert 'ObjectSpace.memsize_of' do
#hash
assert_not_equal ObjectSpace.memsize_of({}), 0, 'empty hash size not zero'
end
+
+assert 'ObjectSpace.memsize_of_all' do
+ foo_class = Class.new do
+ def initialize
+ @a = 'a'
+ @b = 'b'
+ end
+ end
+
+ foos = Array.new(10) { foo_class.new }
+ foo_size = ObjectSpace.memsize_of(foos.first)
+
+ assert_equal ObjectSpace.memsize_of_all(foo_class), foo_size * foos.size, 'Memsize of all instance'
+end