diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-04-20 01:19:47 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-04-20 01:19:47 +0000 |
commit | 91793b8967e0531bd1159a8ff0cc7e50739c7620 (patch) | |
tree | 87ba81af05456fe8bdeb29227a968a413e480635 /id_table.c | |
parent | e3d547f6df76a48834cfd9893baf4f51567b3afb (diff) | |
download | ruby-91793b8967e0531bd1159a8ff0cc7e50739c7620.tar.gz |
Add `GC.compact` again.
🙏
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'id_table.c')
-rw-r--r-- | id_table.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/id_table.c b/id_table.c index 74c9e756a0..f566582479 100644 --- a/id_table.c +++ b/id_table.c @@ -267,6 +267,28 @@ rb_id_table_delete(struct rb_id_table *tbl, ID id) } void +rb_id_table_foreach_with_replace(struct rb_id_table *tbl, rb_id_table_foreach_func_t *func, rb_id_table_update_callback_func_t *replace, void *data) +{ + int i, capa = tbl->capa; + + for (i=0; i<capa; i++) { + if (ITEM_KEY_ISSET(tbl, i)) { + const id_key_t key = ITEM_GET_KEY(tbl, i); + enum rb_id_table_iterator_result ret = (*func)(Qundef, tbl->items[i].val, data); + assert(key != 0); + + if (ret == ID_TABLE_REPLACE) { + VALUE val = tbl->items[i].val; + ret = (*replace)(NULL, &val, data, TRUE); + tbl->items[i].val = val; + } + else if (ret == ID_TABLE_STOP) + return; + } + } +} + +void rb_id_table_foreach(struct rb_id_table *tbl, rb_id_table_foreach_func_t *func, void *data) { int i, capa = tbl->capa; |