summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'string.c')
-rw-r--r--string.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/string.c b/string.c
index 27d51e46e3..d5de27864f 100644
--- a/string.c
+++ b/string.c
@@ -1313,11 +1313,13 @@ rb_f_sub(argc, argv)
int argc;
VALUE *argv;
{
- VALUE str = rb_str_dup(uscore_get());
+ VALUE str = uscore_get();
+ VALUE dup = rb_str_dup(str);
- rb_str_sub_bang(argc, argv, str);
- rb_lastline_set(str);
- return str;
+ if (NIL_P(rb_str_sub_bang(argc, argv, dup)))
+ return str;
+ rb_lastline_set(dup);
+ return dup;
}
static VALUE
@@ -1333,11 +1335,13 @@ rb_f_gsub(argc, argv)
int argc;
VALUE *argv;
{
- VALUE str = rb_str_dup(uscore_get());
+ VALUE str = uscore_get();
+ VALUE dup = rb_str_dup(str);
- rb_str_gsub_bang(argc, argv, str);
- rb_lastline_set(str);
- return str;
+ if (NIL_P(rb_str_gsub_bang(argc, argv, dup)))
+ return str;
+ rb_lastline_set(dup);
+ return dup;
}
static VALUE
@@ -2356,10 +2360,13 @@ rb_f_chop_bang(str)
static VALUE
rb_f_chop()
{
- VALUE str = rb_str_dup(uscore_get());
+ VALUE str = uscore_get();
- rb_str_chop_bang(str);
- rb_lastline_set(str);
+ if (RSTRING(str)->len > 0) {
+ str = rb_str_dup(str);
+ rb_str_chop_bang(str);
+ rb_lastline_set(str);
+ }
return str;
}
@@ -2432,11 +2439,13 @@ rb_f_chomp(argc, argv)
int argc;
VALUE *argv;
{
- VALUE str = rb_str_dup(uscore_get());
+ VALUE str = uscore_get();
+ VALUE dup = rb_str_dup(str);
- rb_str_chomp_bang(argc, argv, str);
- rb_lastline_set(str);
- return str;
+ if (NIL_P(rb_str_chomp_bang(argc, argv, dup)))
+ return str;
+ rb_lastline_set(dup);
+ return dup;
}
static VALUE