summaryrefslogtreecommitdiff
path: root/weakmap.c
Commit message (Collapse)AuthorAgeFilesLines
* Implement ObjectSpace::WeakMap#delete and ObjectSpace::WeakKeyMap#deleteJean Boussier2023-04-151-0/+82
| | | | | | [Feature #19561] It's useful to be able to remove references from weak maps.
* Add specs for ObjectSpace::WeakKeyMapJean Boussier2023-04-151-1/+2
| | | | [Feature #18498]
* ObjectSpace::WeakMap: clean inverse reference when an entry is re-assignedJean Boussier2023-03-171-17/+74
| | | | | | | | | | | | [Bug #19531] ```ruby wmap[1] = "A" wmap[1] = "B" ``` In the example above, we need to remove the `"A" => 1` inverse reference so that when `"A"` is GCed the `1` key isn't deleted.
* Fix incorrect size of WeakMap bufferPeter Zhu2023-03-161-2/+2
| | | | | | In wmap_final_func, j is the number of elements + 1 (since j also includes the length at the 0th index), so we should resize the buffer to size j and the new length is j - 1.
* Fix crash during compactionPeter Zhu2023-03-141-1/+1
| | | | | | | | | | | | | | | | | [Bug #19529] The fix for [Bug #19529] in commit 548086b contained a bug that crashes on the following script: ``` wm = ObjectSpace::WeakMap.new obj = Object.new 100.times do wm[Object.new] = obj GC.start end GC.compact ```
* ObjectSpace::WeakMap: fix compaction supportJean Boussier2023-03-141-1/+36
| | | | | | | | [Bug #19529] `rb_gc_update_tbl_refs` can't be used on `w->obj2wmap` because it's not a `VALUE -> VALUE` table, but a `VALUE -> VALUE *` table, so we need some dedicated iterator.
* Mark weak maps as write barrier protectedJean Boussier2023-03-101-4/+6
| | | | | | | | For both we mark the lambda finalizer. ObjectSpace::WeakMap doesn't mark any other reference, so we can just add the flag. ObjectSpace::WeakKeyMap only ever add new refs in `wkmap_aset`, so we can just trigger the write barrier there.
* Move WeakMap and WeakKeyMap code to weakmap.cPeter Zhu2023-03-101-0/+800
These classes don't belong in gc.c as they're not actually part of the GC. This commit refactors the code by moving all the code into a weakmap.c file.