summaryrefslogtreecommitdiff
path: root/hash.c
Commit message (Collapse)AuthorAgeFilesLines
* [Feature #18290] Remove all usages of rb_gc_force_recyclePeter Zhu2021-11-081-2/+0
| | | | | This commit removes usages of rb_gc_force_recycle since it is a burden to maintain and makes changes to the GC difficult.
* Restore Hash#compare_by_identity mode [Bug #18171]Nobuyoshi Nakada2021-10-021-3/+1
|
* Add rb_ident_hash_new_with_sizeNobuyoshi Nakada2021-10-021-0/+8
|
* Use faster any_hash logic in rb_hashJohn Hawthorn2021-09-301-29/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | From the documentation of rb_obj_hash: > Certain core classes such as Integer use built-in hash calculations and > do not call the #hash method when used as a hash key. So if you override, say, Integer#hash it won't be used from rb_hash_aref and similar. This avoids method lookups in many common cases. This commit uses the same optimization in rb_hash, a method used internally and in the C API to get the hash value of an object. Usually this is used to build the hash of an object based on its elements. Previously it would always do a method lookup for 'hash'. This is primarily intended to speed up hashing of Arrays and Hashes, which call rb_hash for each element. compare-ruby: ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux] built-ruby: ruby 3.1.0dev (2021-09-29T02:13:24Z fast_hash d670bf88b2) [x86_64-linux] # Iteration per second (i/s) | |compare-ruby|built-ruby| |:----------------|-----------:|---------:| |hash_aref_array | 1.008| 1.769| | | -| 1.76x|
* [DOC] Fix broken links [ci skip]Nobuyoshi Nakada2021-09-151-1/+1
| | | | | | * As the "doc/" prefix is specified by the `--page-dir` option, remove from the rdoc references. * Refer to the original .rdoc instead of the converted .html.
* Handle overwriting Object::ENV in spawnJeremy Evans2021-09-141-0/+12
| | | | | | | | | Instead of looking for Object::ENV (which can be overwritten), directly look for the envtbl variable. As that is static in hash.c, and the lookup code is in process.c, add a couple non-static functions that will return envtbl (or envtbl#to_hash). Fixes [Bug #18164]
* Revert "Force recycle intermediate collection in Hash#transform_keys! [Bug ↵Kenichi Kamiya2021-09-141-1/+0
| | | | | | #17735]" This reverts commit 522d4cd32f7727886f4fcbc28ed29c08d361ee20.
* Using RB_BIGNUM_TYPE_P macroS-H-GAMELINKS2021-09-111-1/+1
|
* Free previously used tables [Bug #18134]Nobuyoshi Nakada2021-08-291-15/+7
|
* Make Hash#each family usable in RactorSutou Kouhei2021-08-261-2/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We don't need to increment/decrement iteration level for frozen Hash because frozen Hash can't be modified. We can assume that nobody changes the target Hash while calling #each family. How to reproduce: a = {} 100.times do |i| a[i] = true end Ractor.make_shareable(a) 4.times.collect do Ractor.new(a) do |b| 100.times do b.each_value do end end end end.each(&:take) Example output: internal:ractor>:267: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues. #<Thread:0x00007fcfb087bb30 run> terminated with exception (report_on_exception is true): #<Thread:0x00007fcfb087b8d8 run> terminated with exception (report_on_exception is true): #<Thread:0x00007fcfb088d678 run> terminated with exception (report_on_exception is true): #<Thread:0x00007fcfb087bd88 run> terminated with exception (report_on_exception is true): /tmp/h.rb:10:in `each_value'/tmp/h.rb:10:in `each_value': : /tmp/h.rb:10:in `each_value'no implicit conversion from nil to integer/tmp/h.rb:10:in `each_value'no implicit conversion from nil to integer (: : (TypeErrorTypeError)no implicit conversion from nil to integer)no implicit conversion from nil to integer ( (TypeErrorTypeError from /tmp/h.rb:10:in `block (3 levels) in <main>' from /tmp/h.rb:10:in `block (3 levels) in <main>' )) from /tmp/h.rb:9:in `times' from /tmp/h.rb:9:in `times' from /tmp/h.rb:9:in `block (2 levels) in <main>' from /tmp/h.rb:10:in `block (3 levels) in <main>' from /tmp/h.rb:10:in `block (3 levels) in <main>' from /tmp/h.rb:9:in `block (2 levels) in <main>' from /tmp/h.rb:9:in `times' from /tmp/h.rb:9:in `times' from /tmp/h.rb:9:in `block (2 levels) in <main>' from /tmp/h.rb:9:in `block (2 levels) in <main>' <internal:ractor>:694:in `take': thrown by remote Ractor. (Ractor::RemoteError) from /tmp/h.rb:14:in `each' from /tmp/h.rb:14:in `<main>' /tmp/h.rb:10:in `each_value': no implicit conversion from nil to integer (TypeError) from /tmp/h.rb:10:in `block (3 levels) in <main>' from /tmp/h.rb:9:in `times' from /tmp/h.rb:9:in `block (2 levels) in <main>'
* Remove old warning aged nearly 8 yearsNobuyoshi Nakada2021-08-191-23/+0
|
* Stop force-recycling evacuated array [Bug #18065]Nobuyoshi Nakada2021-08-071-1/+0
|
* Using RBOOL macroS.H2021-08-021-16/+5
|
* Fix a comment [ci skip]Nobuyoshi Nakada2021-07-281-1/+1
|
* Remove useless castsNobuyoshi Nakada2021-07-221-2/+2
|
* Copy hash compare_by_identity setting in more casesJeremy Evans2021-07-151-8/+24
| | | | | | | | | | | | | | | | | | This makes the compare_by_identity setting always copied for the following methods: * except * merge * reject * select * slice * transform_values Some of these methods did not copy the setting, or only copied the setting if the receiver was not empty. Fixes [Bug #17757] Co-authored-by: Kenichi Kamiya <kachick1@gmail.com>
* [DOC] `Hash.[]` returns a hash with no default value/proc [ci skip]Nobuyoshi Nakada2021-07-041-4/+10
|
* Specify version to remove as bare numbersNobuyoshi Nakada2021-06-301-1/+1
|
* rb_warn_deprecated_to_remove_at [Feature #17432]Nobuyoshi Nakada2021-06-301-1/+1
| | | | | At compilation time with RUBY_DEBUG enabled, check if the removal version has been reached.
* Share freeze option handlingNobuyoshi Nakada2021-06-281-17/+3
|
* [DOC] fixed return value of ENV.clone [ci skip]Nobuyoshi Nakada2021-06-241-3/+3
|
* What's Here for Numeric and ComparableBurdette Lamar2021-06-211-2/+5
|
* Adjust styles [ci skip]Nobuyoshi Nakada2021-06-171-1/+1
| | | | | | | | | * --braces-after-func-def-line * --dont-cuddle-else * --procnames-start-lines * --space-after-for * --space-after-if * --space-after-while
* Make ENV.clone warn and ENV.dup raiseJeremy Evans2021-06-081-0/+63
| | | | | | | | | | | | | | ENV.dup returned a plain Object, since all of ENV's behavior is defined in ENV's singleton class. So using dup makes no sense. ENV.clone works and is used in some gems, but it doesn't do what the user expects, since modifying ENV.clone also modifies ENV. Add a deprecation warning pointing the user to use ENV.to_h instead. This also undefines some private initialize* methods in ENV, since they are not needed. Fixes [Bug #17767]
* Add static modifier to C function in hash.c (#3138)S.H2021-06-011-5/+5
| | | | | | | | | | | * add static modifier for rb_hash_reject_bang func * add static modifier for rb_hash_reject func * add static modifier for rb_hash_values_at func * add static modifier for rb_hash_assoc func * add static modifier for rb_hash_rassoc func
* Protoized old pre-ANSI K&R style declarations and definitionsNobuyoshi Nakada2021-05-071-1/+1
|
* Fix trivial -Wundef warningsBenoit Daloze2021-05-041-1/+1
| | | | | | * See [Feature #17752] Co-authored-by: xtkoba (Tee KOBAYASHI) <xtkoba+ruby@gmail.com>
* Correct documentation example on Hash#digNick Kelley2021-04-301-1/+1
| | | | | | | | | | Fixes [Misc #17842]. The current documentation suggests that: {foo: {bar: {baz: 2}}}.dig(:foo, :bar) # => {:bar=>{:baz=>2}} when it should be: {foo: {bar: {baz: 2}}}.dig(:foo, :bar) # => {:baz=>2}
* Fix wrong documentationromainsalles2021-04-231-1/+0
| | | It doesn't return `nil` but raises an exception, as explained a few lines after
* [Doc] Add Hash#value? into call-seq (#4293)Kenichi Kamiya2021-04-151-0/+3
|
* Force recycle intermediate collection in Hash#transform_keys! [Bug #17735]Kenichi Kamiya2021-03-281-0/+2
| | | | | | | * Force recycle intermediate hash * Force recycle intermediate array too https://github.com/ruby/ruby/pull/4329#issuecomment-808840718
* Hide an intermediate arrayNobuyoshi Nakada2021-03-281-2/+4
|
* Clear an intermediate hash [Bug #17735]Nobuyoshi Nakada2021-03-281-0/+1
|
* Keep non evaluated keys in `Hash#transform_keys!` [Bug #17735]Kenichi Kamiya2021-03-281-1/+5
|
* [Doc] Fix a typo around Hash#compare_by_identityKenichi Kamiya2021-03-221-2/+2
|
* Hash#transform_values! ensures receiver modifiable in block [Bug #17736]Kenichi Kamiya2021-03-221-0/+1
|
* Ensure the receiver hash modifiable before updating [Bug #17736]Nobuyoshi Nakada2021-03-211-40/+42
| | | | Close https://github.com/ruby/ruby/pull/4298
* Refactor hash aset callbackNobuyoshi Nakada2021-03-211-10/+3
|
* Refactor hash update callbacksNobuyoshi Nakada2021-03-201-20/+13
|
* Some Hash destructive methods ensure the receiver modifiable [Bug #17736]Kenichi Kamiya2021-03-201-0/+2
| | | | | | | | | | | | | | | | | | | | | | refs: * https://bugs.ruby-lang.org/issues/17736 * https://github.com/ruby/ruby/pull/4296 This commit aims to cover following methods * Hash#select! * Hash#filter! * Hash#keep_if * Hash#reject! * Hash#delete_if I think these are not all. --- * Ensure the receiver is modifiable or not * Assert the receiver is not modified
* Avoid rehashing in Hash#replace/dup/initialize_copy [Bug #16996]Marc-Andre Lafortune2021-03-181-1/+1
|
* Avoid rehashing in Hash#select/reject [Bug #16996]Marc-Andre Lafortune2021-03-181-25/+7
|
* Explicit references to EnumerableBurdetteLamar2021-01-201-1/+4
|
* Adds RDoc summary of Hash methods (#4045)Burdette Lamar2021-01-101-0/+123
| | | | * Adds RDoc summary of Hash methods
* Make any hash values fixable [Bug #17488]Nobuyoshi Nakada2020-12-311-8/+3
| | | | | | | As hnum is an unsigned st_index_t, the result of RSHIFT may not be in the fixable range. Co-authored-by: NeoCat <neocat@neocat.jp>
* Adjusted indents [ci skip]Nobuyoshi Nakada2020-12-281-7/+7
|
* Optimize calls to `Kernel#hash` (#3987)Marc-André Lafortune2020-12-251-1/+5
| | | | This avoids recursive checks when the `hash` method of an object isn't specialized.
* Make `Hash#except` always return a HashMarc-Andre Lafortune2020-12-191-1/+2
| | | | [Feature #15822]
* Document Hash#transform_keys with hash. Amend NEWS [DOC] [ci skip]Marc-Andre Lafortune2020-12-151-14/+15
|
* Windows: Read ENV names and values as UTF-8 encoded Strings (#3818)Lars Kanis2020-12-081-62/+13
| | | | | | | | | | | | | | | | | | | | | * Windows: Read ENV names and values as UTF-8 encoded Strings Implements issue #12650: fix https://bugs.ruby-lang.org/issues/12650 This also removes the special encoding for ENV['PATH'] and some complexity in the code that is unnecessary now. * Windows: Improve readablity of getenv() encoding getenv() did use the expected codepage as an implicit parameter of the macro. This is mis-leading since include/ruby/win32.h has a different definition. Using the "cp" variable explicit (like the other function calls) makes it more readable and consistent. * Windows: Change external C-API macros getenv() and execv() to use UTF-8 They used to process and return strings with locale encoding, but since all ruby-internal spawn and environment functions use UTF-8, it makes sense to change the C-API equally.