summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-objectspace/src/mruby_objectspace.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-20 15:44:56 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-04-20 15:44:56 +0900
commit62dae09bf6e2ac965ec7384100f56f40737cbd6f (patch)
treee2405226c0ba6aed5d11781ec97e4524548e5f96 /mrbgems/mruby-objectspace/src/mruby_objectspace.c
parentedd9fc6e75e26e154ab6af5c504f3bd38ecbfdd3 (diff)
downloadmruby-62dae09bf6e2ac965ec7384100f56f40737cbd6f.tar.gz
mruby-62dae09bf6e2ac965ec7384100f56f40737cbd6f.zip
Allow `mrb_objspace_each_objects()` to break iteration; ref #3359
Diffstat (limited to 'mrbgems/mruby-objectspace/src/mruby_objectspace.c')
-rw-r--r--mrbgems/mruby-objectspace/src/mruby_objectspace.c14
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;
}
/*