Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update Ruby 3.3.6 → 3.4.1 #1719

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

Update Ruby 3.3.6 → 3.4.1 #1719

wants to merge 1 commit into from

Conversation

depfu[bot]
Copy link
Contributor

@depfu depfu bot commented Dec 27, 2024

Here is everything you need to know about this upgrade. Please take a good look at what changed and the test results before merging this pull request.

What changed?

Release Notes

3.4.1

Posted by naruse on 25 Dec 2024

Ruby 3.4.1 has been released.

This fixes the version description.

See the GitHub releases for further details.

3.4.0

Posted by naruse on 25 Dec 2024

We are pleased to announce the release of Ruby 3.4.0. Ruby 3.4 adds it block parameter reference, change Prism as default parser, adds Happy Eyeballs Version 2 support to socket library, improves YJIT, adds Modular GC, and so on.

it is introduced

it is added to reference a block parameter with no variable name. [Feature #18980]

ary = ["foo", "bar", "baz"]

p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]

it very much behaves the same as _1. When the intention is to only use _1 in a block, the potential for other numbered parameters such as _2 to also appear imposes an extra cognitive load onto readers. So it was introduced as a handy alias. Use it in simple cases where it speaks for itself, such as in one-line blocks.

Prism is now the default parser

Switch the default parser from parse.y to Prism. [Feature #20564]

This is an internal improvement and there should be little change visible to the user. If you notice any compatibility issues, please report them to us.

To use the conventional parser, use the command-line argument --parser=parse.y.

The socket library now features Happy Eyeballs Version 2 (RFC 8305)

The socket library now features Happy Eyeballs Version 2 (RFC 8305), the latest standardized version of a widely adopted approach for better connectivity in many programming languages, in TCPSocket.new (TCPSocket.open) and Socket.tcp. This improvement enables Ruby to provide efficient and reliable network connections, adapted to modern internet environments.

Until Ruby 3.3, these methods performed name resolution and connection attempts serially. With this algorithm, they now operate as follows:

  1. Performs IPv6 and IPv4 name resolution concurrently
  2. Attempt connections to the resolved IP addresses, prioritizing IPv6, with parallel attempts staggered at 250ms intervals
  3. Return the first successful connection while canceling any others

This ensures minimized connection delays, even if a specific protocol or IP address is delayed or unavailable. This feature is enabled by default, so additional configuration is not required to use it. To disable it globally, set the environment variable RUBY_TCP_NO_FAST_FALLBACK=1 or call Socket.tcp_fast_fallback=false. Or to disable it on a per-method basis, use the keyword argument fast_fallback: false.

YJIT

TL;DR

  • Better performance across most benchmarks on both x86-64 and arm64 platforms.
  • Reduced memory usage through compressed metadata and a unified memory limit.
  • Various bug fixes: YJIT is now more robust and thoroughly tested.

New features

  • Command-line options
    • --yjit-mem-size introduces a unified memory limit (default 128MiB) to track total YJIT memory usage, providing a more intuitive alternative to the old --yjit-exec-mem-size option.
    • --yjit-log enables a compilation log to track what gets compiled.
  • Ruby API
    • RubyVM::YJIT.log provides access to the tail of the compilation log at run-time.
  • YJIT stats
    • RubyVM::YJIT.runtime_stats now always provides additional statistics on invalidation, inlining, and metadata encoding.

New optimizations

  • Compressed context reduces memory needed to store YJIT metadata
  • Allocate registers for local variables and Ruby method arguments
  • When YJIT is enabled, use more Core primitives written in Ruby:
    • Array#each, Array#select, Array#map rewritten in Ruby for better performance [Feature #20182].
  • Ability to inline small/trivial methods such as:
    • Empty methods
    • Methods returning a constant
    • Methods returning self
    • Methods directly returning an argument
  • Specialized codegen for many more runtime methods
  • Optimize String#getbyte, String#setbyte and other string methods
  • Optimize bitwise operations to speed up low-level bit/byte manipulation
  • Support shareable constants in multi-ractor mode
  • Various other incremental optimizations

Modular GC

  • Alternative garbage collector (GC) implementations can be loaded dynamically through the modular garbage collector feature. To enable this feature, configure Ruby with --with-modular-gc at build time. GC libraries can be loaded at runtime using the environment variable RUBY_GC_LIBRARY. [Feature #20351]

  • Ruby’s built-in garbage collector has been split into a separate file at gc/default/default.c and interacts with Ruby using an API defined in gc/gc_impl.h. The built-in garbage collector can now also be built as a library using make modular-gc MODULAR_GC=default and enabled using the environment variable RUBY_GC_LIBRARY=default. [Feature #20470]

  • An experimental GC library is provided based on MMTk. This GC library can be built using make modular-gc MODULAR_GC=mmtk and enabled using the environment variable RUBY_GC_LIBRARY=mmtk. This requires the Rust toolchain on the build machine. [Feature #20860]

Language changes

  • String literals in files without a frozen_string_literal comment now emit a deprecation warning when they are mutated. These warnings can be enabled with -W:deprecated or by setting Warning[:deprecated] = true. To disable this change, you can run Ruby with the --disable-frozen-string-literal command line argument. [Feature #20205]

  • Keyword splatting nil when calling methods is now supported. **nil is treated similarly to **{}, passing no keywords, and not calling any conversion methods. [Bug #20064]

  • Block passing is no longer allowed in index. [Bug #19918]

  • Keyword arguments are no longer allowed in index. [Bug #20218]

  • The toplevel name ::Ruby is reserved now, and the definition will be warned when Warning[:deprecated]. [Feature #20884]

Core classes updates

Note: We’re only listing notable updates of Core class.

  • Exception

    <ul>
      <li>
    

    Exception#set_backtrace now accepts an array of Thread::Backtrace::Location.
    Kernel#raise, Thread#raise and Fiber#raise also accept this new format. [Feature #13557]


  • GC

    <ul>
      <li>
        <p><code class="language-plaintext highlighter-rouge">GC.config</code> added to allow setting configuration variables on the Garbage
    

    Collector. [Feature #20443]




  • GC configuration parameter rgengc_allow_full_mark introduced. When false
    GC will only mark young objects. Default is true. [Feature #20443]



  • Ractor

    <ul>
      <li>
        <p><code class="language-plaintext highlighter-rouge">require</code> in Ractor is allowed. The requiring process will be run on
    

    the main Ractor.
    Ractor._require(feature) is added to run requiring process on the
    main Ractor.
    [Feature #20627]




  • Ractor.main? is added. [Feature #20627]




  • Ractor.[] and Ractor.[]= are added to access the ractor local storage
    of the current Ractor. [Feature #20715]




  • Ractor.store_if_absent(key){ init } is added to initialize ractor local
    variables in thread-safty. [Feature #20875]



  • Range

    <ul>
      <li>
    

    Range#size now raises TypeError if the range is not iterable. [Misc #18984]


  • Standard Library updates

    Note: We’re only listing notable updates of Standard librarires.

    • RubyGems
      • Add --attestation option to gem push. It enabled to store signature to sigstore.dev
    • Bundler
      • Add a lockfile_checksums configuration to include checksums in fresh lockfiles
      • Add bundle lock --add-checksums to add checksums to an existing lockfile
    • JSON

      <ul>
        <li>Performance improvements of <code class="language-plaintext highlighter-rouge">JSON.parse</code> about 1.5 times faster than json-2.7.x.</li>
      </ul>
      
    • Tempfile

      <ul>
        <li>The keyword argument <code class="language-plaintext highlighter-rouge">anonymous: true</code> is implemented for Tempfile.create.
      

      Tempfile.create(anonymous: true) removes the created temporary file immediately.
      So applications don’t need to remove the file.
      [Feature #20497]


  • win32/sspi.rb

    <ul>
      <li>This library is now extracted from the Ruby repository to <a href="https://bounce.depfu.com/github.com/ruby/net-http-sspi">ruby/net-http-sspi</a>.
    

    [Feature #20775]


  • Compatibility issues

    Note: Excluding feature bug fixes.

    • Error messages and backtrace displays have been changed.
      • Use a single quote instead of a backtick as a opening quote. [Feature #16495]
      • Display a class name before a method name (only when the class has a permanent name). [Feature #19117]
      • Kernel#caller, Thread::Backtrace::Location’s methods, etc. are also changed accordingly.
      <div class="language-plaintext highlighter-rouge">
      
      Old:
      test.rb:1:in `foo': undefined method `time' for an instance of Integer
              from test.rb:2:in `<main>'
      

      New:
      test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
      from test.rb:2:in '<main>'

    • Hash#inspect rendering have been changed. [[Bug #20433]]

      <ul>
        <li>Symbol keys are displayed using the modern symbol key syntax: <code class="language-plaintext highlighter-rouge">"{user: 1}"</code>
      
    • Other keys now have spaces around =>: '{"user" => 1}', while previously they didn’t: '{"user"=>1}'
  • Kernel#Float() now accepts a decimal string with decimal part omitted. [Feature #20705]

    <div class="language-rb highlighter-rouge">
    
    Float("1.")    #=> 1.0 (previously, an ArgumentError was raised)
    Float("1.E-1") #=> 0.1 (previously, an ArgumentError was raised)
    
  • String#to_f now accepts a decimal string with decimal part omitted. Note that the result changes when an exponent is specified. [Feature #20705]

    <div class="language-rb highlighter-rouge">
    
    "1.".to_f    #=> 1.0
    "1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
    
  • Refinement#refined_class has been removed. [Feature #19714]
  • Standard library compatibility issues

    • DidYouMean

      <ul>
        <li>
      

      DidYouMean::SPELL_CHECKERS[]= and DidYouMean::SPELL_CHECKERS.merge! are removed.


  • Net::HTTP

    <ul>
      <li>Removed the following deprecated constants:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTP::ProxyMod</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::NetPrivate::HTTPRequest</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPInformationCode</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPSuccessCode</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPRedirectionCode</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPRetriableCode</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPClientErrorCode</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPFatalErrorCode</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPServerErrorCode</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPResponseReceiver</code></li>
          <li><code class="language-plaintext highlighter-rouge">Net::HTTPResponceReceiver</code></li>
        </ul>
    
        <p>These constants were deprecated from 2012.</p>
      </li>
    </ul>
    
  • Timeout

    <ul>
      <li>Reject negative values for Timeout.timeout. [<a href="https://bugs.ruby-lang.org/issues/20795">Bug #20795</a>]</li>
    </ul>
    
  • URI

    <ul>
      <li>Switched default parser to RFC 3986 compliant from RFC 2396 compliant.
    

    [Bug #19266]


  • C API updates

    • rb_newobj and rb_newobj_of (and corresponding macros RB_NEWOBJ, RB_NEWOBJ_OF, NEWOBJ, NEWOBJ_OF) have been removed. [Feature #20265]
    • Removed deprecated function rb_gc_force_recycle. [Feature #18290]

    Miscellaneous changes

    • Passing a block to a method which doesn’t use the passed block will show a warning on verbose mode (-w). [Feature #15554]

    • Redefining some core methods that are specially optimized by the interpeter and JIT like String.freeze or Integer#+ now emits a performance class warning (-W:performance or Warning[:performance] = true). [Feature #20429]

    See NEWS or commit logs for more details.

    With those changes, 4942 files changed, 202244 insertions(+), 255528 deletions(-) since Ruby 3.3.0!

    Merry Christmas, Happy Holidays, and enjoy programming with Ruby 3.4!


    All Depfu comment commands
    @​depfu refresh
    Rebases against your default branch and redoes this update
    @​depfu recreate
    Recreates this PR, overwriting any edits that you've made to it
    @​depfu merge
    Merges this PR once your tests are passing and conflicts are resolved
    @​depfu close
    Closes this PR and deletes the branch
    @​depfu reopen
    Restores the branch and reopens this PR (if it's closed)
    @​depfu pause
    Pauses all engine updates and closes this PR

    @depfu depfu bot added the depfu label Dec 27, 2024
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    0 participants