Age | Commit message (Collapse) | Author |
|
Benchmark:
```
puts(Benchmark.measure do
10_000_000.times do
ObjectSpace::WeakKeyMap.new
end
end)
```
Before:
```
2.554772 0.014167 2.568939 ( 2.575763)
```
After:
```
1.994920 0.013583 2.008503 ( 2.012139)
```
|
|
Benchmark:
```
puts(Benchmark.measure do
10_000_000.times do
ObjectSpace::WeakMap.new
end
end)
```
Before:
```
2.568662 0.014001 2.582663 ( 2.601743)
```
After:
```
2.025523 0.008676 2.034199 ( 2.041760)
```
|
|
WeakMap can crash during compaction because the st_insert could allocate
memory.
|
|
If we're during incremental marking, then Ruby code can execute that
deallocates certain memory buffers that have been called with
rb_gc_mark_weak, which can cause use-after-free bugs.
Notes:
Merged: https://github.com/ruby/ruby/pull/8375
|
|
If the key exists in WeakMap and WeakKeyMap, then we can reuse the
buffer and we can avoid an allocation.
Notes:
Merged: https://github.com/ruby/ruby/pull/8375
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/8113
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/8113
|
|
|
|
[Feature #19561]
It's useful to be able to remove references from weak maps.
Notes:
Merged: https://github.com/ruby/ruby/pull/7629
|
|
[Feature #18498]
Notes:
Merged: https://github.com/ruby/ruby/pull/7716
|
|
[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.
Notes:
Merged: https://github.com/ruby/ruby/pull/7540
|
|
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.
Notes:
Merged: https://github.com/ruby/ruby/pull/7536
|
|
[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
```
|
|
[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.
Notes:
Merged: https://github.com/ruby/ruby/pull/7518
|
|
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.
Notes:
Merged: https://github.com/ruby/ruby/pull/7498
|
|
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.
Notes:
Merged: https://github.com/ruby/ruby/pull/7451
|