This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Make &CORE::undef(\*_) undefine it properly
authorFather Chrysostomos <sprout@cpan.org>
Tue, 15 May 2012 05:26:15 +0000 (22:26 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 29 May 2012 16:36:28 +0000 (09:36 -0700)
commit88bb468b2b6524f0c0fe31469056b89c37872bd8
tree096220a98c7a9d42e8ad52cf2c3e53e1e89b2593
parentc4ec50f125f7cd8684d97c0ef47311620b58556a
Make &CORE::undef(\*_) undefine it properly

Unless called as &CORE::undef (without parentheses) after @_ has been
set to \*_, it leaves @_ in the ARRAY slot.

This is an implementation detail leaking through.

pp_entersub temporarily aliases @_ to a new array, which is restored
to its previous value on sub exit.

Since &CORE::undef is a perl sub with an op tree containing
an undef op,

$ ./perl -Ilib -MO=Concise,CORE::undef -e '\&CORE::undef'
CORE::undef:
3  <1> leavesublv[1 ref] K/REFC,1 ->(end)
2     <1> undef sKP/1 ->3
1        <$> coreargs(IV 44) s ->2
-e syntax OK

the undef op runs while @_ is localised.

So we should un-localise @_ if we detect that case.

Doing this in pp_coreargs might be a bit of a hack, but it’s less
code than rewriting &CORE::undef as an XSUB, which would be the
other option.

Either way, we need a special case, since undef is the only named op
that touches the ARRAY slot of the glob passed to it.
pp.c
t/op/coreamp.t