do not return useless value from void-context substr
authorChip Salzenberg <chip@pobox.com>
Tue, 11 Oct 2011 01:59:42 +0000 (18:59 -0700)
committerChip Salzenberg <chip@pobox.com>
Tue, 11 Oct 2011 02:00:05 +0000 (19:00 -0700)
pp.c

diff --git a/pp.c b/pp.c
index 6d403ea..44219c3 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2971,6 +2971,7 @@ PP(pp_substr)
     IV     len_iv = 0;
     int    len_is_uv = 1;
     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
+    const bool rvalue = (GIMME_V != G_VOID);
     const char *tmps;
     SV *repl_sv = NULL;
     const char *repl = NULL;
@@ -3099,16 +3100,18 @@ PP(pp_substr)
            RETURN;
        }
 
-       SvTAINTED_off(TARG);                    /* decontaminate */
-       SvUTF8_off(TARG);                       /* decontaminate */
-
        tmps += byte_pos;
-       sv_setpvn(TARG, tmps, byte_len);
+
+       if (rvalue) {
+           SvTAINTED_off(TARG);                        /* decontaminate */
+           SvUTF8_off(TARG);                   /* decontaminate */
+           sv_setpvn(TARG, tmps, byte_len);
 #ifdef USE_LOCALE_COLLATE
-       sv_unmagic(TARG, PERL_MAGIC_collxfrm);
+           sv_unmagic(TARG, PERL_MAGIC_collxfrm);
 #endif
-       if (utf8_curlen)
-           SvUTF8_on(TARG);
+           if (utf8_curlen)
+               SvUTF8_on(TARG);
+       }
 
        if (repl) {
            SV* repl_sv_copy = NULL;
@@ -3128,8 +3131,10 @@ PP(pp_substr)
        }
     }
     SPAGAIN;
-    SvSETMAGIC(TARG);
-    PUSHs(TARG);
+    if (rvalue) {
+       SvSETMAGIC(TARG);
+       PUSHs(TARG);
+    }
     RETURN;
 
 bound_fail: