Skip to content

Commit bc6f4b1

Browse files
etiennebarriebyroot
authored andcommitted
Freeze $/ and make it ractor safe
[Feature #21109] By always freezing when setting the global rb_rs variable, we can ensure it is not modified and can be accessed from a ractor. We're also making sure it's an instance of String and does not have any instance variables. Of course, if $/ is changed at runtime, it may cause surprising behavior but doing so is deprecated already anyway. Co-authored-by: Jean Boussier <[email protected]>
1 parent 84c507b commit bc6f4b1

File tree

2 files changed

+76
-8
lines changed

2 files changed

+76
-8
lines changed

command_line/dash_0_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
require_relative '../spec_helper'
2+
3+
describe "The -0 command line option" do
4+
it "sets $/ and $-0" do
5+
ruby_exe("puts $/, $-0", options: "-072").should == ":\n:\n"
6+
end
7+
8+
ruby_version_is "3.5" do
9+
it "sets $/ and $-0 as a frozen string" do
10+
ruby_exe("puts $/.frozen?, $-0.frozen?", options: "-072").should == "true\ntrue\n"
11+
end
12+
end
13+
end

language/predefined_spec.rb

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -559,12 +559,39 @@ def foo
559559
$VERBOSE = @verbose
560560
end
561561

562-
it "can be assigned a String" do
563-
str = "abc"
564-
$/ = str
565-
$/.should equal(str)
562+
ruby_version_is ""..."3.5" do
563+
it "can be assigned a String" do
564+
str = +"abc"
565+
$/ = str
566+
$/.should equal(str)
567+
end
566568
end
567569

570+
ruby_version_is "3.5" do
571+
it "makes a new frozen String from the assigned String" do
572+
string_subclass = Class.new(String)
573+
str = string_subclass.new("abc")
574+
str.instance_variable_set(:@ivar, 1)
575+
$/ = str
576+
$/.should.frozen?
577+
$/.should be_an_instance_of(String)
578+
$/.should_not.instance_variable_defined?(:@ivar)
579+
$/.should == str
580+
end
581+
582+
it "makes a new frozen String if it's not frozen" do
583+
str = +"abc"
584+
$/ = str
585+
$/.should.frozen?
586+
$/.should == str
587+
end
588+
589+
it "assigns the given String if it's frozen and has no instance variables" do
590+
str = "abc".freeze
591+
$/ = str
592+
$/.should equal(str)
593+
end
594+
end
568595
it "can be assigned nil" do
569596
$/ = nil
570597
$/.should be_nil
@@ -608,10 +635,38 @@ def foo
608635
$VERBOSE = @verbose
609636
end
610637

611-
it "can be assigned a String" do
612-
str = "abc"
613-
$-0 = str
614-
$-0.should equal(str)
638+
ruby_version_is ""..."3.5" do
639+
it "can be assigned a String" do
640+
str = +"abc"
641+
$-0 = str
642+
$-0.should equal(str)
643+
end
644+
end
645+
646+
ruby_version_is "3.5" do
647+
it "makes a new frozen String from the assigned String" do
648+
string_subclass = Class.new(String)
649+
str = string_subclass.new("abc")
650+
str.instance_variable_set(:@ivar, 1)
651+
$-0 = str
652+
$-0.should.frozen?
653+
$-0.should be_an_instance_of(String)
654+
$-0.should_not.instance_variable_defined?(:@ivar)
655+
$-0.should == str
656+
end
657+
658+
it "makes a new frozen String if it's not frozen" do
659+
str = +"abc"
660+
$-0 = str
661+
$-0.should.frozen?
662+
$-0.should == str
663+
end
664+
665+
it "assigns the given String if it's frozen and has no instance variables" do
666+
str = "abc".freeze
667+
$-0 = str
668+
$-0.should equal(str)
669+
end
615670
end
616671

617672
it "can be assigned nil" do

0 commit comments

Comments
 (0)