This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Stop -- from crashing on regexps
authorFather Chrysostomos <sprout@cpan.org>
Sat, 10 Aug 2013 17:01:06 +0000 (10:01 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 11 Aug 2013 17:53:34 +0000 (10:53 -0700)
I mean dereferenced regexps, as returned by ${ qr// }.

It was creating a corrupt SV by setting the IOK flag on something
of type SVt_REGEXP.

This is something I broke when I stopped regexps from being POK
in perl 5.18.0.

sv.c
t/op/inc.t

diff --git a/sv.c b/sv.c
index d69addc..c71c0f1 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -8449,8 +8449,6 @@ Perl_sv_dec_nomg(pTHX_ SV *const sv)
     if (!sv)
        return;
     if (SvTHINKFIRST(sv)) {
-       if (SvIsCOW(sv) || isGV_with_GP(sv))
-           sv_force_normal_flags(sv, 0);
        if (SvREADONLY(sv)) {
                Perl_croak_no_modify();
        }
@@ -8462,6 +8460,7 @@ Perl_sv_dec_nomg(pTHX_ SV *const sv)
            sv_unref(sv);
            sv_setiv(sv, i);
        }
+       else sv_force_normal_flags(sv, 0);
     }
     /* Unlike sv_inc we don't have to worry about string-never-numbers
        and keeping them magic. But we mustn't warn on punting */
index 4876ef1..2475b5e 100644 (file)
@@ -271,4 +271,8 @@ isnt(scalar eval { my $pvbm = PVBM; --$pvbm }, undef, "predecrement defined");
     }
 }
 
+$_ = ${qr //};
+$_--;
+is($_, -1, 'regexp--');
+
 done_testing();