Commit graph

980 commits

Author SHA1 Message Date
nagachika
545d682071 merge revision(s) fb4cf204a662a8cd9dafef6f31f2bd0db9129abe,fa0279d947c3962c3f8c32852278d3ebb964cb19: [Backport #17725]
use me->def instead of me for opt_table

	`vm_opt_method_table` is me=>bop table to manage the optimized
	methods (by specialized instruction). However, `me` can be invalidated
	to invalidate the method cache entry.
	[Bug #17725]

	To solve the issue, use `me-def` instead of `me` which simply copied
	at invalidation timing.

	A test by @jeremyevans https://github.com/ruby/ruby/pull/4376
	---
	 test/ruby/test_method.rb | 15 +++++++++++++++
	 vm.c                     | 11 +++++------
	 2 files changed, 20 insertions(+), 6 deletions(-)

	should not share same `def` for specialized method

	Because the key of redefine table is `def`, `def` should be
	unique for each optimized method (`alias` is not allowed).
	---
	 array.c | 2 +-
	 1 file changed, 1 insertion(+), 1 deletion(-)
2021-12-24 17:47:44 +09:00
nagachika
92846db686 merge revision(s) cd4f5b13228879d954fa97b6aa479c4a5ef4fb0a,8db269edb3550a85dfab9b193ea115ca36912ced,ab63f6d8543903f177c46634f38e5428655f003b: [Backport #18140]
Guard array when appending

	This prevents early collection of the array.  The GC doesn't see the
	array on the stack when Ruby is compiled with optimizations enabled

	[ruby-core:105099] [Bug #18140]
	---
	 array.c                 | 1 +
	 test/ruby/test_array.rb | 6 ++++++
	 2 files changed, 7 insertions(+)

	Guard array when appending

	This prevents early collection of the array.  The GC doesn't see the
	array on the stack when Ruby is compiled with optimizations enabled

	Thanks @jhaberman for the test case

	[ruby-core:105099] [Bug #18140]
	---
	 ext/-test-/array/concat/depend          | 321 ++++++++++++++++++++++++++++++++
	 ext/-test-/array/concat/extconf.rb      |   2 +
	 ext/-test-/array/concat/to_ary_conact.c |  64 +++++++
	 test/-ext-/array/test_to_ary_concat.rb  |  20 ++
	 4 files changed, 407 insertions(+)
	 create mode 100644 ext/-test-/array/concat/depend
	 create mode 100644 ext/-test-/array/concat/extconf.rb
	 create mode 100644 ext/-test-/array/concat/to_ary_conact.c
	 create mode 100644 test/-ext-/array/test_to_ary_concat.rb

	Refined test [Bug #18140]

	---
	 ext/-test-/array/concat/to_ary_conact.c | 48 +++++++--------------------------
	 test/ruby/test_array.rb                 |  5 +++-
	 2 files changed, 13 insertions(+), 40 deletions(-)
2021-09-05 12:19:53 +09:00
nagachika
8899fa0b3d merge revision(s) d43279edacd09edf3a43e02d62f5be475e7c3bcb,5dc36ddcd00fc556c04c15ce9770c5a84d7d43dc,523bf31564f160f899f8cf9f73540d6a6f687f17: [Backport #18138]
Fix length calculation for Array#slice!

	Commit 4f24255 introduced a bug which allows a length to be passed to
	rb_ary_new4 which is too large, resulting in invalid memory access.

	For example:

	    (1..1000).to_a.slice!(-2, 1000)
	---
	 array.c | 2 +-
	 1 file changed, 1 insertion(+), 1 deletion(-)

	Add out of range tests for Array#slice!

	---
	 test/ruby/test_array.rb | 13 +++++++++++++
	 1 file changed, 13 insertions(+)

	Add negative position tests [Bug #18138]

	---
	 test/ruby/test_array.rb | 4 ++++
	 1 file changed, 4 insertions(+)
2021-08-29 19:09:35 +09:00
nagachika
44b87adc07 merge revision(s) e019dd24df4ed7063ad80d4c2e4070141793f598,7954bb056be30e86c419fe3792064d28990a4999,7d3fdfb27dac456827b004d9e66a44b15f8cd762: [Backport #17736]
Ensure the receiver is modifiable before shrinking [Bug #17736]

	* Ensure the receiver is modifiable before shinking [Bug #17736]

	* Assert the receivers are not modified
	---
	 array.c                 |  1 +
	 test/ruby/test_array.rb | 36 ++++++++++++++++++++++++++++++++++++
	 2 files changed, 37 insertions(+)

	Some Hash destructive methods ensure the receiver modifiable [Bug
	 #17736]

	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
	---
	 hash.c                 |  2 ++
	 test/ruby/test_hash.rb | 42 ++++++++++++++++++++++++++++++++++++++++++
	 2 files changed, 44 insertions(+)

	Hash#transform_values! ensures receiver modifiable in block [Bug
	 #17736]

	---
	 hash.c                 | 1 +
	 test/ruby/test_hash.rb | 9 +++++++++
	 2 files changed, 10 insertions(+)
2021-05-23 15:51:10 +09:00
Victor Shepelev
5253b9579a
Document usage of ArithmeticSequence in Array#slice, and add to NEWS (#3952) 2020-12-21 09:32:30 +09:00
Jeremy Evans
05313c914b Use category: :deprecated in warnings that are related to deprecation
Also document that both :deprecated and :experimental are supported
:category option values.

The locations where warnings were marked as deprecation warnings
was previously reviewed by shyouhei.

Comment a couple locations where deprecation warnings should probably
be used but are not currently used because deprecation warning
enablement has not occurred at the time they are called
(RUBY_FREE_MIN, RUBY_HEAP_MIN_SLOTS, -K).

Add assert_deprecated_warn to test assertions.  Use this to simplify
some tests, and fix failing tests after marking some warnings with
deprecated category.
2020-12-18 09:54:11 -08:00
Koichi Sasada
344ec26a99 tuning trial: newobj with current ec
Passing current ec can improve performance of newobj. This patch
tries it for Array and String literals ([] and '').
2020-12-07 08:28:36 +09:00
Koichi Sasada
8247b8edde should not use rb_ary_modify()
ractor_copy() used rb_ary_modify() to make sure this array is not
sharing anything, but it also checks frozen flag. So frozen arrays
raises an error. To solve this issue, this patch introduces new
function rb_ary_cancel_sharing() which makes sure the array does not
share another array and it doesn't check frozen flag.
[Bug #17343]

A test is quoted from https://github.com/ruby/ruby/pull/3817
2020-12-01 13:18:32 +09:00
Nobuyoshi Nakada
b958e2add8 Removed canonicalization for mathn 2020-11-10 11:14:15 +09:00
S-H-GAMELINKS
8b3653b484 Fix links 2020-11-10 11:04:00 +09:00
Jeremy Evans
2a294d499b
Make Array methods return Array instances instead of subclass instances
This changes the following methods to return Array instances instead
of subclass instances:

* Array#drop
* Array#drop_while
* Array#flatten
* Array#slice!
* Array#slice/#[]
* Array#take
* Array#take_while
* Array#uniq
* Array#*

Fixes [Bug #6087]
2020-11-03 14:01:38 -08:00
Stefan Stüben
8c2e5bbf58 Don't redefine #rb_intern over and over again 2020-10-21 12:45:18 +09:00
Kenta Murata
a6a8576e87
Feature #16812: Allow slicing arrays with ArithmeticSequence (#3241)
* Support ArithmeticSequence in Array#slice

* Extract rb_range_component_beg_len

* Use rb_range_values to check Range object

* Fix ary_make_partial_step

* Fix for negative step cases

* range.c: Describe the role of err argument in rb_range_component_beg_len

* Raise a RangeError when an arithmetic sequence refers the outside of an array

[Feature #16812]
2020-10-21 02:40:18 +09:00
Burdette Lamar
54fb8fb62a
Comply with guide for method doc: array.c (#3506)
Methods:

    any?
    all?
    one?
    none?
    sum
    shuffle!
    shuffle
    sample
2020-09-02 14:02:34 -05:00
Burdette Lamar
94430d009a
Comply with guide for method doc: array.c (#3499)
Methods considered:

    count
    flatten!
    flatten
    cycle
    permutation
    combination
    repeated_permutation
    repeated_combination
    product
    take
    take_while
    drop
    drop_while
2020-09-01 12:49:48 -05:00
Burdette Lamar
50736f127a
Comply with guide for method doc: array.c (#3489)
Methods considered:

    &
    intersection
    |
    union
    max
    min
    minmax
    uniq!
    uniq
    compact!
    compact
2020-08-31 16:25:11 -05:00
Burdette Lamar
e744d4070c
Comply with guide for method doc: array.c (#3484)
Methods:

    +
    concat
    *
    assoc
    rassoc
    ==
    eql?
    hash
    include?
    <=>
    -
    difference
2020-08-31 14:53:54 -05:00
Burdette Lamar
1f4c507afb
Comply with guide for method doc: array.c (#3477)
Methods considered:

    delete_at
    slice!
    reject!
    reject
    delete_if
    zip
    transpose
    replace
    clear
    fill
2020-08-31 13:16:10 -05:00
Burdette Lamar
585a659b1e
Comply with guide for method doc: array.c (#3475)
Methods considered:

    bsearch
    bsearch_index
    sort_by!
    collect
    collect!
    values_at
    select
    select!
    keep_if
    delete
2020-08-30 10:34:13 -05:00
Burdette Lamar
726f2e59f9
Comply with guide for method doc: array.c (#3474)
Methods considered:

    length
    empty?
    join
    inspect
    to_a
    to_h
    to_ary
    reverse!
    reverse
    rotate!
    rotate
    sort!
    sort
2020-08-29 15:16:02 -05:00
Burdette Lamar
f0ad5594bf
Comply with guide for method doc: array.c (#3473)
Methods considered:

    at
    first
    last
    fetch
    index
    rindex
    []
    insert
    each
    each_index
    reverse_each
2020-08-29 12:15:06 -05:00
Burdette Lamar
45c40f5631
Comply with guide for method doc: array.c (#3469)
Methods:
- freeze
- try_convert
- new
- \<<
- push
- pop
- shift
- unshift
- []
2020-08-28 14:56:02 -05:00
Burdette Lamar
1d3e87a28c
Remove checks for self returned in array.c and hash.c examples (#3446)
Further compliance with https://github.com/ruby/ruby/blob/master/doc/method_documentation.rdoc#details-and-examples-
2020-08-23 12:10:01 -05:00
Burdette Lamar
ea4ccc0992
Remove trivial examples from array.c (#3442)
"Trivial" typically means "returns a new empty Array."
2020-08-21 15:50:56 -05:00
Burdette Lamar
b6c7b94b1c
Remove nil-return examples from array.c (#3437) 2020-08-20 20:40:26 -05:00
Burdette Lamar
63d213eb13
Partial compliance with doc/method_documentation.rdoc (#3431)
Removes references to *-convertible thingies.
2020-08-19 16:26:40 -05:00
卜部昌平
ff30358d13 RARRAY_AREF: convert into an inline function
RARRAY_AREF has been a macro for reasons.  We might not be able to
change that for public APIs, but why not relax the situation internally
to make it an inline function.
2020-08-15 12:09:26 +09:00
Burdette Lamar
c84ccf1a07
Fix links to Dig Methods document (#3421)
* Fix links to Dig Methods document

* Fix links to Dig Methods document
2020-08-14 18:55:04 -05:00
Burdette Lamar
22fd617aa5
Adding doc/dig_methods.rdoc and links to it (#3416)
Adds a full discussion of #dig, along with links from Array, Hash, Struct, and OpenStruct.

CSV::Table and CSV::Row are over in ruby/csv. I'll get to them soon.

The art to the thing is to figure out how much (or how little) to say at each #dig.
2020-08-13 13:16:27 -05:00
卜部昌平
1f9e25cd02 MAYBE_UNUSED should just suffice
This reverts commit c355fa72d4.
2020-08-13 10:14:20 +09:00
Burdette Lamar
c303e21d52
Enhanced RDoc for Array (#3400)
Methods:

    drop
    drop_while
    any?
    all?
    none?
    one?
2020-08-10 11:33:31 -05:00
Nobuyoshi Nakada
0ca6b973e8
Removed non-ASCII code to suppress warnings by localized compilers 2020-08-10 19:46:13 +09:00
Nobuyoshi Nakada
c355fa72d4
Suppress unused-function warnings
Calls with a constant argument should be optimized away.
2020-08-10 17:47:34 +09:00
Burdette Lamar
4126a979ae
Enhanced RDoc for Array#take and Array#take_while (#3398) 2020-08-07 12:08:36 -05:00
Burdette Lamar
615b7fa557
Enhanced RDoc for Array#product (#3395) 2020-08-07 06:52:37 -05:00
Burdette Lamar
e0bc436d9c
Enhanced documentation for Array#repeated_combination (#3392)
* Enhanced documentation for Array#repeated_combination

* Enhanced documentation for Array#repeated_combination
2020-08-05 14:58:16 -05:00
Burdette Lamar
2498334614
Enhanced documentation for Array#repeated_permutation (#3390)
* Enhanced documentation for Array#repeated_permutation

* Enhanced documentation for Array#repeated_permutation
2020-08-05 09:42:58 -05:00
Nobuyoshi Nakada
b6e6807993
Initialize memo pointer and use it consistently to silence gcc 7+ 2020-08-01 15:04:58 +09:00
Burdette Lamar
eebb1de7c1
Enhanced RDoc for Array 2020-07-31 19:29:34 -07:00
Jeremy Evans
a6bfc951aa Document Array#flatten{,!} accept explicit nil argument [ci skip]
Fixes [Bug #10475]
2020-07-30 12:39:54 -07:00
Marc-Andre Lafortune
1b1ea7b3bc Fix Array#flatten for recursive array when given positive depth [Bug #17092] 2020-07-30 09:53:42 -04:00
Burdette Lamar
35e5b8fb82
Enhanced RDoc for Array (#3372) 2020-07-29 18:25:24 -04:00
BurdetteLamar
e1b6e1d126 Enhanced RDoc for Array [ci skip] 2020-07-28 12:01:46 -07:00
Kazuhiro NISHIYAMA
946cd6c534
Use https instead of http 2020-07-28 19:51:54 +09:00
Burdette Lamar
5d04ac6ea2
Enhanced RDoc for Array (#3350)
* Enhanced RDoc for Array

Methods:

    ==
    eql?
    hash
    include?
    <=>
2020-07-22 19:06:49 -05:00
BurdetteLamar
a50750c8a9 Enhanced RDoc for Array 2020-07-21 17:07:12 -05:00
BurdetteLamar
d29de7b31b Enhanced RDoc for Array 2020-07-21 17:07:12 -05:00
BurdetteLamar
8a974e0fcb Enhanced RDoc for Array 2020-07-21 17:07:12 -05:00
Kenta Murata
b4e784434c
Optimize Array#min (#3324)
The benchmark result is below:

|                |compare-ruby|built-ruby|
|:---------------|-----------:|---------:|
|ary2.min        |     39.105M|   39.442M|
|                |           -|     1.01x|
|ary10.min       |     23.995M|   30.762M|
|                |           -|     1.28x|
|ary100.min      |      6.249M|   10.783M|
|                |           -|     1.73x|
|ary500.min      |      1.408M|    2.714M|
|                |           -|     1.93x|
|ary1000.min     |    828.397k|    1.465M|
|                |           -|     1.77x|
|ary2000.min     |    332.256k|  570.504k|
|                |           -|     1.72x|
|ary3000.min     |    338.079k|  573.868k|
|                |           -|     1.70x|
|ary5000.min     |    168.217k|  286.114k|
|                |           -|     1.70x|
|ary10000.min    |     85.512k|  143.551k|
|                |           -|     1.68x|
|ary20000.min    |     43.264k|   71.935k|
|                |           -|     1.66x|
|ary50000.min    |     17.317k|   29.107k|
|                |           -|     1.68x|
|ary100000.min   |      9.072k|   14.540k|
|                |           -|     1.60x|
|ary1000000.min  |     872.930|    1.436k|
|                |           -|     1.64x|

compare-ruby is 9f4b7fc82e.
2020-07-18 23:45:25 +09:00
Kenta Murata
a63f520971
Optimize Array#max (#3325)
The benchmark result is below:

|                |compare-ruby|built-ruby|
|:---------------|-----------:|---------:|
|ary2.max        |     38.837M|   40.830M|
|                |           -|     1.05x|
|ary10.max       |     23.035M|   32.626M|
|                |           -|     1.42x|
|ary100.max      |      5.490M|   11.020M|
|                |           -|     2.01x|
|ary500.max      |      1.324M|    2.679M|
|                |           -|     2.02x|
|ary1000.max     |    699.167k|    1.403M|
|                |           -|     2.01x|
|ary2000.max     |    284.321k|  570.446k|
|                |           -|     2.01x|
|ary3000.max     |    282.613k|  571.683k|
|                |           -|     2.02x|
|ary5000.max     |    145.120k|  285.546k|
|                |           -|     1.97x|
|ary10000.max    |     72.102k|  142.831k|
|                |           -|     1.98x|
|ary20000.max    |     36.065k|   72.077k|
|                |           -|     2.00x|
|ary50000.max    |     14.343k|   29.139k|
|                |           -|     2.03x|
|ary100000.max   |      7.586k|   14.472k|
|                |           -|     1.91x|
|ary1000000.max  |     726.915|    1.495k|
|                |           -|     2.06x|
2020-07-18 23:45:00 +09:00