aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-08-06 23:00:29 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-08-06 23:00:29 +0900
commita04e3585d3cd1d76c4ec61a39bd4f2bdcd6517a1 (patch)
treea1e3e8b42b08be7a7e630c768d389910b5a9765f /gc.c
parent3e6b9926b70d7df9424cf2a6472ba0cd33e61f48 (diff)
downloadruby-a04e3585d3cd1d76c4ec61a39bd4f2bdcd6517a1.tar.gz
Extracted wmap_live_p
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/gc.c b/gc.c
index eacc609f6f..dbf19e0805 100644
--- a/gc.c
+++ b/gc.c
@@ -10207,6 +10207,14 @@ wmap_allocate(VALUE klass)
}
static int
+wmap_live_p(rb_objspace_t *objspace, VALUE obj)
+{
+ if (!is_id_value(objspace, obj)) return FALSE;
+ if (!is_live_object(objspace, obj)) return FALSE;
+ return TRUE;
+}
+
+static int
wmap_final_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing)
{
VALUE wmap, *ptr, size, i, j;
@@ -10312,7 +10320,7 @@ wmap_each_i(st_data_t key, st_data_t val, st_data_t arg)
{
rb_objspace_t *objspace = (rb_objspace_t *)arg;
VALUE obj = (VALUE)val;
- if (is_id_value(objspace, obj) && is_live_object(objspace, obj)) {
+ if (wmap_live_p(objspace, obj)) {
rb_yield_values(2, (VALUE)key, obj);
}
return ST_CONTINUE;
@@ -10335,7 +10343,7 @@ wmap_each_key_i(st_data_t key, st_data_t val, st_data_t arg)
{
rb_objspace_t *objspace = (rb_objspace_t *)arg;
VALUE obj = (VALUE)val;
- if (is_id_value(objspace, obj) && is_live_object(objspace, obj)) {
+ if (wmap_live_p(objspace, obj)) {
rb_yield((VALUE)key);
}
return ST_CONTINUE;
@@ -10358,7 +10366,7 @@ wmap_each_value_i(st_data_t key, st_data_t val, st_data_t arg)
{
rb_objspace_t *objspace = (rb_objspace_t *)arg;
VALUE obj = (VALUE)val;
- if (is_id_value(objspace, obj) && is_live_object(objspace, obj)) {
+ if (wmap_live_p(objspace, obj)) {
rb_yield(obj);
}
return ST_CONTINUE;
@@ -10383,7 +10391,7 @@ wmap_keys_i(st_data_t key, st_data_t val, st_data_t arg)
rb_objspace_t *objspace = argp->objspace;
VALUE ary = argp->value;
VALUE obj = (VALUE)val;
- if (is_id_value(objspace, obj) && is_live_object(objspace, obj)) {
+ if (wmap_live_p(objspace, obj)) {
rb_ary_push(ary, (VALUE)key);
}
return ST_CONTINUE;
@@ -10410,7 +10418,7 @@ wmap_values_i(st_data_t key, st_data_t val, st_data_t arg)
rb_objspace_t *objspace = argp->objspace;
VALUE ary = argp->value;
VALUE obj = (VALUE)val;
- if (is_id_value(objspace, obj) && is_live_object(objspace, obj)) {
+ if (wmap_live_p(objspace, obj)) {
rb_ary_push(ary, obj);
}
return ST_CONTINUE;
@@ -10479,8 +10487,7 @@ wmap_aref(VALUE self, VALUE wmap)
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
if (!st_lookup(w->wmap2obj, (st_data_t)wmap, &data)) return Qnil;
obj = (VALUE)data;
- if (!is_id_value(objspace, obj)) return Qnil;
- if (!is_live_object(objspace, obj)) return Qnil;
+ if (!wmap_live_p(objspace, obj)) return Qnil;
return obj;
}