This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add Zefram as our release manager victim for 20 December
[perl5.git] / doop.c
diff --git a/doop.c b/doop.c
index c43ecb1..903144c 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -635,7 +635,7 @@ Perl_do_trans(pTHX_ SV *sv)
         if (SvIsCOW(sv))
             sv_force_normal_flags(sv, 0);
         if (SvREADONLY(sv))
-            Perl_croak(aTHX_ "%s", PL_no_modify);
+            Perl_croak_no_modify(aTHX);
     }
     (void)SvPV_const(sv, len);
     if (!len)
@@ -1017,7 +1017,7 @@ Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
            sv_force_normal_flags(sv, 0);
         }
         if (SvREADONLY(sv))
-            Perl_croak(aTHX_ "%s", PL_no_modify);
+            Perl_croak_no_modify(aTHX);
     }
 
     if (PL_encoding && !SvUTF8(sv)) {
@@ -1103,7 +1103,7 @@ Perl_do_chomp(pTHX_ register SV *sv)
            sv_force_normal_flags(sv, 0);
         }
         if (SvREADONLY(sv))
-            Perl_croak(aTHX_ "%s", PL_no_modify);
+            Perl_croak_no_modify(aTHX);
     }
 
     if (PL_encoding) {
@@ -1456,32 +1456,26 @@ Perl_do_kv(pTHX)
        RETURN;
 
     if (gimme == G_SCALAR) {
-       IV i;
-       dTARGET;
-
        if (PL_op->op_flags & OPf_MOD || LVRET) {       /* lvalue */
-           if (SvTYPE(TARG) < SVt_PVLV) {
-               sv_upgrade(TARG, SVt_PVLV);
-               sv_magic(TARG, NULL, PERL_MAGIC_nkeys, NULL, 0);
-           }
-           LvTYPE(TARG) = 'k';
-           if (LvTARG(TARG) != (const SV *)keys) {
-               SvREFCNT_dec(LvTARG(TARG));
-               LvTARG(TARG) = SvREFCNT_inc_simple(keys);
-           }
-           PUSHs(TARG);
-           RETURN;
-       }
-
-       if (! SvTIED_mg((const SV *)keys, PERL_MAGIC_tied) )
-       {
-           i = HvKEYS(keys);
+           SV * const ret = sv_2mortal(newSV_type(SVt_PVLV));  /* Not TARG RT#67838 */
+           sv_magic(ret, NULL, PERL_MAGIC_nkeys, NULL, 0);
+           LvTYPE(ret) = 'k';
+           LvTARG(ret) = SvREFCNT_inc_simple(keys);
+           PUSHs(ret);
        }
        else {
-           i = 0;
-           while (hv_iternext(keys)) i++;
+           IV i;
+           dTARGET;
+
+           if (! SvTIED_mg((const SV *)keys, PERL_MAGIC_tied) ) {
+               i = HvKEYS(keys);
+           }
+           else {
+               i = 0;
+               while (hv_iternext(keys)) i++;
+           }
+           PUSHi( i );
        }
-       PUSHi( i );
        RETURN;
     }