Skip to content

Ruby 3.4 support #3883

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

Open
13 of 46 tasks
eregon opened this issue May 27, 2025 · 0 comments
Open
13 of 46 tasks

Ruby 3.4 support #3883

eregon opened this issue May 27, 2025 · 0 comments

Comments

@eregon
Copy link
Member

eregon commented May 27, 2025

Any help is appreciated whether it is:

  • implementing one of the Ruby 3.4 changes in TruffleRuby, and ensuring it is tested in specs or MRI tests and otherwise add specs. If adding specs please leave a comment here to mention you are working on adding these specs to avoid conflicts & duplicated work.
  • adding specs for Ruby 3.4 changes, which is best done in ruby/spec directly, see Write specs for new Ruby 3.4 features and changes ruby/spec#1265

To make it easier to find good getting-started issues, I annotated items with easy, medium and hard.
There is also pure ruby for changes which should only affect Ruby code and not require any change to Java sources or any Java knowledge.
If there is no pure ruby then some Java code is involved, but it should still be fairly straightforward if easy or medium.
hard typically requires more knowledge about TruffleRuby implementation details.
[import] means this needs the import of Ruby 3.4 sources to happen first.

If you'd like to start on some task please mention it here or edit the description directly for committers (to avoid duplicated work).

Notes:

  • Ractor & RubyVM related changes are removed since they are CRuby-specific.
  • Added non-performance warnings are usually skipped since it is rarely worth the effort and often gone in the next version

Full list of changes for Ruby 3.4.0

This document is a list of user-visible feature changes
since the 3.3.0 release, except for bug fixes.

Note that each entry is kept to a minimum, see links for details.

Language changes

  • it is added to reference a block parameter. [Feature #18980]

  • 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]

    • String#+@ now duplicates when mutating the string would emit
      a deprecation warning, offered as a replacement for the
      str.dup if str.frozen? pattern.
  • 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 assignment
    (e.g. a[0, &b] = 1). [Bug #19918]

  • Keyword arguments are no longer allowed in index assignment
    (e.g. a[0, kw: 1] = 2). [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 outstanding class updates.

Array

Exception

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

Fiber::Scheduler

  • An optional Fiber::Scheduler#blocking_operation_wait hook allows blocking operations to be moved out of the
    event loop in order to reduce latency and improve multi-core processor utilization. [Feature #20876]

GC

  • GC.config 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]

Hash

  • Hash.new now accepts an optional capacity: argument, to preallocate the hash with a given capacity.
    This can improve performance when building large hashes incrementally by saving on reallocation and
    rehashing of keys. [Feature #19236]

IO::Buffer

  • IO::Buffer#copy can release the GVL, allowing other threads to run while copying data. [Feature #20902]

Integer

  • Integer#** used to return Float::INFINITY when the return value is large, but now returns an Integer.
    If the return value is extremely large, it raises an exception.
    [Feature #20811]

MatchData

  • MatchData#bytebegin and MatchData#byteend have been added. [Feature #20576]

Object

  • Object#singleton_method now returns methods in modules prepended to or included in the
    receiver's singleton class. [Bug #20620]

      ```rb
      o = Object.new
      o.extend(Module.new{def a = 1})
      o.singleton_method(:a).call #=> 1
      ```
    

Range

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

  • Range#step now consistently has a semantics of iterating by using + operator
    for all types, not only numerics. [Feature #18368]

      ```ruby
      (Time.utc(2022, 2, 24)..).step(24*60*60).take(3)
      #=> [2022-02-24 00:00:00 UTC, 2022-02-25 00:00:00 UTC, 2022-02-26 00:00:00 UTC]
      ```
    

Rational

  • Rational#** used to return Float::INFINITY or Float::NAN
    when the numerator of the return value is large, but now returns an Rational.
    If it is extremely large, it raises an exception. [Feature #20811]

String

  • String#append_as_bytes was added to more easily and efficiently work with binary buffers and protocols.
    It directly concatenate the arguments into the string without any encoding validation or conversion.
    [Feature #20594]

Symbol

  • The string returned by Symbol#to_s now emits a deprecation warning when mutated, and will be
    frozen in a future version of Ruby.
    These warnings can be enabled with -W:deprecated or by setting Warning[:deprecated] = true.
    [Feature #20350]

Time

  • On Windows, now Time#zone encodes the system timezone name in UTF-8
    instead of the active code page, if it contains non-ASCII characters.
    [Bug #20929]

  • Time#xmlschema, and its Time#iso8601 alias have been moved into the core Time
    class while previously it was an extension provided by the time gem. [Feature #20707]

Warning

  • Add Warning.categories method which returns a list of possible warning categories.
    [Feature #20293]

Stdlib updates

We only list stdlib changes that are notable feature changes.

RubyGems

  • Add --attestation option to gem push. It enabled to store signature of build artifact 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

  • Performance improvements JSON.parse about 1.5 times faster than json-2.7.x.

Tempfile

  • The keyword argument anonymous: true 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

Socket

  • Socket::ResolutionError and Socket::ResolutionError#error_code was added.
    [Feature #20018]

IRB

  • Interactive method completion is now improved with type information by default.
    [Feature #20778]

Compatibility issues

  • Error messages and backtrace displays have been changed.

    • Use a single quote instead of a backtick as an opening quote. [Feature #16495]

    • Display a class name before a method name (only when the class has a permanent name). [Feature #19117]

    • Extra rescue/ensure frames are no longer available on the backtrace. [Feature #20275]

    • Kernel#caller, Thread::Backtrace::Location’s methods, etc. are also changed accordingly.

      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]

    • Symbol keys are displayed using the modern symbol key syntax: "{user: 1}"
    • 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]

    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. [Feature #20705]
    Note that the result changes when an exponent is specified.

    "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]

Stdlib compatibility issues

DidYouMean

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

Net::HTTP

  • Removed the following deprecated constants:
    * Net::HTTP::ProxyMod
    * Net::NetPrivate::HTTPRequest
    * Net::HTTPInformationCode
    * Net::HTTPSuccessCode
    * Net::HTTPRedirectionCode
    * Net::HTTPRetriableCode
    * Net::HTTPClientErrorCode
    * Net::HTTPFatalErrorCode
    * Net::HTTPServerErrorCode
    * Net::HTTPResponseReceiver
    * Net::HTTPResponceReceiver

    These constants were deprecated from 2012.
    

Timeout

  • Reject negative values for Timeout.timeout. [Bug #20795]

URI

  • 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]

Implementation improvements

  • Happy Eyeballs version 2 (RFC8305), an algorithm that ensures faster and more reliable connections
    by attempting IPv6 and IPv4 concurrently, is used in Socket.tcp and TCPSocket.new.
    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.
    [Feature #20108] [Feature #20782]

Miscellaneous changes

  • Passing a block to a method which doesn't use the passed block will show
    a warning on verbose mode (-w).
    In connection with this, a new strict_unused_block warning category was introduced.
    Turn them on with -W:strict_unused_block or Warning[:strict_unused_block] = true.
    [Feature #15554]

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Development

No branches or pull requests

1 participant