summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2013-07-02 13:07:45 -0700
committerFather Chrysostomos <sprout@cpan.org>2013-08-20 21:38:07 -0700
commitce0d59fdd1c7d145efdf6bf8da56a259fed483e4 (patch)
tree6d7ed09aaf3e1540bf3b408b343713dfe3da8b19 /pp.c
parent1a33a0598e4c684205d292afcb97de6d79d17e7d (diff)
downloadperl-ce0d59fdd1c7d145efdf6bf8da56a259fed483e4.tar.gz
[perl #7508] Use NULL for nonexistent array elems
This commit fixes bug #7508 and provides the groundwork for fixing several other bugs. Elements of @_ are aliased to the arguments, so that \$_[0] within sub foo will reference the same scalar as \$x if the sub is called as foo($x). &PL_sv_undef (the global read-only undef scalar returned by the ‘undef’ operator itself) was being used to represent nonexistent array elements. So the pattern would be broken for foo(undef), where \$_[0] would vivify a new $_[0] element, treating it as having been nonexistent. This also causes other problems with constants under ithreads (#105906) and causes a pending fix for another bug (#118691) to trig- ger this bug. This commit changes the internals to use a null pointer to represent a nonexistent element. This requires that Storable be changed to account for it. Also, IPC::Open3 was relying on the bug. So this commit patches both modules.
Diffstat (limited to 'pp.c')
-rw-r--r--pp.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/pp.c b/pp.c
index fd40453657..17e0f3bb51 100644
--- a/pp.c
+++ b/pp.c
@@ -4330,7 +4330,7 @@ PP(pp_aslice)
svp = av_fetch(av, elem, lval);
if (lval) {
- if (!svp || *svp == &PL_sv_undef)
+ if (!svp || !*svp)
DIE(aTHX_ PL_no_aelem, elem);
if (localizing) {
if (preeminent)
@@ -5016,7 +5016,7 @@ PP(pp_splice)
}
i = -diff;
while (i)
- dst[--i] = &PL_sv_undef;
+ dst[--i] = NULL;
if (newlen) {
Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );