summaryrefslogtreecommitdiff
path: root/mg.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-08-05 00:15:52 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-08-05 13:18:50 -0700
commitf2da823f484d421a6bb57e32e442b19b553f4b35 (patch)
treea1257b3e9d3f0b55dd912ce2b17f9fde7dff1492 /mg.c
parent9a7154347977e29a815d93c0097c5a9b660006b2 (diff)
downloadperl-f2da823f484d421a6bb57e32e442b19b553f4b35.tar.gz
Make PL_(top|body|form)target PVIVs
These are only used for storing a string and an IV. Making them into full-blown SVt_PVFMs is overkill. FmLINES was only being used on these three scalars. So make it use the SvIVX field. struct xpvfm no longer needs an xfm_lines member, because SVt_PVFMs no longer use it. This also causes a TODO test in taint.t to start passing, but I do not fully understand why. But at least that’s progress. :-)
Diffstat (limited to 'mg.c')
-rw-r--r--mg.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/mg.c b/mg.c
index 3b4ed1c052..2ac49bff59 100644
--- a/mg.c
+++ b/mg.c
@@ -814,7 +814,8 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
switch (*mg->mg_ptr) {
case '\001': /* ^A */
- sv_setsv(sv, PL_bodytarget);
+ if (SvOK(PL_bodytarget)) sv_copypv(sv, PL_bodytarget);
+ else sv_setsv(sv, &PL_sv_undef);
if (SvTAINTED(PL_bodytarget))
SvTAINTED_on(sv);
break;
@@ -2542,7 +2543,8 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
}
break;
case '\001': /* ^A */
- sv_setsv(PL_bodytarget, sv);
+ if (SvOK(sv)) sv_copypv(PL_bodytarget, sv);
+ else SvOK_off(PL_bodytarget);
FmLINES(PL_bodytarget) = 0;
if (SvPOK(PL_bodytarget)) {
char *s = SvPVX(PL_bodytarget);