aboutsummaryrefslogtreecommitdiffstats
path: root/array.c
Commit message (Collapse)AuthorAgeFilesLines
* Fix typosKenichi Kamiya2019-09-181-5/+5
|
* Make Array#uniq return subclass instance if called on subclass instanceJeremy Evans2019-09-021-4/+8
| | | | | | | | Previously, Array#uniq would return subclass instance if the length of the array were 2 or greater, and would return Array instance if the length of the array were 0 or 1. Fixes [Bug #7768]
* Avoid confusion in Array#- and Array#difference docs (#2070)Olivier Lacan2019-08-161-6/+6
| | | | | | My previous attempt to correct #2068 apparently failed and the confusing wording ("instances") was merged into trunk instead. This should address any potential confusion.
* Allow Array#join to allocate smaller stringsJohn Hawthorn2019-08-091-1/+3
| | | | | | | | | | | | | | rb_str_buf_new always allocates at least 127 bytes of capacity, even when less is requested. > ObjectSpace.dump(%w[a b c].join) {"address":"0x7f935f06ebf0", "type":"STRING", "class":"0x7f935d8b7bb0", "bytesize":3, "capacity":127, "value":"abc", "encoding":"UTF-8", "memsize":168, "flags":{"wb_protected":true}} Instead, by using rb_str_new and then setting the length to 0, we can allocate the exact amount of memory needed, without extra capacity. > ObjectSpace.dump(%w[a b c].join) {"address":"0x7f903fcab530", "type":"STRING", "class":"0x7f903f8b7988", "embedded":true, "bytesize":3, "value":"abc", "encoding":"UTF-8", "memsize":40, "flags":{"wb_protected":true}}
* array.c: gc.h is not neededYusuke Endoh2019-08-071-1/+0
|
* [Doc] Fix Array#to_h call-seqKenichi Kamiya2019-08-041-2/+2
| | | | Closes: https://github.com/ruby/ruby/pull/2254
* [Doc] Fix Array#difference call-seqKenichi Kamiya2019-08-041-1/+1
| | | | Closes: https://github.com/ruby/ruby/pull/2255
* array.c: factor out a complex condition of assertYusuke Endoh2019-07-201-2/+8
| | | | | | | | | | | ARY_SHARED_P and ARY_EMBED_P included: assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), The two predicate macros are used in many other assert conditions, which caused memory bloat during C compilation. This change factors out the assertion above to a function. Now gcc consumes 160 MB instead of 250 MB to compile array.c.
* array.c: use assert in macro instead of in a functionYusuke Endoh2019-07-191-7/+7
| | | | | The old code lost information of lineno. Now, an assertion error will output a correct lineno (but now gcc 8 requires 250 MB, unfortunately).
* array.c: factor out `assert(RB_TYPE_P(ary, T_ARRAY))` to a functionYusuke Endoh2019-07-191-4/+10
| | | | | | | The assertion blows up gcc 8 by consuming approx. 1.8 GB memory. This change reduces the amount of memory required to about 200 MB. A follow-up of ae750799c1b28b06d02e50cd26450b9903516526.
* Use FL_TEST_RAW() to check flags.Koichi Sasada2019-07-191-10/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | FL_TEST() uses FL_ABLE() which test data types. However, in array.c we don't need to check it (all of them should be T_ARRAY), so I changed from FL_TEST() to FL_TEST_RAW() which does not check FL_ABLE(). Instead of FL_ABLE(), add assertion to check given object is a T_ARRAY object. For example, rb_ary_free() becomes slim: with FL_TEST(): 0000000000006a30 <rb_ary_free>: 6a30: 40 f6 c7 07 test $0x7,%dil 6a34: 48 8b 07 mov (%rdi),%rax 6a37: 75 09 jne 6a42 <rb_ary_free+0x12> 6a39: 48 f7 c7 f7 ff ff ff test $0xfffffffffffffff7,%rdi 6a40: 75 1e jne 6a60 <rb_ary_free+0x30> 6a42: a9 00 00 00 02 test $0x2000000,%eax 6a47: 74 07 je 6a50 <rb_ary_free+0x20> 6a49: f3 c3 repz retq 6a4b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 6a50: 48 8b 7f 20 mov 0x20(%rdi),%rdi 6a54: e9 00 00 00 00 jmpq 6a59 <rb_ary_free+0x29> 6a59: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 6a60: 89 c2 mov %eax,%edx 6a62: 83 e2 1f and $0x1f,%edx 6a65: 83 fa 1b cmp $0x1b,%edx 6a68: 74 d8 je 6a42 <rb_ary_free+0x12> 6a6a: f6 c4 60 test $0x60,%ah 6a6d: 74 d3 je 6a42 <rb_ary_free+0x12> 6a6f: eb d8 jmp 6a49 <rb_ary_free+0x19>``` with FL_TEST_RAW(): 0000000000006a30 <rb_ary_free>: 6a30: 48 f7 07 00 60 00 02 testq $0x2006000,(%rdi) 6a37: 74 07 je 6a40 <rb_ary_free+0x10> 6a39: f3 c3 repz retq 6a3b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 6a40: 48 8b 7f 20 mov 0x20(%rdi),%rdi 6a44: e9 00 00 00 00 jmpq 6a49 <rb_ary_free+0x19>
* * expand tabs.git2019-07-191-19/+19
|
* fix shared array terminology.Koichi Sasada2019-07-191-53/+62
| | | | | | | | | | | | | | | | | | Shared arrays created by Array#dup and so on points a shared_root object to manage lifetime of Array buffer. However, sometimes shared_root is called only shared so it is confusing. So I fixed these wording "shared" to "shared_root". * RArray::heap::aux::shared -> RArray::heap::aux::shared_root * ARY_SHARED() -> ARY_SHARED_ROOT() * ARY_SHARED_NUM() -> ARY_SHARED_ROOT_REFCNT() Also, add some debug_counters to count shared array objects. * ary_shared_create: shared ary by Array#dup and so on. * ary_shared: finished in shard. * ary_shared_root_occupied: shared_root but has only 1 refcnt. The number (ary_shared - ary_shared_root_occupied) is meaningful.
* introduce RUBY_ASSERT_ALWAYS(expr).Koichi Sasada2019-07-151-1/+1
| | | | | RUBY_ASSERT_ALWAYS(expr) ignores NDEBUG (we cannot remove this assertion).
* Implement Array#minmaxJeremy Evans2019-07-021-0/+21
| | | | | | | | | Array#minmax was previous not implemented, so calling #minmax on array was actually calling Enumerable#minmax. This is a simple implementation of #minmax by just calling rb_ary_min and rb_ary_max, which improves performance significantly. Fixes [Bug #15929]
* array.c: Wrong heap size given to ruby_sized_xfree when freeing shared rootsLuke Gruber2019-06-241-2/+2
| | | | | | Fixes [Bug #15953] Closes: https://github.com/ruby/ruby/pull/2253
* array.c add back shared array optimization to ary_ensure_room_for_unshiftLuke Gruber2019-06-231-2/+2
| | | | | | | Bug fix in commit ec8e5f5aa64e2a [Bug #15952] disabled an optimization in this function. Closes: https://github.com/ruby/ruby/pull/2252
* array.c: always check frozenness in Array#unshift. Fixes [Bug #15952]Luke Gruber2019-06-231-1/+2
| | | | Closes: https://github.com/ruby/ruby/pull/2251
* Fix issue with Array#rindex when rb_equal modifies receiver arrayLuke Gruber2019-06-231-0/+3
| | | | | | Fixes [Bug #15951] Closes: https://github.com/ruby/ruby/pull/2250
* add comments to mention sort.reverse!Martin Dürst2019-06-131-0/+5
| | | | | | For array.c (Array#sort) and enum.c (Enumerable#sort_by), add comments mentioning that sort.reverse! / sort_by { ... }.reverse! can/should be used to reverse the result. [ci skip]
* do not use RARRAY_SET() directly in array.c.Koichi Sasada2019-05-211-2/+10
|
* Improve documentation of Array.try_convertBenoit Daloze2019-04-271-2/+2
| | | | * Mostly to try the new git repository.
* Merge branch 'patch-5' of https://github.com/sos4nt/ruby into trunkKazuhiro NISHIYAMA2019-04-221-1/+1
|\ | | | | | | [Fix GH-2084]
| * Fix return value name in docs for Array#unionStefan Schüßler2019-02-181-1/+1
| | | | | | Throughout the docs, `new_ary` is used to indicate a new array, whereas `ary` refers to the receiver.
* | io.c: warn non-nil $,nobu2019-04-181-4/+4
| | | | | | | | | | | | | | | | * array.c (rb_ary_join_m): warn use of non-nil $,. * io.c (rb_output_fs_setter): warn when set to non-nil value. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67606 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
* | Adjusted stylesnobu2019-04-101-1/+1
| | | | | | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67504 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* | Reverting all commits from r67479 to r67496 because of CI failureskazu2019-04-101-1/+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
* | Adjusted stylesnobu2019-04-101-1/+1
| | | | | | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67493 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* | Fix a typo [ci skip]kazu2019-03-311-1/+1
| | | | | | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67389 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* | array.c: [DOC] remove unnecessary markups [ci skip]nobu2019-03-211-2/+2
|/ | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67331 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Clarify Array#- and Array#difference documentationnobu2019-01-151-6/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently we are not explicit enough regarding the potentially confusing behavior of `Array#-` and `Array#difference` when it comes to duplicate items within receiver arrays. Although the original documentation for these methods does use an array with multiple instance of the same integers, the explanation for the behavior is actually imprecise. > removing any items that also appear in +other_ary+ Not only does `Array#-` remove any items that also appear in `other_ary` but it also remove any instance of any item in `other_ary`. One may expect `Array#-` to behave like mathematical subtraction or difference when it doesn't. One could be forgiven to expect the following behavior: ```ruby [1,1,2,2,3,3,4,4] - [1,2,3,4] => [1,2,3,4] ``` In reality this is the result: ```ruby [1,1,2,2,3,3,4,4] - [1,2,3,4] => [] ``` I hope that I've prevented this potential confusion with the clarifications in this change. I can offer this as evidence of likeliness for confusion: https://twitter.com/olivierlacan/status/1084930269533085696 I'll freely admit I was surprised by this behavior myself since I needed to obtain an Array with only one instance of each item in the argument array removed. [Fix GH-2068] [ci skip] From: Olivier Lacan <hi@olivierlacan.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66831 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Fix styles [ci skip]nobu2019-01-091-3/+4
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66762 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Mark array as "going to be modified" in `Array#reject!`tenderlove2019-01-081-0/+1
| | | | | | | | | | | Before this patch, if `reject!` is called on a shared array it can mutate the shared array rather than a copy. This patch marks the array as "going to be modified" so that the shared source array isn't mutated. [Bug #15479] [ruby-core:90781] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66756 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* fix marking T_NONE object bug.ko12018-12-231-1/+7
| | | | | | | | | | | * array.c (rb_ary_splice): do not use RARRAY_PTR() here because it can cause GC because of rb_ary_detransient(). Here ary can contain T_NONE object because of increasing capacity and not initialized yet. error log: http://ci.rvm.jp/results/trunk-test@ruby-sky1/1557174 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66513 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* rename li_table->ar_table (and related names).ko12018-12-141-2/+2
| | | | | | | | | | | | | | | | | | | * internal.h: rename the following names: * li_table -> ar_table. "li" means linear (from linear search), but we use the word "array" (from data layout). * RHASH_ARRAY -> RHASH_AR_TABLE. AR_TABLE is more clear. * rb_hash_array_* -> rb_hash_ar_table_*. * RHASH_TABLE_P() -> RHASH_ST_TABLE_P(). more clear. * RHASH_CLEAR() -> RHASH_ST_CLEAR(). * hash.c: rename "linear_" prefix functions to "ar_" prefix. * hash.c (linear_init_table): rename to ar_alloc_table. * debug_counter.h: rename obj_hash_array to obj_hash_ar. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66390 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* implement Array-specific #all?, #none?, #one?nobu2018-12-051-0/+121
| | | | | | | | | | | | | | | Before this patch Array#all? was not implemented in Array class and alternatively Enumerable#all? was used, while #any? has its own method entry in Array class. Similarly, Array#none? and #one? also lacks its own implementation. This patch provides Array-specific implementations for above three methods to enable faster method lookup. [Fix GH-2041] From: Koji Onishi <fursich0@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66212 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Prefer rb_check_arity when 0 or 1 argumentsnobu2018-12-051-31/+26
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66205 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Fix error messagenobu2018-12-041-3/+7
| | | | | | * array.c (ary_take_first_or_last): expected optional argument. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66190 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Prefer rb_check_arity when 0 or 1 argumentsnobu2018-12-041-14/+3
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66179 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * expand tabs.svn2018-12-031-7/+7
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* make `RARRAY_PTR_USE` more conservertive.ko12018-12-031-25/+25
| | | | | | | | | | | | | | | | | | | * include/ruby/ruby.h: de-transient at `RARRAY_PTR_USE` and `RARRAY_PTR_USE_START`. Introduce `RARRAY_PTR_USE_TRANSIENT` and `RARRAY_PTR_USE_START_TRANSIENT` if you don't want to de-transient an array. Generally, it is difficult so C-extension writers should not use them. * array.c: use `RARRAY_PTR_USE_TRANSIENT` if possible. * hash.c: ditto. * enum.c (enum_sort_by): remove `rb_ary_transient_heap_evacuate()` because `RARRAY_PTR_USE` do de-transient. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66165 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Use a shared array for the `duparray` instructiontenderlove2018-11-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In this example code: ```ruby def foo [1, 2, 3, 4] end ``` The array literal uses a `duparray` instruction. Before this patch, `rb_ary_resurrect` would malloc and memcpy a new array buffer. This patch changes `rb_ary_resurrect` to use `ary_make_partial` so that the new array object shares the underlying buffer with the array stored in the instruction sequences. Before this patch, the new array object is not shared: ``` $ ruby -r objspace -e'p ObjectSpace.dump([1, 2, 3, 4])' "{\"address\":\"0x7fa2718372d0\", \"type\":\"ARRAY\", \"class\":\"0x7fa26f8b0010\", \"length\":4, \"memsize\":72, \"flags\":{\"wb_protected\":true}}\n" ``` After this patch: ``` $ ./ruby -r objspace -e'p ObjectSpace.dump([1, 2, 3, 4])' "{\"address\":\"0x7f9a76883638\", \"type\":\"ARRAY\", \"class\":\"0x7f9a758af900\", \"length\":4, \"shared\":true, \"references\":[\"0x7f9a768837c8\"], \"memsize\":40, \"flags\":{\"wb_protected\":true}}\n" ``` [Feature #15289] [ruby-core:90097] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66095 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * expand tabs.svn2018-11-221-1/+1
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65924 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert r63030nobu2018-11-221-1/+1
| | | | | | | * array.c (rb_ary_collect): no longer splat sole array for lambda. [ruby-core:89734] [Bug #15285] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65923 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* array.c: avoid (VALUE)--shyouhei2018-11-191-1/+2
| | | | | | | | | | This args[1]-- overflows when it is zero. Should do that only when we can say it is nonzero. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65798 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* array.c: [DOC] add docs for Array#{filter,filter!}stomar2018-11-041-0/+8
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65528 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* array.c: [DOC] improve Array#{select,select!,keep_if} docsstomar2018-11-041-12/+12
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65527 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* introduce USE_TRANSIENT_HEAP to enable/disable theap.ko12018-11-011-6/+14
| | | | | | | | * include/ruby/ruby.h: intrdocue `USE_TRANSIENT_HEAP` macro to enable/disable transient heap. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65492 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * remove trailing spaces, expand tabs.svn2018-10-301-4/+4
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65455 b2dd03c8-39d4-4d8f-98ff-823fe69b080e