This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Assertion failure with $/=*foo; warn;
authorFather Chrysostomos <sprout@cpan.org>
Thu, 24 May 2012 06:24:35 +0000 (23:24 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 7 Jun 2012 15:18:50 +0000 (08:18 -0700)
commit2748e6020278d4118252bc18ecc0db56ef04a973
tree529616eb60cc17a73e228e20231e4385f61c7e3d
parente654efc25137667e687e787a95f6c53aa0ed69e1
Assertion failure with $/=*foo; warn;

$ ./perl -Ilib -e '$/=*foo; <>; warn' <./perl
Assertion failed: (!isGV_with_GP(_svcur)), function Perl_mess_sv, file util.c, line 1467.
Abort trap

The assertion happens when ‘<...> line 42’ is being appended to
the message.

The line of code in question is this:

    const bool line_mode = (RsSIMPLE(PL_rs) &&
      SvCUR(PL_rs) == 1 && *SvPVX_const(PL_rs) == '\n');

It uses this macro in perl.h:

#define RsSIMPLE(sv)  (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv)))

which was last modified by commit af7d13df559:

-#define RsSIMPLE(sv)  (SvOK(sv) && SvCUR(sv))
-#define RsPARA(sv)    (SvOK(sv) && ! SvCUR(sv))
+#define RsSIMPLE(sv)  (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv)))
+#define RsPARA(sv)    (SvPOK(sv) && ! SvCUR(sv))

So it looks as though it has always called SvCUR on something that is
not necessarily a PV.  As of commit af7d13df559, it has also called
SvPVX on a potential non-PV.

Fixing this simply involves using SvPV instead of SvPVX.

I don’t know that t/io/open.t is the best place for the test, but all
the other ‘<...> line 42’ tests are there.
t/io/open.t
util.c