summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-03-20 23:53:57 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-03-20 23:53:57 +0900
commitcfadbf2fc4a6547f6e0bd47b8103c5b4bbd17b20 (patch)
tree3868307290f2a2e5cc8a90b4701f642ef0427c89
parent0b6554e65b902a977012150ba3ae2b170a3c061e (diff)
Add write-barrier in tally
-rw-r--r--enum.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/enum.c b/enum.c
index e0fcab049c..dab2469f78 100644
--- a/enum.c
+++ b/enum.c
@@ -1012,6 +1012,7 @@ static int
tally_up(st_data_t *group, st_data_t *value, st_data_t arg, int existing)
{
VALUE tally = (VALUE)*value;
+ VALUE hash = (VALUE)arg;
if (!existing) {
tally = INT2FIX(1);
}
@@ -1020,15 +1021,17 @@ tally_up(st_data_t *group, st_data_t *value, st_data_t arg, int existing)
}
else {
tally = rb_big_plus(tally, INT2FIX(1));
+ RB_OBJ_WRITTEN(hash, Qundef, tally);
}
*value = (st_data_t)tally;
+ if (!SPECIAL_CONST_P(*group)) RB_OBJ_WRITTEN(hash, Qundef, *group);
return ST_CONTINUE;
}
static VALUE
rb_enum_tally_up(VALUE hash, VALUE group)
{
- rb_hash_stlike_update(hash, group, tally_up, 0);
+ rb_hash_stlike_update(hash, group, tally_up, (st_data_t)hash);
return hash;
}