diff options
| author | Rory OConnell <[email protected]> | 2020-07-17 20:09:44 -0700 |
|---|---|---|
| committer | Rory OConnell <[email protected]> | 2020-07-17 20:09:44 -0700 |
| commit | fe1ec9afdd1dbfd579efe5c9823f554e26d75a2d (patch) | |
| tree | 2369d35a8fb9776c8f37f04f8fb149e6a2b4e3c5 /mrbgems/mruby-objectspace/src | |
| parent | 1952004d5a4a3c0758036baca6158aa51e93d4d3 (diff) | |
| download | mruby-fe1ec9afdd1dbfd579efe5c9823f554e26d75a2d.tar.gz mruby-fe1ec9afdd1dbfd579efe5c9823f554e26d75a2d.zip | |
Add ObjectSpace.memsize_of_all
Diffstat (limited to 'mrbgems/mruby-objectspace/src')
| -rw-r--r-- | mrbgems/mruby-objectspace/src/mruby_objectspace.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c index 9ac75c710..6da2a4104 100644 --- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c +++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c @@ -344,6 +344,30 @@ 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(obj->c == data->type) data->t += os_memsize_of_object(mrb, mrb_obj_value(obj)); + return 0; +} + +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 +375,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 |
