| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
| |
If a Hash is non-empty, there's no point calling `ar_force_convert_table`. We'll be immediately discarding that new st table, and replacing it with the new `identtable` st table that we're stealing out of `tmp`.
|
|
|
|
|
|
| |
For non-empty Hashes, this function needs to rehash all the stored values (using the new `compare` and `hash` functions from `identhash`). It does so by writing into a newly allocated `tmp` Hash, and then transferring ownership of its st table into `self`.
For empty Hashes, we can skip allocating this `tmp`, because there's nothing to re-hash. We can just modify our new st table's `type` in-place.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* delete `ar_try_convert` but use `ar_force_convert_table`
to make program simple.
* `ar_force_convert_table` checks hash modification while
calling `#hash` method with the following strategy:
1. copy keys (and vals) of ar_table
2. calc hashes from keys
3. check copied keys and hash's keys. if not matched, repeat from 1
fix [Bug #20050]
|
|
|
|
|
|
|
| |
We didn't free the old ST before overwriting it which caused a leak.
Found with RUBY_FREE_ON_EXIT.
Co-authored-by: Peter Zhu <peter@peterzhu.ca>
|
|
|
|
|
|
|
| |
st.c redefines malloc and free to be ruby_xmalloc and ruby_xfree, so
when this was copied into hash.c it ended up mismatching an xmalloc with
a regular free, which ended up inflating oldmalloc_increase_bytes when
hashes were freed by minor GC.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
ar_table may be converted to st_table by `ar_force_convert_table`.
If the conversion occurs during the iteration of ar_table, the iteration
may lead to memory corruption.
This change prevents the catastrophy by throwing an exception when the
conversion is detected.
This issue is reported by [SuperS](https://hackerone.com/superss)
|
|
|
|
|
| |
The level in ivar is no longer needed to check if iterating, only used
for increment/decrement.
|
|
|
|
|
|
| |
- Make it unsigned like as in-flags bits
- Make it long since it should be fixable
- Reduce it to in-flags bits after decrement
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
We need to free the old ST table in Hash#rehash.
Co-authored-by: Adam Hess <adamhess1991@gmail.com>
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
RARRAY_PTR_USE now does the same things as RARRAY_PTR_USE_TRANSIENT.
|
|
|
|
|
|
|
|
| |
According to the C99 specification section 7.20.3.2 paragraph 2:
> If ptr is a null pointer, no action occurs.
So we do not need to check that the pointer is a null pointer.
|
|
|
|
| |
Hash#replace can leak memory if the receiver has an ST table.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
st_copy allocates a st_table, which is not needed for hashes since it is
allocated by VWA and embedded, so this causes a memory leak.
The following script demonstrates the issue:
```ruby
20.times do
100_000.times do
{a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9}
end
puts `ps -o rss= -p #{$$}`
end
```
|
| |
|
| |
|
|
|
|
|
| |
RHASH_TABLE_NULL_P and ar_alloc_table are no longer needed since
all Hash will have AR tables.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
We now always copy the ST table, so we don't need to initialize the ST
table of hash when hash2 is empty.
|
|
|
|
|
|
|
|
|
| |
With VWA, AR hashes are much larger than ST hashes. Hash#replace
attempts to directly copy the contents of AR hashes into ST hashes so
there will be memory corruption caused by writing past the end of memory.
This commit changes it so that if a ST hash is being replaced with an AR
hash it will insert each element into the ST hash.
|
|
|
|
| |
new_tab can no longer ever be NULL so this is dead code.
|
|
|
|
|
|
|
|
|
|
| |
[Feature #19236]
In Ruby 3.3, `Hash.new` shall print a deprecation warning if keyword arguments
are passed instead of treating them as an implicit positional Hash.
This will allow to safely introduce a `capacity` keyword argument in 3.4
Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
|
|
|
|
| |
This allows Hashes with ST tables to fit int he 80 byte size pool.
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
[Bug #19589]
When decrementing `iter_lev` from `65` to `64` the flags would be
corrupted, causing the shape_id to be invalid.
|
|
|
|
| |
NEWOBJ_OF is now our canonical newobj macro. It takes an optional ec
|
|
|
|
|
|
|
|
|
| |
The documentation states it returns a copy of self with nil value
entries removed. However, the previous behavior was creating a
plain new hash with non-nil values copied into it. This change
aligns the behavior with the documentation.
Fixes [Bug #19113]
|
|
|
|
|
|
|
| |
This was already copied for non-empty hashes. As Hash.ruby2_keywords_hash
copies default values, it should also copy the compare_by_identity flag.
Partially Fixes [Bug #19113]
|
|
|
|
|
|
|
|
| |
It wasn't copied for empty hashes, and Hash.[] doesn't copy the
default value, so copying the compare_by_identity flag does not
make sense.
Partially Fixes [Bug #19113]
|
| |
|
| |
|