diff --git a/io.c b/io.c index e388e384c1..03209f752b 100644 --- a/io.c +++ b/io.c @@ -13288,8 +13288,8 @@ Init_IO(void) rb_gc_register_mark_object(rb_default_rs); rb_rs = rb_default_rs; rb_output_rs = Qnil; - rb_define_hooked_variable("$/", &rb_rs, 0, rb_str_setter); - rb_define_hooked_variable("$-0", &rb_rs, 0, rb_str_setter); + rb_define_hooked_variable("$/", &rb_rs, 0, deprecated_str_setter); + rb_define_hooked_variable("$-0", &rb_rs, 0, deprecated_str_setter); rb_define_hooked_variable("$\\", &rb_output_rs, 0, deprecated_str_setter); rb_define_virtual_variable("$_", get_LAST_READ_LINE, set_LAST_READ_LINE); diff --git a/spec/ruby/core/io/puts_spec.rb b/spec/ruby/core/io/puts_spec.rb index 3e4b877b7f..be220c4035 100644 --- a/spec/ruby/core/io/puts_spec.rb +++ b/spec/ruby/core/io/puts_spec.rb @@ -16,7 +16,7 @@ describe "IO#puts" do ScratchPad.clear @io.close if @io rm_r @name - $/ = @before_separator + suppress_warning {$/ = @before_separator} end it "writes just a newline when given no args" do @@ -105,7 +105,7 @@ describe "IO#puts" do end it "ignores the $/ separator global" do - $/ = ":" + suppress_warning {$/ = ":"} @io.puts(5).should == nil ScratchPad.recorded.should == "5\n" end diff --git a/spec/ruby/core/io/readlines_spec.rb b/spec/ruby/core/io/readlines_spec.rb index 0d4f002972..eb99eb8d3a 100644 --- a/spec/ruby/core/io/readlines_spec.rb +++ b/spec/ruby/core/io/readlines_spec.rb @@ -22,11 +22,11 @@ describe "IO#readlines" do describe "when passed no arguments" do before :each do - @sep, $/ = $/, " " + suppress_warning {@sep, $/ = $/, " "} end after :each do - $/ = @sep + suppress_warning {$/ = @sep} end it "returns an Array containing lines based on $/" do @@ -184,7 +184,7 @@ describe "IO.readlines" do after :each do Encoding.default_external = @external Encoding.default_internal = @internal - $/ = @dollar_slash + suppress_warning {$/ = @dollar_slash} end it "encodes lines using the default external encoding" do @@ -196,7 +196,7 @@ describe "IO.readlines" do it "encodes lines using the default internal encoding, when set" do Encoding.default_external = Encoding::UTF_8 Encoding.default_internal = Encoding::UTF_16 - $/ = $/.encode Encoding::UTF_16 + suppress_warning {$/ = $/.encode Encoding::UTF_16} lines = IO.readlines(@name) lines.all? { |s| s.encoding == Encoding::UTF_16 }.should be_true end diff --git a/spec/ruby/core/io/shared/each.rb b/spec/ruby/core/io/shared/each.rb index 0b2dfa3548..91766fbe03 100644 --- a/spec/ruby/core/io/shared/each.rb +++ b/spec/ruby/core/io/shared/each.rb @@ -168,12 +168,12 @@ describe :io_each_default_separator, shared: true do before :each do @io = IOSpecs.io_fixture "lines.txt" ScratchPad.record [] - @sep, $/ = $/, " " + suppress_warning {@sep, $/ = $/, " "} end after :each do @io.close if @io - $/ = @sep + suppress_warning {$/ = @sep} end it "uses $/ as the default line separator" do diff --git a/spec/ruby/core/io/shared/readlines.rb b/spec/ruby/core/io/shared/readlines.rb index de803f42e5..339684a5d4 100644 --- a/spec/ruby/core/io/shared/readlines.rb +++ b/spec/ruby/core/io/shared/readlines.rb @@ -60,11 +60,11 @@ describe :io_readlines_options_19, shared: true do end after :each do - $/ = @sep + suppress_warning {$/ = @sep} end it "defaults to $/ as the separator" do - $/ = " " + suppress_warning {$/ = " "} result = IO.send(@method, @name, 10, &@object) (result ? result : ScratchPad.recorded).should == IOSpecs.lines_space_separator_limit end diff --git a/spec/ruby/core/kernel/fixtures/classes.rb b/spec/ruby/core/kernel/fixtures/classes.rb index 2f2bbf1b23..623b45ca34 100644 --- a/spec/ruby/core/kernel/fixtures/classes.rb +++ b/spec/ruby/core/kernel/fixtures/classes.rb @@ -49,7 +49,7 @@ module KernelSpecs def self.chomp(str, method, sep="\n") code = "$_ = #{str.inspect}; $/ = #{sep.inspect}; #{method}; print $_" - IO.popen([*ruby_exe, "-n", "-e", code], "r+") do |io| + IO.popen([*ruby_exe, "-W0", "-n", "-e", code], "r+") do |io| io.puts io.close_write io.read diff --git a/spec/ruby/core/kernel/warn_spec.rb b/spec/ruby/core/kernel/warn_spec.rb index b0672997f6..774f4378ad 100644 --- a/spec/ruby/core/kernel/warn_spec.rb +++ b/spec/ruby/core/kernel/warn_spec.rb @@ -8,8 +8,9 @@ describe "Kernel#warn" do end after :each do - $VERBOSE = @before_verbose + $VERBOSE = nil $/ = @before_separator + $VERBOSE = @before_verbose end it "is a private method" do diff --git a/spec/ruby/core/string/chomp_spec.rb b/spec/ruby/core/string/chomp_spec.rb index 20a0925959..a893bf7759 100644 --- a/spec/ruby/core/string/chomp_spec.rb +++ b/spec/ruby/core/string/chomp_spec.rb @@ -6,11 +6,13 @@ describe "String#chomp" do describe "when passed no argument" do before do # Ensure that $/ is set to the default value + @verbose, $VERBOSE = $VERBOSE, nil @dollar_slash, $/ = $/, "\n" end after do $/ = @dollar_slash + $VERBOSE = @verbose end it "does not modify a String with no trailing carriage return or newline" do @@ -179,11 +181,13 @@ describe "String#chomp!" do describe "when passed no argument" do before do # Ensure that $/ is set to the default value + @verbose, $VERBOSE = $VERBOSE, nil @dollar_slash, $/ = $/, "\n" end after do $/ = @dollar_slash + $VERBOSE = @verbose end it "modifies self" do @@ -350,11 +354,13 @@ end describe "String#chomp" do before :each do + @verbose, $VERBOSE = $VERBOSE, nil @before_separator = $/ end after :each do $/ = @before_separator + $VERBOSE = @verbose end it "does not modify a multi-byte character" do @@ -379,11 +385,13 @@ end describe "String#chomp!" do before :each do + @verbose, $VERBOSE = $VERBOSE, nil @before_separator = $/ end after :each do $/ = @before_separator + $VERBOSE = @verbose end it "returns nil when the String is not modified" do diff --git a/spec/ruby/core/string/shared/each_line.rb b/spec/ruby/core/string/shared/each_line.rb index 843b123f57..d8c48054c4 100644 --- a/spec/ruby/core/string/shared/each_line.rb +++ b/spec/ruby/core/string/shared/each_line.rb @@ -84,7 +84,7 @@ describe :string_each_line, shared: true do end after :each do - $/ = @before_separator + suppress_warning {$/ = @before_separator} end it "as the separator when none is given" do @@ -96,10 +96,10 @@ describe :string_each_line, shared: true do expected = [] str.send(@method, sep) { |x| expected << x } - $/ = sep + suppress_warning {$/ = sep} actual = [] - str.send(@method) { |x| actual << x } + suppress_warning {str.send(@method) { |x| actual << x }} actual.should == expected end diff --git a/spec/ruby/language/predefined_spec.rb b/spec/ruby/language/predefined_spec.rb index 6f902eb822..e9fce1c358 100644 --- a/spec/ruby/language/predefined_spec.rb +++ b/spec/ruby/language/predefined_spec.rb @@ -541,6 +541,7 @@ $stdout IO The current standard output. Assignment to $std describe "Predefined global $/" do before :each do + @verbose, $VERBOSE = $VERBOSE, nil @dollar_slash = $/ @dollar_dash_zero = $-0 end @@ -548,6 +549,7 @@ describe "Predefined global $/" do after :each do $/ = @dollar_slash $-0 = @dollar_dash_zero + $VERBOSE = @verbose end it "can be assigned a String" do @@ -589,6 +591,7 @@ end describe "Predefined global $-0" do before :each do + @verbose, $VERBOSE = $VERBOSE, nil @dollar_slash = $/ @dollar_dash_zero = $-0 end @@ -596,6 +599,7 @@ describe "Predefined global $-0" do after :each do $/ = @dollar_slash $-0 = @dollar_dash_zero + $VERBOSE = @verbose end it "can be assigned a String" do diff --git a/spec/ruby/library/stringio/gets_spec.rb b/spec/ruby/library/stringio/gets_spec.rb index 69880672a3..97429e6a29 100644 --- a/spec/ruby/library/stringio/gets_spec.rb +++ b/spec/ruby/library/stringio/gets_spec.rb @@ -76,12 +76,13 @@ describe "StringIO#gets when passed no argument" do @io.gets.should == "this is\n" begin - old_sep, $/ = $/, " " + old_sep = $/ + suppress_warning {$/ = " "} @io.gets.should == "an " @io.gets.should == "example\nfor " @io.gets.should == "StringIO#gets" ensure - $/ = old_sep + suppress_warning {$/ = old_sep} end end diff --git a/spec/ruby/library/stringio/readline_spec.rb b/spec/ruby/library/stringio/readline_spec.rb index 9af633472e..94b67bc92d 100644 --- a/spec/ruby/library/stringio/readline_spec.rb +++ b/spec/ruby/library/stringio/readline_spec.rb @@ -64,12 +64,13 @@ describe "StringIO#readline when passed no argument" do @io.readline.should == "this is\n" begin - old_sep, $/ = $/, " " + old_sep = $/ + suppress_warning {$/ = " "} @io.readline.should == "an " @io.readline.should == "example\nfor " @io.readline.should == "StringIO#readline" ensure - $/ = old_sep + suppress_warning {$/ = old_sep} end end diff --git a/spec/ruby/library/stringio/readlines_spec.rb b/spec/ruby/library/stringio/readlines_spec.rb index 7f9f9f5846..4b007787e2 100644 --- a/spec/ruby/library/stringio/readlines_spec.rb +++ b/spec/ruby/library/stringio/readlines_spec.rb @@ -51,10 +51,11 @@ describe "StringIO#readlines when passed no argument" do it "returns an Array containing lines based on $/" do begin - old_sep, $/ = $/, " " + old_sep = $/; + suppress_warning {$/ = " "} @io.readlines.should == ["this ", "is\nan ", "example\nfor ", "StringIO#readlines"] ensure - $/ = old_sep + suppress_warning {$/ = old_sep} end end diff --git a/spec/ruby/library/stringio/shared/each.rb b/spec/ruby/library/stringio/shared/each.rb index c08d40344c..14b0a013b3 100644 --- a/spec/ruby/library/stringio/shared/each.rb +++ b/spec/ruby/library/stringio/shared/each.rb @@ -71,11 +71,12 @@ describe :stringio_each_no_arguments, shared: true do it "uses $/ as the default line separator" do seen = [] begin - old_rs, $/ = $/, " " + old_rs = $/ + suppress_warning {$/ = " "} @io.send(@method) {|s| seen << s } seen.should eql(["a ", "b ", "c ", "d ", "e\n1 ", "2 ", "3 ", "4 ", "5"]) ensure - $/ = old_rs + suppress_warning {$/ = old_rs} end end diff --git a/spec/ruby/optional/capi/globals_spec.rb b/spec/ruby/optional/capi/globals_spec.rb index ffc579023d..1e8ab0938f 100644 --- a/spec/ruby/optional/capi/globals_spec.rb +++ b/spec/ruby/optional/capi/globals_spec.rb @@ -59,7 +59,7 @@ describe "CApiGlobalSpecs" do end after :each do - $/ = @dollar_slash + suppress_warning {$/ = @dollar_slash} end it "returns \\n by default" do @@ -67,7 +67,7 @@ describe "CApiGlobalSpecs" do end it "returns the value of $/" do - $/ = "foo" + suppress_warning {$/ = "foo"} @f.rb_rs.should == "foo" end end diff --git a/string.c b/string.c index 28a1b293d6..0607726a07 100644 --- a/string.c +++ b/string.c @@ -8245,6 +8245,21 @@ chomp_newline(const char *p, const char *e, rb_encoding *enc) return e; } +static VALUE +get_rs(void) +{ + VALUE rs = rb_rs; + if (!NIL_P(rs) && + (!RB_TYPE_P(rs, T_STRING) || + RSTRING_LEN(rs) != 1 || + RSTRING_PTR(rs)[0] != '\n')) { + rb_warn("$/ is set to non-default value"); + } + return rs; +} + +#define rb_rs get_rs() + static VALUE rb_str_enumerate_lines(int argc, VALUE *argv, VALUE str, VALUE ary) { diff --git a/test/openssl/test_pair.rb b/test/openssl/test_pair.rb index e9cf98df15..a77abfd923 100644 --- a/test/openssl/test_pair.rb +++ b/test/openssl/test_pair.rb @@ -160,10 +160,10 @@ module OpenSSL::TestPairM ssl_pair {|s1, s2| begin old = $/ - $/ = '*' + EnvUtil.suppress_warning {$/ = '*'} s1.puts 'a' ensure - $/ = old + EnvUtil.suppress_warning {$/ = old} end s1.close assert_equal("a\n", s2.read) diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb index f0b765314c..5274097626 100644 --- a/test/ruby/test_string.rb +++ b/test/ruby/test_string.rb @@ -387,6 +387,8 @@ CODE end def test_chomp + verbose, $VERBOSE = $VERBOSE, nil + assert_equal(S("hello"), S("hello").chomp("\n")) assert_equal(S("hello"), S("hello\n").chomp("\n")) save = $/ @@ -452,9 +454,12 @@ CODE assert_equal("foo", s.chomp("\n")) ensure $/ = save + $VERBOSE = verbose end def test_chomp! + verbose, $VERBOSE = $VERBOSE, nil + a = S("hello") a.chomp!(S("\n")) @@ -511,6 +516,7 @@ CODE s = S("").freeze assert_raise_with_message(FrozenError, /frozen/) {s.chomp!} + $VERBOSE = nil # EnvUtil.suppress_warning resets $VERBOSE to the original state s = S("ax") o = Struct.new(:s).new(s) @@ -519,6 +525,7 @@ CODE "x" end assert_raise_with_message(FrozenError, /frozen/) {s.chomp!(o)} + $VERBOSE = nil # EnvUtil.suppress_warning resets $VERBOSE to the original state s = S("hello") assert_equal("hel", s.chomp!('lo')) @@ -569,6 +576,7 @@ CODE assert_equal("foo", s.chomp!("\n")) ensure $/ = save + $VERBOSE = verbose end def test_chop @@ -859,6 +867,8 @@ CODE end def test_each + verbose, $VERBOSE = $VERBOSE, nil + save = $/ $/ = "\n" res=[] @@ -878,6 +888,7 @@ CODE assert_equal(S("world"), res[1]) ensure $/ = save + $VERBOSE = verbose end def test_each_byte @@ -1055,6 +1066,8 @@ CODE end def test_each_line + verbose, $VERBOSE = $VERBOSE, nil + save = $/ $/ = "\n" res=[] @@ -1101,6 +1114,7 @@ CODE end ensure $/ = save + $VERBOSE = verbose end def test_each_line_chomp