summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSoutaro Matsumoto <[email protected]>2020-09-11 14:34:10 +0900
committerGitHub <[email protected]>2020-09-11 14:34:10 +0900
commitf0ddbd502c1d6912cec9a91997966ba659e347c1 (patch)
treebabd8255e60b285492ffb440e6fa22755b64de69
parent0d78390bfb9d87ac7ee192115216882e09c50a06 (diff)
Let String#slice! return nil (#3533)
Returns `nil` instead of an empty string when non-integer number is given (to make it 2.7 compatible).
Notes
Notes: Merged-By: soutaro <[email protected]>
-rw-r--r--string.c5
-rw-r--r--test/ruby/test_string.rb2
2 files changed, 6 insertions, 1 deletions
diff --git a/string.c b/string.c
index 7cfeaae180..0c4e76a1a7 100644
--- a/string.c
+++ b/string.c
@@ -4961,7 +4961,10 @@ rb_str_slice_bang(int argc, VALUE *argv, VALUE str)
return Qnil;
case Qfalse:
beg = NUM2LONG(indx);
- goto num_index;
+ if (!(p = rb_str_subpos(str, beg, &len))) return Qnil;
+ if (!len) return Qnil;
+ beg = p - RSTRING_PTR(str);
+ goto subseq;
default:
goto num_index;
}
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index b2f0289b18..fde1c9cdc5 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -1588,8 +1588,10 @@ CODE
a = S("FooBar")
if @aref_slicebang_silent
assert_nil( a.slice!(6) )
+ assert_nil( a.slice!(6r) )
else
assert_raise(IndexError) { a.slice!(6) }
+ assert_raise(IndexError) { a.slice!(6r) }
end
assert_equal(S("FooBar"), a)