aboutsummaryrefslogtreecommitdiffstats
path: root/hash.c
Commit message (Collapse)AuthorAgeFilesLines
* rb_hash_transient_heap_evacuate: do not goto into a branch卜部昌平2020-06-291-5/+4
| | | | | I'm not necessarily against every goto in general, but jumping into a branch is definitely a bad idea. Better refactor.
* any_hash: do not goto into a branch卜部昌平2020-06-291-19/+18
| | | | | I'm not necessarily against every goto in general, but jumping into a branch is definitely a bad idea. Better refactor.
* Add Hash#except ENV#except [Feature #15822]Timo Schilling2020-06-181-0/+52
|
* ENV.delete should return the result of block on non-existing keyNobuyoshi Nakada2020-06-101-6/+7
| | | | | | | Fixes [Bug #16173] Co-Authored-By: Burdette Lamar <burdettelamar@yahoo.com> Co-Authored-By: Jeremy Evans <code@jeremyevans.net>
* Enhanced Rdoc for Array#fetch and Array#index (#3202)Burdette Lamar2020-06-101-6/+6
| | | | | * Enhanced Rdoc for Array#fetch and Array#index * Couple of tweaks (per review) in Rdoc for Hash
* Enhanced Rdoc for Hash (#3187)Burdette Lamar2020-06-071-57/+76
| | | | | | | | | | | Methods: #<= #< #>= #> #to_proc Also, a small amount of housekeeping: Adding backslash to some class name to prevent linking.
* Enhanced Rdoc for Hash (#3178)Burdette Lamar2020-06-031-53/+160
| | | | | | | * Enhanced Rdoc for Hash * Fix typo in Hash Rdoc * Enhanced Rdoc for Hash
* [ci skip] Enhanced Rdoc for Hash (#3162)Burdette Lamar2020-06-021-135/+254
| | | | | * Enhanced Rdoc for Hash * Enhanced Rdoc for Hash
* fix typo in Hash#delete docsS-H-GAMELINKS2020-06-011-1/+1
|
* [ci skip] Enhanced Rdoc for Hash (#3155)Burdette Lamar2020-05-291-58/+96
| | | | | * Enhanced Rdoc for Hash * Respond to review
* Enhanced Rdoc for Hash (#3151)Burdette Lamar2020-05-281-87/+180
|
* [ci skip] Enhanced Rdoc for Hash (#3143)Burdette Lamar2020-05-271-50/+71
| | | | | | | | * Enhanced Rdoc for Hash * Respond to review * Nudge CI testing. Respond to review
* Enhanced Rdoc for Hash (#3139)Burdette Lamar2020-05-231-40/+109
|
* Enhanced Rdoc for HashBurdetteLamar2020-05-231-37/+104
|
* Enhanced rdoc for Hash (#3129)Burdette Lamar2020-05-221-24/+29
|
* add static modifier for rb_hash_keep_if funcS-H-GAMELINKS2020-05-221-1/+1
|
* add static modifier for rb_hash_select_bang funcS-H-GAMELINKS2020-05-221-1/+1
|
* add static modifier for rb_hash_select funcS-H-GAMELINKS2020-05-221-1/+1
|
* [ci skip] Enhanced rdoc for Hash (#3121)Burdette Lamar2020-05-211-55/+72
|
* add static modifer for rb_hash_fetch_values funcS-H-GAMELINKS2020-05-201-1/+1
|
* [CI skip] Enhance rdoc intro for Hash (#3056)Burdette Lamar2020-05-151-67/+238
| | | | | | | | | | | | | | | | | | | | | | | * Per @nobu review * [CI skip] Enhance rdoc intro for Hash * Tweak call-seq for Hash.new * Tweak call-seq for Hash.new * Minor corrections * Respond to review * Respond to review * Respond to review * Respond to review * Fix chain exampmle * Response to review
* Document that #hash is not called for certain core classes [ci skip]Jeremy Evans2020-05-121-0/+3
| | | | Fixes [Bug #16850]
* sed -i 's|ruby/impl|ruby/internal|'卜部昌平2020-05-111-1/+1
| | | | To fix build failures.
* sed -i s|ruby/3|ruby/impl|g卜部昌平2020-05-111-1/+1
| | | | This shall fix compile errors.
* Added more NORETURN declarationsNobuyoshi Nakada2020-05-111-1/+2
|
* RDoc enhancements for Hash[].Burdette Lamar2020-04-231-12/+64
|
* Env values removed by ENV.clear are not usedNobuyoshi Nakada2020-04-181-4/+3
|
* Bypass env key encoding conversion if unnecessaryNobuyoshi Nakada2020-04-181-9/+13
|
* Hoisted out reset_by_modified_envNobuyoshi Nakada2020-04-181-10/+12
|
* Compare environment variable names in those manor [Bug #16798]Nobuyoshi Nakada2020-04-181-3/+19
|
* Improve Hash documentation.Burdette Lamar2020-04-141-35/+62
|
* Merge pull request #2991 from shyouhei/ruby.h卜部昌平2020-04-081-5/+7
| | | Split ruby.h
* [ci skip] Doc-only enhancements for HashBurdette Lamar2020-03-271-11/+112
| | | About the defalut values.
* Reduce allocations for keyword argument hashesJeremy Evans2020-03-171-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, passing a keyword splat to a method always allocated a hash on the caller side, and accepting arbitrary keywords in a method allocated a separate hash on the callee side. Passing explicit keywords to a method that accepted a keyword splat did not allocate a hash on the caller side, but resulted in two hashes allocated on the callee side. This commit makes passing a single keyword splat to a method not allocate a hash on the caller side. Passing multiple keyword splats or a mix of explicit keywords and a keyword splat still generates a hash on the caller side. On the callee side, if arbitrary keywords are not accepted, it does not allocate a hash. If arbitrary keywords are accepted, it will allocate a hash, but this commit uses a callinfo flag to indicate whether the caller already allocated a hash, and if so, the callee can use the passed hash without duplicating it. So this commit should make it so that a maximum of a single hash is allocated during method calls. To set the callinfo flag appropriately, method call argument compilation checks if only a single keyword splat is given. If only one keyword splat is given, the VM_CALL_KW_SPLAT_MUT callinfo flag is not set, since in that case the keyword splat is passed directly and not mutable. If more than one splat is used, a new hash needs to be generated on the caller side, and in that case the callinfo flag is set, indicating the keyword splat is mutable by the callee. In compile_hash, used for both hash and keyword argument compilation, if compiling keyword arguments and only a single keyword splat is used, pass the argument directly. On the caller side, in vm_args.c, the callinfo flag needs to be recognized and handled. Because the keyword splat argument may not be a hash, it needs to be converted to a hash first if not. Then, unless the callinfo flag is set, the hash needs to be duplicated. The temporary copy of the callinfo flag, kw_flag, is updated if a hash was duplicated, to prevent the need to duplicate it again. If we are converting to a hash or duplicating a hash, we need to update the argument array, which can including duplicating the positional splat array if one was passed. CALLER_SETUP_ARG and a couple other places needs to be modified to handle similar issues for other types of calls. This includes fairly comprehensive tests for different ways keywords are handled internally, checking that you get equal results but that keyword splats on the caller side result in distinct objects for keyword rest parameters. Included are benchmarks for keyword argument calls. Brief results when compiled without optimization: def kw(a: 1) a end def kws(**kw) kw end h = {a: 1} kw(a: 1) # about same kw(**h) # 2.37x faster kws(a: 1) # 1.30x faster kws(**h) # 2.19x faster kw(a: 1, **h) # 1.03x slower kw(**h, **h) # about same kws(a: 1, **h) # 1.16x faster kws(**h, **h) # 1.14x faster
* hash.c: Do not use the fast path (rb_yield_values) for lambda blocksYusuke Endoh2020-03-161-3/+3
| | | | | | | | | | | | | | | | | As a semantics, Hash#each yields a 2-element array (pairs of keys and values). So, `{ a: 1 }.each(&->(k, v) { })` should raise an exception due to lambda's arity check. However, the optimization that avoids Array allocation by using rb_yield_values for blocks whose arity is more than 1 (introduced at b9d29603375d17c3d1d609d9662f50beaec61fa1 and some commits), seemed to overlook the lambda case, and wrongly allowed the code above to work. This change experimentally attempts to make it strict; now the code above raises an ArgumentError. This is an incompatible change; if the compatibility issue is bigger than our expectation, it may be reverted (until Ruby 3.0 release). [Bug #12706]
* Add missing write barrier for Hash#transform_values{,!}Alan Wu2020-03-151-3/+4
| | | | | | | 21994b7fd686f263544fcac1616ecf3189fb78b3 removed the write barrier that was present in rb_hash_aset(). Re-insert it to not crash during GC. [Bug #16689]
* Cast properly for shift operandKoichi Sasada2020-03-091-1/+1
| | | | `(int) << RHASH_LEV_SHIFT` can be negative integer.
* check ar_table first.Koichi Sasada2020-03-071-2/+5
| | | | | RHASH_AR_TABLE_SIZE() has assertion that it is a ar_talbe. The last commit breaks this assumption so check ar_table first.
* check ar_table after `#hash` callKoichi Sasada2020-03-071-0/+18
| | | | | | | ar_table can be converted to st_table just after `ar_do_hash()` function which calls `#hash` method. We need to check the representation to detect this mutation. [Bug #16676]
* fix compile error w/ -DUSE_TRANSIENT_HEAP=0卜部昌平2020-03-041-0/+2
| | | | | rb_transient_heap_managed_ptr_p is available only when USE_TRANSIENT_HEAP. Need #if guards.
* hash.c: [DOC] fix examples for ENV.merge!Marcus Stollsteimer2020-02-221-5/+6
|
* More ENV rdoc [ci skip]Burdette Lamar2020-02-221-61/+116
|
* [DOC] Fixed `ENV.rassoc` result order [ci skip]Nobuyoshi Nakada2020-02-201-2/+3
|
* hash.c: [DOC] fix typosMarcus Stollsteimer2020-02-191-3/+3
|
* [DOC] use local variable like names [ci skip]Nobuyoshi Nakada2020-02-151-24/+24
| | | | | Use local variable like name as return value which is an instance of that class but not constant itself.
* Fix typos and add a space [ci skip]Kazuhiro NISHIYAMA2020-02-141-3/+3
|
* Enhanced doc for ENVBurdette Lamar2020-02-141-28/+61
| | | * More on ENV examples
* Enhance rdoc for ENVBurdette Lamar2020-02-091-14/+80
|
* Extract a function, ruby_reset_timezone().Tanaka Akira2020-01-281-3/+3
| | | | | Initial implementation of ruby_reset_timezone() assigns ruby_tz_uptodate_p to false.
* Added rb_warn_deprecated_to_removeNobuyoshi Nakada2020-01-231-1/+1
| | | | | Warn the deprecation and future removal, with obeying the warning flag.