summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2016-11-30 08:59:01 +0000
committerDavid Mitchell <davem@iabyn.com>2016-11-30 09:11:25 +0000
commit71ca73e5fa9639ac33e9f2e74cd0c32288a5040d (patch)
treeec2a5438f0616680afc75821668a4872ab1823b0 /pp.c
parentc707756ebb45d88362c58f12444af0ebe1e24ac1 (diff)
downloadperl-71ca73e5fa9639ac33e9f2e74cd0c32288a5040d.tar.gz
split was leaving PL_sv_undef in unused ary slots
This: @a = split(/-/,"-"); $a[1] = undef; $a[0] = 0; was giving Modification of a read-only value attempted at foo line 3. This is because: 1) unused slots in AvARRAY between AvFILL and AvMAX should always be null; av_clear(), av_extend() etc do this; while av_store(), if storing to a slot N somewhere between AvFILL and AvMAX, doesn't bother to clear between (AvFILL+1)..(N-1) on the assumption that everyone else plays nicely. 2) pp_split() when splitting directly to an array, sometimes over-splits and has to null out the excess elements; 3) Since perl 5.19.4, unused AV slots are now marked with NULL rather than &PL_sv_undef; 4) pp_split was still using &PL_sv_undef; The fault was with (4), and is easily fixed.
Diffstat (limited to 'pp.c')
-rw-r--r--pp.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/pp.c b/pp.c
index d406ee11fe..b198b47a8a 100644
--- a/pp.c
+++ b/pp.c
@@ -6095,7 +6095,7 @@ PP(pp_split)
while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
if (TOPs && !make_mortal)
sv_2mortal(TOPs);
- *SP-- = &PL_sv_undef;
+ *SP-- = NULL;
iters--;
}
}