summaryrefslogtreecommitdiff
path: root/hash.c
Commit message (Collapse)AuthorAgeFilesLines
* Use a monotonically increasing number for object_idJohn Hawthorn2019-11-071-2/+6
| | | | | | | | | | | | | | | | | This changes object_id from being based on the objects location in memory (or a nearby memory location in the case of a conflict) to be based on an always increasing number. This number is a Ruby Integer which allows it to overflow the size of a pointer without issue (very unlikely to happen in real programs especially on 64-bit, but a nice guarantee). This changes obj_to_id_tbl and id_to_obj_tbl to both be maps of Ruby objects to Ruby objects (previously they were Ruby object to C integer) which simplifies updating them after compaction as we can run them through gc_update_table_refs. Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
* Revert "Use a monotonically increasing number for object_id"Aaron Patterson2019-11-061-6/+2
| | | | This reverts commit bd2b314a05ae9192b3143e1e678a37c370d8a9ce.
* Use a monotonically increasing number for object_idJohn Hawthorn2019-11-061-2/+6
| | | | | | | | | | | | | | | | | This changes object_id from being based on the objects location in memory (or a nearby memory location in the case of a conflict) to be based on an always increasing number. This number is a Ruby Integer which allows it to overflow the size of a pointer without issue (very unlikely to happen in real programs especially on 64-bit, but a nice guarantee). This changes obj_to_id_tbl and id_to_obj_tbl to both be maps of Ruby objects to Ruby objects (previously they were Ruby object to C integer) which simplifies updating them after compaction as we can run them through gc_update_table_refs. Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
* Put an empty line [ci skip]Nobuyoshi Nakada2019-11-051-1/+2
|
* More rdoc for ENVBurdette Lamar2019-11-051-0/+28
|
* Correct documented return values for certain ENV methods (#2620)Burdette Lamar2019-11-021-8/+8
|
* hash.c: Do not use Unicode double-quotesYusuke Endoh2019-10-241-1/+1
| | | | | | | | | | | | | | | | It made rdoc fail. https://rubyci.org/logs/rubyci.s3.amazonaws.com/ubuntu1804/ruby-master/log/20191023T183005Z.fail.html.gz ``` RDoc is not a full Ruby parser and will fail when fed invalid ruby programs. The internal error was: (ArgumentError) invalid byte sequence in US-ASCII uh-oh! RDoc had a problem: invalid byte sequence in US-ASCII ```
* More rdoc for ENV#[] and ENV#fetchBurdetteLamar2019-10-231-13/+30
|
* [Bug #16121] adjusted indent [ci skip]Nobuyoshi Nakada2019-10-211-15/+15
|
* Stop making a redundant hash copy in Hash#dup (#2489)Dylan Thacker-Smith2019-10-211-55/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Stop making a redundant hash copy in Hash#dup It was making a copy of the hash without rehashing, then created an extra copy of the hash to do the rehashing. Since rehashing creates a new copy already, this change just uses that rehashing to make the copy. [Bug #16121] * Remove redundant Check_Type after to_hash * Fix freeing and clearing destination hash in Hash#initialize_copy The code was assuming the state of the destination hash based on the source hash for clearing any existing table on it. If these don't match, then that can cause the old table to be leaked. This can be seen by compiling hash.c with `#define HASH_DEBUG 1` and running the following script, which will crash from a debug assertion. ```ruby h = 9.times.map { |i| [i, i] }.to_h h.send(:initialize_copy, {}) ``` * Remove dead code paths in rb_hash_initialize_copy Given that `RHASH_ST_TABLE_P(h)` is defined as `(!RHASH_AR_TABLE_P(h))` it shouldn't be possible for a hash to be neither of these, so there is no need for the removed `else if` blocks. * Share implementation between Hash#replace and Hash#initialize_copy This also fixes key rehashing for small hashes backed by an array table for Hash#replace. This used to be done consistently in ruby 2.5.x, but stopped being done for small arrays in ruby 2.6.x. This also bring optimization improvements that were done for Hash#initialize_copy to Hash#replace. * Add the Hash#dup benchmark
* Use identhash as WeakMapNobuyoshi Nakada2019-10-181-1/+2
| | | | | As ObjectSpace::WeakMap allows FLONUM as a key, needs the special deal for its hash. [Feature #16035]
* Enhance doc for ENV.deleteBurdette Lamar2019-10-131-3/+15
|
* Fix more keyword separation issuesJeremy Evans2019-09-261-1/+1
| | | | | | | | | | | | | | | | | | | | | This fixes instance_exec and similar methods. It also fixes Enumerator::Yielder#yield, rb_yield_block, and a couple of cases with Proc#{<<,>>}. This support requires the addition of rb_yield_values_kw, similar to rb_yield_values2, for passing the keyword flag. Unlike earlier attempts at this, this does not modify the rb_block_call_func type or add a separate function type. The functions of type rb_block_call_func are called by Ruby with a separate VM frame, and we can get the keyword flag information from the VM frame flags, so it doesn't need to be passed as a function argument. These changes require the following VM functions accept a keyword flag: * vm_yield_with_cref * vm_yield * vm_yield_with_block
* Fix documentation for ENV.each to return ENVJeremy Evans2019-09-201-2/+2
| | | | | | | | Also have spec check that it returns ENV. Mostly from burdettelamar@yahoo.com (Burdette Lamar). Fixes [Bug #16164]
* Avoid rehashing keys in transform_valuesJohn Hawthorn2019-09-111-7/+17
| | | | | | | | Previously, calling transform_values would call rb_hash_aset for each key, needing to rehash it and look up its location. Instead, we can use rb_hash_stlike_foreach_with_replace to replace the values as we iterate without rehashing the keys.
* Allow ** syntax to be used for calling methods that do not accept keywordsJeremy Evans2019-08-301-8/+0
| | | | | | | | Treat the ** syntax as passing a copy of the hash as the last positional argument. If the hash being double splatted is empty, do not add a positional argument. Remove rb_no_keyword_hash, no longer needed.
* Separate keyword arguments from positional argumentsYusuke Endoh2019-08-301-0/+8
| | | | And, allow non-symbol keys as a keyword arugment
* drop-in type check for rb_define_singleton_method卜部昌平2019-08-291-42/+69
| | | | | | We can check the function pointer passed to rb_define_singleton_method like how we do so in rb_define_method. Doing so revealed many arity mismatches.
* rb_hash_foreach now free from ANYARGS卜部昌平2019-08-271-14/+27
| | | | | | | After 5e86b005c0f2ef30df2f9906c7e2f3abefe286a2, I now think ANYARGS is dangerous and should be extinct. This commit adds function prototypes for rb_hash_foreach / st_foreach_safe. Also fixes some prototype mismatches.
* Move Object#hash rdoc to hash.c [ci skip]Jeremy Evans2019-08-241-0/+19
| | | | | | This gets RDoc to pick up the documentation correctly. Problem pointed out by zverok (Victor Shepelev).
* hash.c: gc.h is needed when HASH_DEBUG modeYusuke Endoh2019-08-071-0/+4
|
* hash.c: gc.h is no longer neededYusuke Endoh2019-08-071-1/+0
|
* fix spellingDaniel Radetsky2019-08-071-2/+2
| | | | Closes: https://github.com/ruby/ruby/pull/2323
* introduce ar_hint_t.Koichi Sasada2019-08-011-9/+10
| | | | | Hash hint for ar_array is 1 byte (unsigned char). This patch introduce ar_hint_t which represents hint type.
* use internal_id.Koichi Sasada2019-08-011-2/+4
| | | | | | "hash_iter_lev" can be exported by Marshal.dump and it will introduce inconsistency. To avoid this issue, use internal_id instead of normal ID. This issue is pointed out by Chikanaga-san.
* make inline functions from macros.Koichi Sasada2019-08-011-25/+36
|
* use hash_ar_table_set() directlyKoichi Sasada2019-07-311-7/+5
|
* HASH_ASSERT() respects HASH_DEBUGKoichi Sasada2019-07-311-1/+1
|
* move macro to internal.h for documentation.Koichi Sasada2019-07-311-1/+0
| | | | | | 13e84d5c0a changes enum to macro, but the flags usage information are lost in internal.h. It should be same place with other flags information.
* Moved RHASH_LEV_MASK and turned into a macroNobuyoshi Nakada2019-07-311-1/+2
| | | | | Get rid of "ISO C restricts enumerator values to range of 'int'" error.
* * expand tabs.git2019-07-311-4/+4
|
* Use 1 byte hint for ar_table [Feature #15602]Koichi Sasada2019-07-311-146/+191
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On ar_table, Do not keep a full-length hash value (FLHV, 8 bytes) but keep a 1 byte hint from a FLHV (lowest byte of FLHV). An ar_table only contains at least 8 entries, so hints consumes 8 bytes at most. We can store hints in RHash::ar_hint. On 32bit CPU, we use 4 entries ar_table. The advantages: * We don't need to keep FLHV so ar_table only consumes 16 bytes (VALUEs of key and value) * 8 entries = 128 bytes. * We don't need to scan ar_table, but only need to check hints in many cases. Especially we don't need to access ar_table if there is no match entries (in many cases). It will increase memory cache locality. The disadvantages: * This technique can increase `#eql?` time because hints can conflicts (in theory, it conflicts once in 256 times). It can introduce incompatibility if there is a object x where x.eql? returns true even if hash values are different. I believe we don't need to care such irregular case. * We need to re-calculate FLHV if we need to switch from ar_table to st_table (e.g. exceeds 8 entries). It also can introduce incompatibility, on mutating key objects. I believe we don't need to care such irregular case too. Add new debug counters to measure the performance: * artable_hint_hit - hint is matched and eql?#=>true * artable_hint_miss - hint is not matched but eql?#=>false * artable_hint_notfound - lookup counts
* remove RHash::iter_lev.Koichi Sasada2019-07-311-2/+58
| | | | | | | | | | | | | | | iter_lev is used to detect the hash is iterating or not. Usually, iter_lev should be very small number (1 or 2) so `int` is overkill. This patch introduce iter_lev in flags (7 bits, FL13 to FL19) and if iter_lev exceeds this range, save it in hidden attribute. We can get 1 word in RHash. We can't modify frozen objects. Therefore I added new internal API `rb_ivar_set_internal()` which allows us to set an attribute even if the target object is frozen if the name is hidden ivar (the name without `@` prefix).
* Adjust styles and indentsNobuyoshi Nakada2019-07-191-1/+2
|
* respect RUBY_DEBUG.Koichi Sasada2019-07-151-2/+2
| | | | see RUBY_DEBUG for each debug options.
* Use rb_ident_hash_new instead of rb_hash_new_compare_by_idNobuyoshi Nakada2019-07-031-8/+0
| | | | The latter is same as the former, removed the duplicate function.
* Raise TypeError if calling ENV.freezeJeremy Evans2019-07-011-0/+15
| | | | | | | Previously, you could call ENV.freeze, but it would not have the desired effect, as you could still modify ENV. Fixes [Bug #15920]
* Alias ENV.merge! as ENV.updateKenichi Kamiya2019-06-211-0/+3
| | | | | | [Feature #15947] Closes: https://github.com/ruby/ruby/pull/2246
* hash.c (rb_hash_s_create): Reject `Hash[[nil]]`Yusuke Endoh2019-05-231-9/+0
| | | | | | | The behavior of `Hash[[nil]] #=> {}` was a bug until 1.9.3, but had been remained with a warning because some programs depended upon it. Now, six years passed. We can remove the compatibility behavior. [Bug #7300]
* Fix complex hash keys to work with compactionAaron Patterson2019-04-231-1/+5
| | | | | | | | | For example when an array containing objects is a hash key, the contents of the array may move which can cause the hash value for the array to change. This commit makes the default `hash` value based off the object id, so the hash value will remain stable. Fixes test/shell/test_command_processor.rb
* Drop MJIT_FUNC_EXPORTED from rb_hash_bulk_insertk0kubun2019-04-211-1/+1
| | | | | | it's official API after r67677 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67690 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Add `GC.compact` again.tenderlove2019-04-201-1/+39
| | | | | | 🙏 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Reverting compaction for nowtenderlove2019-04-171-39/+1
| | | | | | For some reason symbols (or classes) are being overridden in trunk git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67598 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Introduce pattern matching [EXPERIMENTAL]ktsj2019-04-171-0/+8
| | | | | | [ruby-core:87945] [Feature #14912] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67586 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Adding `GC.compact` and compacting GC support.tenderlove2019-04-171-1/+39
| | | | | | | | | | | 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@67576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Reverting all commits from r67479 to r67496 because of CI failureskazu2019-04-101-39/+1
| | | | | | | | Because hard to specify commits related to r67479 only. So please commit again. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67499 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Adding `GC.compact` and compacting GC support.tenderlove2019-04-091-1/+39
| | | | | | | | | | | 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
* [DOC] fix markups [ci skip]nobu2019-03-221-19/+18
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67337 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * expand tabs.svn2019-02-271-6/+6
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67135 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Remove stale argumentsnobu2019-02-271-13/+21
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67134 b2dd03c8-39d4-4d8f-98ff-823fe69b080e