summaryrefslogtreecommitdiff
path: root/pp_pack.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2014-12-10 18:20:19 -0800
committerFather Chrysostomos <sprout@cpan.org>2014-12-10 20:21:06 -0800
commit93f6e112d1711b0b220ea546f5fcb0f9ef445b66 (patch)
tree6dbeb326dc2c3f21798bc1c2ce3de78155cc5009 /pp_pack.c
parent1d55083cd581c158cb108c021e3625e4686463f8 (diff)
downloadperl-93f6e112d1711b0b220ea546f5fcb0f9ef445b66.tar.gz
Don’t do string overloading for numeric pack fmts
See <20141130160250.GC31019@pjcj.net>. Commit 354b74ae6f broke this.
Diffstat (limited to 'pp_pack.c')
-rw-r--r--pp_pack.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/pp_pack.c b/pp_pack.c
index eb63db96e8..ad4f186bf9 100644
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -2088,10 +2088,12 @@ S_sv_exp_grow(pTHX_ SV *sv, STRLEN needed) {
return SvGROW(sv, len+extend+1);
}
-static void
+static SV *
S_sv_check_infnan(pTHX_ SV *sv, I32 datumtype)
{
SvGETMAGIC(sv);
+ if (UNLIKELY(SvAMAGIC(sv)))
+ sv = sv_2num(sv);
if (UNLIKELY(isinfnansv(sv))) {
const I32 c = TYPE_NO_MODIFIERS(datumtype);
const NV nv = SvNV_nomg(sv);
@@ -2100,10 +2102,13 @@ S_sv_check_infnan(pTHX_ SV *sv, I32 datumtype)
else
Perl_croak(aTHX_ "Cannot pack %"NVgf" with '%c'", nv, (int) c);
}
+ return sv;
}
-#define SvIV_no_inf(sv,d) (S_sv_check_infnan(aTHX_ sv,d), SvIV_nomg(sv))
-#define SvUV_no_inf(sv,d) (S_sv_check_infnan(aTHX_ sv,d), SvUV_nomg(sv))
+#define SvIV_no_inf(sv,d) \
+ ((sv) = S_sv_check_infnan(aTHX_ sv,d), SvIV_nomg(sv))
+#define SvUV_no_inf(sv,d) \
+ ((sv) = S_sv_check_infnan(aTHX_ sv,d), SvUV_nomg(sv))
STATIC
SV **