summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-05-23 23:24:35 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-06-07 08:18:50 -0700
commit2748e6020278d4118252bc18ecc0db56ef04a973 (patch)
tree529616eb60cc17a73e228e20231e4385f61c7e3d /util.c
parente654efc25137667e687e787a95f6c53aa0ed69e1 (diff)
downloadperl-2748e6020278d4118252bc18ecc0db56ef04a973.tar.gz
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.
Diffstat (limited to 'util.c')
-rw-r--r--util.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/util.c b/util.c
index d0fea67dd1..9c9c07283e 100644
--- a/util.c
+++ b/util.c
@@ -1306,8 +1306,9 @@ Perl_mess_sv(pTHX_ SV *basemsg, bool consume)
if (GvIO(PL_last_in_gv) && (SvTYPE(GvIOp(PL_last_in_gv)) == SVt_PVIO)
&& IoLINES(GvIOp(PL_last_in_gv)))
{
+ STRLEN l;
const bool line_mode = (RsSIMPLE(PL_rs) &&
- SvCUR(PL_rs) == 1 && *SvPVX_const(PL_rs) == '\n');
+ *SvPV_const(PL_rs,l) == '\n' && l == 1);
Perl_sv_catpvf(aTHX_ sv, ", <%"SVf"> %s %"IVdf,
SVfARG(PL_last_in_gv == PL_argvgv
? &PL_sv_no