| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
| |
Signed-off-by: careworry <worrycare@outlook.com>
|
| |
|
|
|
|
|
|
| |
assert does not print the bug report, only the file and line number of
the assertion that failed. RUBY_ASSERT prints the full bug report, which
makes it much easier to debug.
|
| |
|
|
|
|
|
|
|
| |
Enhance docs for WeakMap and WeakKeyMap
* WeakKeyMap: more class-level explanations, more details
on #getkey, fix a slight bug in code of #delete example;
* WeekMap: a bit more detailed class- and method-level docs.
|
|
|
|
|
| |
During allocation, the table may not have been allocated yet which would
crash in the st_foreach.
|
|
|
|
|
| |
During allocation, the table may not have been allocated yet which would
crash in the st_foreach.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
If the key exists in WeakMap and WeakKeyMap, then we can reuse the
buffer and we can avoid an allocation.
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
[Feature #19561]
It's useful to be able to remove references from weak maps.
|
|
|
|
| |
[Feature #18498]
|
|
|
|
|
|
|
|
|
|
|
|
| |
[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.
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[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.
|
|
|
|
|
|
|
|
| |
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.
|
|
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.
|