diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-20 15:44:56 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-20 15:44:56 +0900 |
| commit | 62dae09bf6e2ac965ec7384100f56f40737cbd6f (patch) | |
| tree | e2405226c0ba6aed5d11781ec97e4524548e5f96 /mrbgems/mruby-objectspace | |
| parent | edd9fc6e75e26e154ab6af5c504f3bd38ecbfdd3 (diff) | |
| download | mruby-62dae09bf6e2ac965ec7384100f56f40737cbd6f.tar.gz mruby-62dae09bf6e2ac965ec7384100f56f40737cbd6f.zip | |
Allow `mrb_objspace_each_objects()` to break iteration; ref #3359
Diffstat (limited to 'mrbgems/mruby-objectspace')
| -rw-r--r-- | mrbgems/mruby-objectspace/src/mruby_objectspace.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c index d0a8effd0..3887091d3 100644 --- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c +++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c @@ -9,7 +9,7 @@ struct os_count_struct { mrb_int counts[MRB_TT_MAXDEFINE+1]; }; -static void +static int os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data) { struct os_count_struct *obj_count; @@ -23,6 +23,7 @@ os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data) else { obj_count->counts[obj->tt]++; } + return MRB_EACH_OBJ_OK; } /* @@ -109,35 +110,36 @@ struct os_each_object_data { mrb_int count; }; -static void +static int os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud) { struct os_each_object_data *d = (struct os_each_object_data*)ud; /* filter dead objects */ if (mrb_object_dead_p(mrb, obj)) { - return; + return MRB_EACH_OBJ_OK; } /* filter internal objects */ switch (obj->tt) { case MRB_TT_ENV: case MRB_TT_ICLASS: - return; + return MRB_EACH_OBJ_OK; default: break; } /* filter half baked (or internal) objects */ - if (!obj->c) return; + if (!obj->c) return MRB_EACH_OBJ_OK; /* filter class kind if target module defined */ if (d->target_module && !mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), d->target_module)) { - return; + return MRB_EACH_OBJ_OK; } mrb_yield(mrb, d->block, mrb_obj_value(obj)); ++d->count; + return MRB_EACH_OBJ_OK; } /* |
