ruby/NEWS.md
Étienne Barrié 12be40ae6b Implement chilled strings
[Feature #20205]

As a path toward enabling frozen string literals by default in the future,
this commit introduce "chilled strings". From a user perspective chilled
strings pretend to be frozen, but on the first attempt to mutate them,
they lose their frozen status and emit a warning rather than to raise a
`FrozenError`.

Implementation wise, `rb_compile_option_struct.frozen_string_literal` is
no longer a boolean but a tri-state of `enabled/disabled/unset`.

When code is compiled with frozen string literals neither explictly enabled
or disabled, string literals are compiled with a new `putchilledstring`
instruction. This instruction is identical to `putstring` except it marks
the String with the `STR_CHILLED (FL_USER3)` and `FL_FREEZE` flags.

Chilled strings have the `FL_FREEZE` flag as to minimize the need to check
for chilled strings across the codebase, and to improve compatibility with
C extensions.

Notes:
  - `String#freeze`: clears the chilled flag.
  - `String#-@`: acts as if the string was mutable.
  - `String#+@`: acts as if the string was mutable.
  - `String#clone`: copies the chilled flag.

Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
2024-03-19 09:26:49 +01:00

3.5 KiB

NEWS 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

  • String literals in files without a frozen_string_literal comment now behave as if they were frozen. If they are mutated a deprecation warning is emited. 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]

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

  • Keyword splatting nil when calling methods is now supported. **nil is treated similar 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]

Core classes updates

Note: We're only listing outstanding class updates.

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

Stdlib updates

The following default gems are updated.

  • RubyGems 3.6.0.dev
  • bundler 2.6.0.dev
  • erb 4.0.4
  • fiddle 1.1.3
  • io-console 0.7.2
  • irb 1.12.0
  • net-http 0.4.1
  • prism 0.24.0
  • reline 0.4.3
  • resolv 0.4.0
  • stringio 3.1.1
  • strscan 3.1.1

The following bundled gems are updated.

  • minitest 5.22.3
  • test-unit 3.6.2
  • net-ftp 0.3.4
  • net-imap 0.4.10
  • net-smtp 0.4.0.1
  • rbs 3.4.4
  • typeprof 0.21.11
  • debug 1.9.1

The following bundled gems are promoted from default gems.

  • mutex_m 0.2.0
  • getoptlong 0.2.1
  • base64 0.2.0
  • bigdecimal 3.1.7
  • observer 0.1.2
  • abbrev 0.1.2
  • resolv-replace 0.1.1
  • rinda 0.2.0
  • drb 2.2.1
  • nkf 0.2.0
  • syslog 0.1.2
  • csv 3.2.8

See GitHub releases like GitHub Releases of Logger or changelog for details of the default gems or bundled gems.

Supported platforms

Compatibility issues

  • 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.
    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>'
    

Stdlib compatibility issues

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

Implementation improvements

  • Array#each is rewritten in Ruby for better performance [Feature #20182].

JIT