mirror of
https://github.com/ruby/ruby.git
synced 2025-08-24 21:44:30 +02:00
![]() [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> |
||
---|---|---|
.. | ||
.document | ||
assembler.rb | ||
block.rb | ||
branch_stub.rb | ||
c_pointer.rb | ||
c_type.rb | ||
code_block.rb | ||
compiler.rb | ||
context.rb | ||
entry_stub.rb | ||
exit_compiler.rb | ||
hooks.rb | ||
insn_compiler.rb | ||
invariants.rb | ||
jit_state.rb | ||
stats.rb | ||
type.rb |