diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-04-09 20:32:04 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-04-09 20:32:04 +0000 |
commit | 3ef4db15e95740839a0ed6d0224b2c9562bb2544 (patch) | |
tree | 18c23ed1b2e3c7b55860c27238a98cafafe63d9f /id_table.c | |
parent | c09e35d7bbb5c18124d7ab54740bef966e145529 (diff) |
Adding `GC.compact` and compacting GC support.
This commit adds the new method `GC.compact` and compacting GC support.
Please see this issue for caveats:
https://bugs.ruby-lang.org/issues/15626
[Feature #15626]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67479 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'id_table.c')
-rw-r--r-- | id_table.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/id_table.c b/id_table.c index 74c9e756a0..47edefc844 100644 --- a/id_table.c +++ b/id_table.c @@ -267,6 +267,27 @@ 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)(Qundef, &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; |