summaryrefslogtreecommitdiff
path: root/NEWS.md
diff options
context:
space:
mode:
Diffstat (limited to 'NEWS.md')
-rw-r--r--NEWS.md824
1 files changed, 216 insertions, 608 deletions
diff --git a/NEWS.md b/NEWS.md
index cfe11295a0..038f1a63c6 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,120 +1,16 @@
-# NEWS for Ruby 3.1.0
+# NEWS for Ruby 4.1.0
This document is a list of user-visible feature changes
-since the **3.0.0** release, except for bug fixes.
+since the **4.0.0** release, except for bug fixes.
Note that each entry is kept to a minimum, see links for details.
## Language changes
-* The block argument can now be anonymous if the block will
- only be passed to another method. [[Feature #11256]]
-
- ```ruby
- def foo(&)
- bar(&)
- end
- ```
-
-* Pin operator now takes an expression. [[Feature #17411]]
-
- ```ruby
- Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
- #=> [[3, 5], [5, 7], [11, 13]]
- ```
-
-* Pin operator now supports instance, class, and global variables.
- [[Feature #17724]]
-
- ```ruby
- @n = 5
- Prime.each_cons(2).lazy.find{_1 in [n, ^@n]}
- #=> [3, 5]
- ```
-
-* One-line pattern matching is no longer experimental.
-
-* Parentheses can be omitted in one-line pattern matching.
- [[Feature #16182]]
-
- ```ruby
- [0, 1] => _, x
- {y: 2} => y:
- x #=> 1
- y #=> 2
- ```
-
-* Multiple assignment evaluation order has been made consistent with
- single assignment evaluation order. With single assignment, Ruby
- uses a left-to-right evaluation order. With this code:
-
- ```ruby
- foo[0] = bar
- ```
-
- The following evaluation order is used:
-
- 1. `foo`
- 2. `bar`
- 3. `[]=` called on the result of `foo`
-
- In Ruby before 3.1.0, multiple assignment did not follow this
- evaluation order. With this code:
-
- ```ruby
- foo[0], bar.baz = a, b
- ```
-
- Versions of Ruby before 3.1.0 would evaluate in the following
- order
-
- 1. `a`
- 2. `b`
- 3. `foo`
- 4. `[]=` called on the result of `foo`
- 5. `bar`
- 6. `baz=` called on the result of `bar`
-
- Starting in Ruby 3.1.0, the evaluation order is now consistent with
- single assignment, with the left-hand side being evaluated before
- the right-hand side:
-
- 1. `foo`
- 2. `bar`
- 3. `a`
- 4. `b`
- 5. `[]=` called on the result of `foo`
- 6. `baz=` called on the result of `bar`
-
- [[Bug #4443]]
-
-* Values in Hash literals and keyword arguments can be omitted.
- [[Feature #14579]]
-
- For example,
-
- * `{x:, y:}` is a syntax sugar of `{x: x, y: y}`.
- * `foo(x:, y:)` is a syntax sugar of `foo(x: x, y: y)`.
-
- Constant names, local variable names, and method names are allowed as
- key names. Note that a reserved word is considered as a local
- variable or method name even if it's a pseudo variable name such as
- `self`.
-
-* Non main-Ractors can get instance variables (ivars) of classes/modules
- if ivars refer to shareable objects.
- [[Feature #17592]]
-
-* A command syntax is allowed in endless method definitions, i.e.,
- you can now write `def foo = puts "Hello"`.
- Note that `private def foo = puts "Hello"` does not parse.
- [[Feature #17398]]
-
-## Command line options
-
-* `--disable-gems` is now explicitly declared as "just for debugging".
- Never use it in any real-world codebase.
- [[Feature #17684]]
+* `Module#clone` and `Module#dup` no longer rewrite the lexical scope of
+ copied methods. Constants and class variables resolve through the
+ original class, consistent with inheritance and mixins.
+ [[Feature #21981]]
## Core classes updates
@@ -122,536 +18,248 @@ Note: We're only listing outstanding class updates.
* Array
- * Array#intersect? is added. [[Feature #15198]]
-
-* Class
-
- * Class#subclasses, which returns an array of classes
- directly inheriting from the receiver, not
- including singleton classes.
- [[Feature #18273]]
-
- ```ruby
- class A; end
- class B < A; end
- class C < B; end
- class D < A; end
- A.subclasses #=> [D, B]
- B.subclasses #=> [C]
- C.subclasses #=> []
- ```
-
-* Enumerable
-
- * Enumerable#compact is added. [[Feature #17312]]
+ * `Array#pack` accepts a new format `R` and `r` for unpacking unsigned
+ and signed LEB128 encoded integers. [[Feature #21785]]
+ * `Array#pack` accepts a new format `^` that returns the current offset.
+ Useful when combined with variable width formats like LEB128. [[Feature #21796]]
- * Enumerable#tally now accepts an optional hash to count. [[Feature #17744]]
+* ENV
- * Enumerable#each_cons and each_slice to return a receiver. [[GH-1509]]
-
- ```ruby
- [1, 2, 3].each_cons(2){}
- # 3.0 => nil
- # 3.1 => [1, 2, 3]
-
- [1, 2, 3].each_slice(2){}
- # 3.0 => nil
- # 3.1 => [1, 2, 3]
- ```
-
-* Enumerator::Lazy
-
- * Enumerator::Lazy#compact is added. [[Feature #17312]]
-
-* File
-
- * File.dirname now accepts an optional argument for the level to
- strip path components. [[Feature #12194]]
-
-* GC
-
- * "GC.measure_total_time = true" enables the measurement of GC.
- Measurement can introduce overhead. It is enabled by default.
- GC.measure_total_time returns the current setting.
- GC.stat[:time] or GC.stat(:time) returns measured time
- in milli-seconds. [[[Feature #10917]]]
-
- * GC.total_time returns measured time in nano-seconds. [[[Feature #10917]]]
-
-* Integer
-
- * Integer.try_convert is added. [[Feature #15211]]
+ * `ENV.fetch_values` is added. It returns an array of values for the
+ given names, raising `KeyError` for missing names unless a block is
+ given. [[Feature #21781]]
* Kernel
-
- * Kernel#load now accepts a module as the second argument,
- and will load the file using the given module as the
- top-level module. [[Feature #6210]]
-
-* Marshal
-
- * Marshal.load now accepts a `freeze: true` option.
- All returned objects are frozen except for `Class` and
- `Module` instances. Strings are deduplicated. [[Feature #18148]]
+ * `Kernel#autoload_relative` and `Module#autoload_relative` are added.
+ These methods work like `autoload`, but resolve the file path relative
+ to the file where the method is called, similar to `require_relative`.
+ This makes it easier to autoload constants from files in the same
+ directory without hardcoding absolute paths or manipulating `$LOAD_PATH`.
+ [[Feature #15330]]
* MatchData
- * MatchData#match is added [[Feature #18172]]
-
- * MatchData#match_length is added [[Feature #18172]]
-
-* Method / UnboundMethod
-
- * Method#public?, Method#private?, Method#protected?,
- UnboundMethod#public?, UnboundMethod#private?,
- UnboundMethod#protected? have been added. [[Feature #11689]]
-
-* Module
-
- * Module#prepend now modifies the ancestor chain if the receiver
- already includes the argument. Module#prepend still does not
- modify the ancestor chain if the receiver has already prepended
- the argument. [[Bug #17423]]
-
- * Module#private, #public, #protected, and #module_function will
- now return their arguments. If a single argument is given, it
- is returned. If no arguments are given, nil is returned. If
- multiple arguments are given, they are returned as an array.
- [[Feature #12495]]
-
-* Process
-
- * Process.\_fork is added. This is a core method for fork(2).
- Do not call this method directly; it is called by existing
- fork methods: Kernel.#fork, Process.fork, and IO.popen("-").
- Application monitoring libraries can overwrite this method to
- hook fork events. [[Feature #17795]]
-
-* Struct
-
- * Passing only keyword arguments to Struct#initialize is warned.
- You need to use a Hash literal to set a Hash to a first member.
- [[Feature #16806]]
-
- * StructClass#keyword_init? is added [[Feature #18008]]
-
-* String
-
- * Update Unicode version to 13.0.0 [[Feature #17750]]
- and Emoji version to 13.0 [[Feature #18029]]
-
- * String#unpack and String#unpack1 now accept an `offset:` keyword
- argument to start the unpacking after an arbitrary number of bytes
- have been skipped. If `offset` is outside of the string bounds
- `ArgumentError` is raised. [[Feature #18254]]
-
-* Thread
-
- * Thread#native_thread_id is added. [[Feature #17853]]
-
-* Thread::Backtrace
+ * `MatchData#integer_at` is added. It converts the matched substring to
+ integer and return the result. [[Feature #21932]]
- * Thread::Backtrace.limit, which returns the value to limit backtrace
- length set by `--backtrace-limit` command line option, is added.
- [[Feature #17479]]
+* Regexp
-* Thread::Queue
+ * All instances of `Regexp` are now frozen, not just literals.
+ Subclasses of `Regexp` are not frozen for compatibility.
+ [[Feature #8948]]
- * Thread::Queue.new now accepts an Enumerable of initial values.
- [[Feature #17327]]
+* Set
-* Time
-
- * Time.new now accepts optional `in:` keyword argument for the
- timezone, as well as `Time.at` and `Time.now`, so that is now
- you can omit minor arguments to `Time.new`. [[Feature #17485]]
-
- ```ruby
- Time.new(2021, 12, 25, in: "+07:00")
- #=> 2021-12-25 00:00:00 +0700
- ```
-
- At the same time, time component strings are converted to
- integers more strictly now.
-
- ```ruby
- Time.new(2021, 12, 25, "+07:30")
- #=> invalid value for Integer(): "+07:30" (ArgumentError)
- ```
-
- Ruby 3.0 or earlier returned probably unexpected result
- `2021-12-25 07:00:00`, not `2021-12-25 07:30:00` nor
- `2021-12-25 00:00:00 +07:30`.
-
- * Time#strftime supports RFC 3339 UTC for unknown offset local
- time, `-0000`, as `%-z`. [[Feature #17544]]
-
-* TracePoint
-
- * TracePoint.allow_reentry is added to allow reenter while TracePoint
- callback.
- [[Feature #15912]]
-
-* $LOAD_PATH
-
- * $LOAD_PATH.resolve_feature_path does not raise. [[Feature #16043]]
-
-* Fiber Scheduler
-
- * Add support for `Addrinfo.getaddrinfo` using `address_resolve` hook.
- [[Feature #17370]]
-
- * Introduce non-blocking `Timeout.timeout` using `timeout_after` hook.
- [[Feature #17470]]
-
- * Introduce new scheduler hooks `io_read` and `io_write` along with a
- low level `IO::Buffer` for zero-copy read/write. [[Feature #18020]]
-
- * IO hooks `io_wait`, `io_read`, `io_write`, receive the original IO object
- where possible. [[Bug #18003]]
-
- * Make `Monitor` fiber-safe. [[Bug #17827]]
-
- * Replace copy coroutine with pthread implementation. [[Feature #18015]]
-
-* Refinement
-
- * New class which represents a module created by Module#refine.
- `include` and `prepend` are deprecated, and `import_methods` is added
- instead. [[Bug #17429]]
+ * A deprecated behavior, `Set#to_set`, `Range#to_set`, and
+ `Enumerable#to_set` accepting arguments, was removed. [[Feature #21390]]
## Stdlib updates
-* The following default gem are updated.
- * RubyGems 3.3.3
- * base64 0.1.1
- * benchmark 0.2.0
- * bigdecimal 3.1.1
- * bundler 2.3.3
- * cgi 0.3.1
- * csv 3.2.2
- * date 3.2.2
- * did_you_mean 1.6.1
- * digest 3.1.0
- * drb 2.1.0
- * erb 2.2.3
- * error_highlight 0.3.0
- * etc 1.3.0
- * fcntl 1.0.1
- * fiddle 1.1.0
- * fileutils 1.6.0
- * find 0.1.1
- * io-console 0.5.10
- * io-wait 0.2.1
- * ipaddr 1.2.3
- * irb 1.4.1
- * json 2.6.1
- * logger 1.5.0
- * net-http 0.2.0
- * net-protocol 0.1.2
- * nkf 0.1.1
- * open-uri 0.2.0
- * openssl 3.0.0
- * optparse 0.2.0
- * ostruct 0.5.2
- * pathname 0.2.0
- * pp 0.3.0
- * prettyprint 0.1.1
- * psych 4.0.3
- * racc 1.6.0
- * rdoc 6.4.0
- * readline 0.0.3
- * readline-ext 0.1.4
- * reline 0.3.0
- * resolv 0.2.1
- * rinda 0.1.1
- * ruby2_keywords 0.0.5
- * securerandom 0.1.1
- * set 1.0.2
- * stringio 3.0.1
- * strscan 3.0.1
- * tempfile 0.1.2
- * time 0.2.0
- * timeout 0.2.0
- * tmpdir 0.1.2
- * un 0.2.0
- * uri 0.11.0
- * yaml 0.2.0
- * zlib 2.1.1
-* The following bundled gems are updated.
- * minitest 5.15.0
- * power_assert 2.0.1
- * rake 13.0.6
- * test-unit 3.5.3
- * rexml 3.2.5
- * rbs 2.1.0
- * typeprof 0.21.2
-* The following default gems are now bundled gems.
- * net-ftp 0.1.3
- * net-imap 0.2.3
- * net-pop 0.1.1
- * net-smtp 0.3.1
- * matrix 0.4.2
- * prime 0.1.2
- * debug 1.4.0
-
-* Coverage measurement now supports suspension. You can use `Coverage.suspend`
- to stop the measurement temporarily, and `Coverage.resume` to restart it.
- See [[Feature #18176]] in detail.
-
-* Random::Formatter is moved to random/formatter.rb, so that you can
- use `Random#hex`, `Random#base64`, and so on without SecureRandom.
- [[Feature #18190]]
+### The following bundled gems are added.
+
+
+We only list stdlib changes that are notable feature changes.
+
+Other changes are listed in the following sections. We also listed release
+history from the previous bundled version that is Ruby 3.4.0 if it has GitHub
+releases.
+
+### The following bundled gems are promoted from default gems.
+
+* tsort 0.2.0
+* win32-registry 0.1.2
+
+### The following default gem is added.
+
+### The following default gems are updated.
+
+* RubyGems 4.1.0.dev
+ * 4.0.3 to [v4.0.4][RubyGems-v4.0.4], [v4.0.5][RubyGems-v4.0.5], [v4.0.6][RubyGems-v4.0.6], [v4.0.7][RubyGems-v4.0.7], [v4.0.8][RubyGems-v4.0.8], [v4.0.9][RubyGems-v4.0.9], [v4.0.10][RubyGems-v4.0.10], [v4.0.11][RubyGems-v4.0.11], [v4.0.12][RubyGems-v4.0.12]
+* bundler 4.1.0.dev
+ * 4.0.3 to [v4.0.4][bundler-v4.0.4], [v4.0.5][bundler-v4.0.5], [v4.0.6][bundler-v4.0.6], [v4.0.7][bundler-v4.0.7], [v4.0.8][bundler-v4.0.8], [v4.0.9][bundler-v4.0.9], [v4.0.10][bundler-v4.0.10], [v4.0.11][bundler-v4.0.11], [v4.0.12][bundler-v4.0.12]
+* erb 6.0.4
+ * 6.0.1 to [v6.0.1.1][erb-v6.0.1.1], [v6.0.2][erb-v6.0.2], [v6.0.3][erb-v6.0.3], [v6.0.4][erb-v6.0.4]
+* ipaddr 1.2.9
+ * 1.2.8 to [v1.2.9][ipaddr-v1.2.9]
+* json 2.19.7
+ * 2.18.0 to [v2.18.1][json-v2.18.1], [v2.19.0][json-v2.19.0], [v2.19.1][json-v2.19.1], [v2.19.2][json-v2.19.2], [v2.19.3][json-v2.19.3], [v2.19.4][json-v2.19.4], [v2.19.5][json-v2.19.5], [v2.19.6][json-v2.19.6], [v2.19.7][json-v2.19.7]
+* openssl 4.0.2
+ * 4.0.0 to [v4.0.1][openssl-v4.0.1], [v4.0.2][openssl-v4.0.2]
+* prism 1.9.0
+ * 1.7.0 to [v1.8.0][prism-v1.8.0], [v1.8.1][prism-v1.8.1], [v1.9.0][prism-v1.9.0]
+* resolv 0.7.1
+ * 0.7.0 to [v0.7.1][resolv-v0.7.1]
+* stringio 3.2.1.dev
+* strscan 3.1.9.dev
+ * 3.1.6 to [v3.1.7][strscan-v3.1.7], [v3.1.8][strscan-v3.1.8]
+* syntax_suggest 3.0.0
+* timeout 0.6.1
+ * 0.6.0 to [v0.6.1][timeout-v0.6.1]
+* zlib 3.2.3
+ * 3.2.2 to [v3.2.3][zlib-v3.2.3]
+
+### The following bundled gems are updated.
+
+* minitest 6.0.6
+* rake 13.4.2
+ * 13.3.1 to [v13.4.0][rake-v13.4.0], [v13.4.1][rake-v13.4.1], [v13.4.2][rake-v13.4.2]
+* test-unit 3.7.7
+ * 3.7.5 to [3.7.6][test-unit-3.7.6], [3.7.7][test-unit-3.7.7]
+* net-imap 0.6.4
+ * 0.6.2 to [v0.6.3][net-imap-v0.6.3], [v0.6.4][net-imap-v0.6.4]
+* rbs 4.0.2
+ * 3.10.0 to [v3.10.1][rbs-v3.10.1], [v3.10.2][rbs-v3.10.2], [v3.10.3][rbs-v3.10.3], [v3.10.4][rbs-v3.10.4], [v4.0.0.dev.5][rbs-v4.0.0.dev.5], [v4.0.0][rbs-v4.0.0], [v4.0.2][rbs-v4.0.2]
+* typeprof 0.32.0
+* mutex_m 0.3.0
+* bigdecimal 4.1.2
+ * 4.0.1 to [v4.1.0][bigdecimal-v4.1.0], [v4.1.1][bigdecimal-v4.1.1], [v4.1.2][bigdecimal-v4.1.2]
+* resolv-replace 0.2.0
+ * 0.1.1 to [v0.2.0][resolv-replace-v0.2.0]
+* syslog 0.4.0
+ * 0.3.0 to [v0.4.0][syslog-v0.4.0]
+* repl_type_completor 0.1.15
+ * 0.1.12 to [v0.1.13][repl_type_completor-v0.1.13], [v0.1.14][repl_type_completor-v0.1.14], [v0.1.15][repl_type_completor-v0.1.15]
+* pstore 0.2.1
+ * 0.2.0 to [v0.2.1][pstore-v0.2.1]
+* rdoc 7.2.0
+ * 7.0.3 to [v7.0.4][rdoc-v7.0.4], [v7.1.0][rdoc-v7.1.0], [v7.2.0][rdoc-v7.2.0]
+* win32ole 1.9.3
+ * 1.9.2 to [v1.9.3][win32ole-v1.9.3]
+* irb 1.18.0
+ * 1.16.0 to [v1.17.0][irb-v1.17.0], [v1.18.0][irb-v1.18.0]
+
+### RubyGems and Bundler
+
+Ruby 4.0 bundled RubyGems and Bundler version 4. see the following links for details.
+
+## Supported platforms
## Compatibility issues
-Note: Excluding feature bug fixes.
-
-* `rb_io_wait_readable`, `rb_io_wait_writable` and `rb_wait_for_single_fd` are
- deprecated in favour of `rb_io_maybe_wait_readable`,
- `rb_io_maybe_wait_writable` and `rb_io_maybe_wait` respectively.
- `rb_thread_wait_fd` and `rb_thread_fd_writable` are deprecated. [[Bug #18003]]
-
## Stdlib compatibility issues
-* `ERB#initialize` warns `safe_level` and later arguments even without -w.
- [[Feature #14256]]
-
-* `lib/debug.rb` is replaced with `debug.gem`
-
-* `Kernel#pp` in `lib/pp.rb` uses the width of `IO#winsize` by default.
- This means that the output width is automatically changed depending on
- your terminal size. [[Feature #12913]]
-
-* Psych 4.0 changes `Psych.load` as `safe_load` by the default.
- You may need to use Psych 3.3.2 for migrating to this behavior.
- [[Bug #17866]]
-
## C API updates
-* Documented. [[GH-4815]]
-
-* `rb_gc_force_recycle` is deprecated and has been changed to a no-op.
- [[Feature #18290]]
-
-## Implementation improvements
-
-* Inline cache mechanism is introduced for reading class variables.
- [[Feature #17763]]
-
-* `instance_eval` and `instance_exec` now only allocate a singleton class when
- required, avoiding extra objects and improving performance. [[GH-5146]]
+### Embedded TypedData
-* The performance of `Struct` accessors is improved. [[GH-5131]]
+* The `RUBY_TYPED_EMBEDDABLE` flag is now public and documented and can be used by C extensions.
+ It allows allocating C structs directly into Ruby object slots, which reduces pointer chasing,
+ and in some case memory usage.
+ See the C extension documentation for details. [[Feature #21853]]
-* `mandatory_only?` builtin special form to improve performance on
- builtin methods. [[GH-5112]]
+* Added new C23 inspired allocator functions, that takes the previous memory size.
+ This allow the Ruby GC to better keep track of memory usage, improving its heuristics.
+ It also improves the performance of system allocators that support C23 `free_sized`.
-* Experimental feature Variable Width Allocation in the garbage collector.
- This feature is turned off by default and can be enabled by compiling Ruby
- with flag `USE_RVARGC=1` set. [[Feature #18045]] [[Feature #18239]]
-
-## JIT
+ However, it is important to note that passing an incorrect size to these function is undefined
+ behavior and may result in crashes or memory leaks.
-* Rename Ruby 3.0's `--jit` to `--mjit`, and alias `--jit` to `--yjit`
- on non-Windows x86-64 platforms and to `--mjit` on others.
+ - `ruby_xfree_sized(void *ptr, size_t size)`
+ - `ruby_xrealloc_sized(void *ptr, size_t newsiz, size_t oldsiz)`
+ - `ruby_xrealloc2_sized(void *ptr, size_t newelems, size_t newsiz, size_t oldelems)`
-### MJIT
+ [[Feature #21861]]
-* The default `--mjit-max-cache` is changed from 100 to 10000.
+### Removed APIs
-* JIT-ed code is no longer cancelled when a TracePoint for class events
- is enabled.
+The following APIs, which have been deprecated for many years, are removed.
+[[Feature #21768]]
-* The JIT compiler no longer skips compilation of methods longer than
- 1000 instructions.
+* old postponed job functions,
+* untyped data object type/functions,
+* old APIs to allocate a data object,
+* taintedness/trustedness enums/macros,
+* `rb_gc_force_recycle` function,
+* `rb_iterate` function,
+* and some functions and constants for internal use.
-* `--mjit-verbose` and `--mjit-warning` output "JIT cancel" when JIT-ed
- code is disabled because TracePoint or GC.compact is used.
-
-### YJIT: New experimental in-process JIT compiler
-
-New JIT compiler available as an experimental feature. [[Feature #18229]]
-
-See [this blog post](https://shopify.engineering/yjit-just-in-time-compiler-cruby
-) introducing the project.
-
-* Disabled by default, use `--yjit` command-line option to enable YJIT.
-
-* Performance improvements on benchmarks based on real-world software,
- up to 22% on railsbench, 39% on liquid-render.
-
-* Fast warm-up times.
-
-* Limited to Unix-like x86-64 platforms for now.
-
-## Static analysis
-
-### RBS
-
-* Generics type parameters can be bounded ([PR](https://github.com/ruby/rbs/pull/844)).
-
- ```rbs
- # `T` must be compatible with the `_Output` interface.
- # `PrettyPrint[String]` is ok, but `PrettyPrint[Integer]` is a type error.
- class PrettyPrint[T < _Output]
- interface _Output
- def <<: (String) -> void
- end
-
- attr_reader output: T
-
- def initialize: (T output) -> void
- end
- ```
-
-* Type aliases can be generic. ([PR](https://github.com/ruby/rbs/pull/823))
-
- ```rbs
- # Defines a generic type `list`.
- type list[T] = [ T, list[T] ]
- | nil
-
- type str_list = list[String]
- type int_list = list[Integer]
- ```
-
-* [rbs collection](https://github.com/ruby/rbs/blob/master/docs/collection.md) has been introduced to manage gems’ RBSs.
-
-* Many signatures for built-in and standard libraries have been added/updated.
-
-* It includes many bug fixes and performance improvements too.
-
-See the [CHANGELOG.md](https://github.com/ruby/rbs/blob/master/CHANGELOG.md) for more information.
-
-### TypeProf
-
-* [Experimental IDE support](https://github.com/ruby/typeprof/blob/master/doc/ide.md) has been implemented.
-* Many bug fixes and performance improvements since Ruby 3.0.0.
-
-## Debugger
-
-* A new debugger [debug.gem](https://github.com/ruby/debug) is bundled.
- debug.gem is a fast debugger implementation, and it provides many features
- like remote debugging, colorful REPL, IDE (VSCode) integration, and more.
- It replaces `lib/debug.rb` standard library.
-
-* `rdbg` command is also installed into `bin/` directory to start and control
- debugging execution.
-
-## error_highlight
-
-A built-in gem called error_highlight has been introduced.
-It shows fine-grained error locations in the backtrace.
-
-Example: `title = json[:article][:title]`
-
-If `json` is nil, it shows:
+## Implementation improvements
-```
-$ ruby test.rb
-test.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
+### Ractor
-title = json[:article][:title]
- ^^^^^^^^^^
-```
+A lot of work has gone into making Ractors more stable, performant, and usable. These improvements bring Ractor implementation closer to leaving experimental status.
-If `json[:article]` returns nil, it shows:
+## JIT
-```
-$ ruby test.rb
-test.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
-
-title = json[:article][:title]
- ^^^^^^^^
-```
-
-This feature is enabled by default.
-You can disable it by using a command-line option `--disable-error_highlight`.
-See [the repository](https://github.com/ruby/error_highlight) in detail.
-
-## IRB Autocomplete and Document Display
-
-The IRB now has an autocomplete feature, where you can just type in the code, and the completion candidates dialog will appear. You can use Tab and Shift+Tab to move up and down.
-
-If documents are installed when you select a completion candidate, the documentation dialog will appear next to the completion candidates dialog, showing part of the content. You can read the full document by pressing Alt+d.
-
-## Miscellaneous changes
-
-* lib/objspace/trace.rb is added, which is a tool for tracing the object
- allocation. Just by requiring this file, tracing is started *immediately*.
- Just by `Kernel#p`, you can investigate where an object was created.
- Note that just requiring this file brings a large performance overhead.
- This is only for debugging purposes. Do not use this in production.
- [[Feature #17762]]
-
-* Now exceptions raised in finalizers will be printed to `STDERR`, unless
- `$VERBOSE` is `nil`. [[Feature #17798]]
-
-* `ruby -run -e httpd` displays URLs to access. [[Feature #17847]]
-
-* Add `ruby -run -e colorize` to colorize Ruby code using
- `IRB::Color.colorize_code`.
-
-[Bug #4443]: https://bugs.ruby-lang.org/issues/4443
-[Feature #6210]: https://bugs.ruby-lang.org/issues/6210
-[Feature #10917]: https://bugs.ruby-lang.org/issues/10917
-[Feature #11256]: https://bugs.ruby-lang.org/issues/11256
-[Feature #11689]: https://bugs.ruby-lang.org/issues/11689
-[Feature #12194]: https://bugs.ruby-lang.org/issues/12194
-[Feature #12495]: https://bugs.ruby-lang.org/issues/12495
-[Feature #12913]: https://bugs.ruby-lang.org/issues/12913
-[Feature #14256]: https://bugs.ruby-lang.org/issues/14256
-[Feature #14579]: https://bugs.ruby-lang.org/issues/14579
-[Feature #15198]: https://bugs.ruby-lang.org/issues/15198
-[Feature #15211]: https://bugs.ruby-lang.org/issues/15211
-[Feature #15912]: https://bugs.ruby-lang.org/issues/15912
-[Feature #16043]: https://bugs.ruby-lang.org/issues/16043
-[Feature #16182]: https://bugs.ruby-lang.org/issues/16182
-[Feature #16806]: https://bugs.ruby-lang.org/issues/16806
-[Feature #17312]: https://bugs.ruby-lang.org/issues/17312
-[Feature #17327]: https://bugs.ruby-lang.org/issues/17327
-[Feature #17370]: https://bugs.ruby-lang.org/issues/17370
-[Feature #17398]: https://bugs.ruby-lang.org/issues/17398
-[Feature #17411]: https://bugs.ruby-lang.org/issues/17411
-[Bug #17423]: https://bugs.ruby-lang.org/issues/17423
-[Bug #17429]: https://bugs.ruby-lang.org/issues/17429
-[Feature #17470]: https://bugs.ruby-lang.org/issues/17470
-[Feature #17479]: https://bugs.ruby-lang.org/issues/17479
-[Feature #17485]: https://bugs.ruby-lang.org/issues/17485
-[Feature #17544]: https://bugs.ruby-lang.org/issues/17544
-[Feature #17592]: https://bugs.ruby-lang.org/issues/17592
-[Feature #17684]: https://bugs.ruby-lang.org/issues/17684
-[Feature #17724]: https://bugs.ruby-lang.org/issues/17724
-[Feature #17744]: https://bugs.ruby-lang.org/issues/17744
-[Feature #17750]: https://bugs.ruby-lang.org/issues/17750
-[Feature #17762]: https://bugs.ruby-lang.org/issues/17762
-[Feature #17763]: https://bugs.ruby-lang.org/issues/17763
-[Feature #17795]: https://bugs.ruby-lang.org/issues/17795
-[Feature #17798]: https://bugs.ruby-lang.org/issues/17798
-[Bug #17827]: https://bugs.ruby-lang.org/issues/17827
-[Feature #17847]: https://bugs.ruby-lang.org/issues/17847
-[Feature #17853]: https://bugs.ruby-lang.org/issues/17853
-[Bug #17866]: https://bugs.ruby-lang.org/issues/17866
-[Bug #18003]: https://bugs.ruby-lang.org/issues/18003
-[Feature #18008]: https://bugs.ruby-lang.org/issues/18008
-[Feature #18015]: https://bugs.ruby-lang.org/issues/18015
-[Feature #18020]: https://bugs.ruby-lang.org/issues/18020
-[Feature #18029]: https://bugs.ruby-lang.org/issues/18029
-[Feature #18045]: https://bugs.ruby-lang.org/issues/18045
-[Feature #18148]: https://bugs.ruby-lang.org/issues/18148
-[Feature #18172]: https://bugs.ruby-lang.org/issues/18172
-[Feature #18176]: https://bugs.ruby-lang.org/issues/18176
-[Feature #18190]: https://bugs.ruby-lang.org/issues/18190
-[Feature #18229]: https://bugs.ruby-lang.org/issues/18229
-[Feature #18239]: https://bugs.ruby-lang.org/issues/18239
-[Feature #18254]: https://bugs.ruby-lang.org/issues/18254
-[Feature #18273]: https://bugs.ruby-lang.org/issues/18273
-[Feature #18290]: https://bugs.ruby-lang.org/issues/18290
-
-[GH-1509]: https://github.com/ruby/ruby/pull/1509
-[GH-4815]: https://github.com/ruby/ruby/pull/4815
-[GH-5112]: https://github.com/ruby/ruby/pull/5112
-[GH-5131]: https://github.com/ruby/ruby/pull/5131
-[GH-5146]: https://github.com/ruby/ruby/pull/5146
+[Feature #8948]: https://bugs.ruby-lang.org/issues/8948
+[Feature #15330]: https://bugs.ruby-lang.org/issues/15330
+[Feature #21390]: https://bugs.ruby-lang.org/issues/21390
+[Feature #21768]: https://bugs.ruby-lang.org/issues/21768
+[Feature #21785]: https://bugs.ruby-lang.org/issues/21785
+[Feature #21796]: https://bugs.ruby-lang.org/issues/21796
+[Feature #21853]: https://bugs.ruby-lang.org/issues/21853
+[Feature #21861]: https://bugs.ruby-lang.org/issues/21861
+[Feature #21932]: https://bugs.ruby-lang.org/issues/21932
+[Feature #21981]: https://bugs.ruby-lang.org/issues/21981
+[RubyGems-v4.0.4]: https://github.com/rubygems/rubygems/releases/tag/v4.0.4
+[RubyGems-v4.0.5]: https://github.com/rubygems/rubygems/releases/tag/v4.0.5
+[RubyGems-v4.0.6]: https://github.com/rubygems/rubygems/releases/tag/v4.0.6
+[RubyGems-v4.0.7]: https://github.com/rubygems/rubygems/releases/tag/v4.0.7
+[RubyGems-v4.0.8]: https://github.com/rubygems/rubygems/releases/tag/v4.0.8
+[RubyGems-v4.0.9]: https://github.com/rubygems/rubygems/releases/tag/v4.0.9
+[RubyGems-v4.0.10]: https://github.com/rubygems/rubygems/releases/tag/v4.0.10
+[RubyGems-v4.0.11]: https://github.com/rubygems/rubygems/releases/tag/v4.0.11
+[RubyGems-v4.0.12]: https://github.com/rubygems/rubygems/releases/tag/v4.0.12
+[bundler-v4.0.4]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.4
+[bundler-v4.0.5]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.5
+[bundler-v4.0.6]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.6
+[bundler-v4.0.7]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.7
+[bundler-v4.0.8]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.8
+[bundler-v4.0.9]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.9
+[bundler-v4.0.10]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.10
+[bundler-v4.0.11]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.11
+[bundler-v4.0.12]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.12
+[erb-v6.0.1.1]: https://github.com/ruby/erb/releases/tag/v6.0.1.1
+[erb-v6.0.2]: https://github.com/ruby/erb/releases/tag/v6.0.2
+[erb-v6.0.3]: https://github.com/ruby/erb/releases/tag/v6.0.3
+[erb-v6.0.4]: https://github.com/ruby/erb/releases/tag/v6.0.4
+[ipaddr-v1.2.9]: https://github.com/ruby/ipaddr/releases/tag/v1.2.9
+[json-v2.18.1]: https://github.com/ruby/json/releases/tag/v2.18.1
+[json-v2.19.0]: https://github.com/ruby/json/releases/tag/v2.19.0
+[json-v2.19.1]: https://github.com/ruby/json/releases/tag/v2.19.1
+[json-v2.19.2]: https://github.com/ruby/json/releases/tag/v2.19.2
+[json-v2.19.3]: https://github.com/ruby/json/releases/tag/v2.19.3
+[json-v2.19.4]: https://github.com/ruby/json/releases/tag/v2.19.4
+[json-v2.19.5]: https://github.com/ruby/json/releases/tag/v2.19.5
+[json-v2.19.6]: https://github.com/ruby/json/releases/tag/v2.19.6
+[json-v2.19.7]: https://github.com/ruby/json/releases/tag/v2.19.7
+[openssl-v4.0.1]: https://github.com/ruby/openssl/releases/tag/v4.0.1
+[openssl-v4.0.2]: https://github.com/ruby/openssl/releases/tag/v4.0.2
+[prism-v1.8.0]: https://github.com/ruby/prism/releases/tag/v1.8.0
+[prism-v1.8.1]: https://github.com/ruby/prism/releases/tag/v1.8.1
+[prism-v1.9.0]: https://github.com/ruby/prism/releases/tag/v1.9.0
+[resolv-v0.7.1]: https://github.com/ruby/resolv/releases/tag/v0.7.1
+[strscan-v3.1.7]: https://github.com/ruby/strscan/releases/tag/v3.1.7
+[strscan-v3.1.8]: https://github.com/ruby/strscan/releases/tag/v3.1.8
+[timeout-v0.6.1]: https://github.com/ruby/timeout/releases/tag/v0.6.1
+[zlib-v3.2.3]: https://github.com/ruby/zlib/releases/tag/v3.2.3
+[rake-v13.4.0]: https://github.com/ruby/rake/releases/tag/v13.4.0
+[rake-v13.4.1]: https://github.com/ruby/rake/releases/tag/v13.4.1
+[rake-v13.4.2]: https://github.com/ruby/rake/releases/tag/v13.4.2
+[test-unit-3.7.6]: https://github.com/test-unit/test-unit/releases/tag/3.7.6
+[test-unit-3.7.7]: https://github.com/test-unit/test-unit/releases/tag/3.7.7
+[net-imap-v0.6.3]: https://github.com/ruby/net-imap/releases/tag/v0.6.3
+[net-imap-v0.6.4]: https://github.com/ruby/net-imap/releases/tag/v0.6.4
+[rbs-v3.10.1]: https://github.com/ruby/rbs/releases/tag/v3.10.1
+[rbs-v3.10.2]: https://github.com/ruby/rbs/releases/tag/v3.10.2
+[rbs-v3.10.3]: https://github.com/ruby/rbs/releases/tag/v3.10.3
+[rbs-v3.10.4]: https://github.com/ruby/rbs/releases/tag/v3.10.4
+[rbs-v4.0.0.dev.5]: https://github.com/ruby/rbs/releases/tag/v4.0.0.dev.5
+[rbs-v4.0.0]: https://github.com/ruby/rbs/releases/tag/v4.0.0
+[rbs-v4.0.2]: https://github.com/ruby/rbs/releases/tag/v4.0.2
+[bigdecimal-v4.1.0]: https://github.com/ruby/bigdecimal/releases/tag/v4.1.0
+[bigdecimal-v4.1.1]: https://github.com/ruby/bigdecimal/releases/tag/v4.1.1
+[bigdecimal-v4.1.2]: https://github.com/ruby/bigdecimal/releases/tag/v4.1.2
+[resolv-replace-v0.2.0]: https://github.com/ruby/resolv-replace/releases/tag/v0.2.0
+[syslog-v0.4.0]: https://github.com/ruby/syslog/releases/tag/v0.4.0
+[repl_type_completor-v0.1.13]: https://github.com/ruby/repl_type_completor/releases/tag/v0.1.13
+[repl_type_completor-v0.1.14]: https://github.com/ruby/repl_type_completor/releases/tag/v0.1.14
+[repl_type_completor-v0.1.15]: https://github.com/ruby/repl_type_completor/releases/tag/v0.1.15
+[pstore-v0.2.1]: https://github.com/ruby/pstore/releases/tag/v0.2.1
+[rdoc-v7.0.4]: https://github.com/ruby/rdoc/releases/tag/v7.0.4
+[rdoc-v7.1.0]: https://github.com/ruby/rdoc/releases/tag/v7.1.0
+[rdoc-v7.2.0]: https://github.com/ruby/rdoc/releases/tag/v7.2.0
+[win32ole-v1.9.3]: https://github.com/ruby/win32ole/releases/tag/v1.9.3
+[irb-v1.17.0]: https://github.com/ruby/irb/releases/tag/v1.17.0
+[irb-v1.18.0]: https://github.com/ruby/irb/releases/tag/v1.18.0