This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Disable CV-in-stash optimization
authorFather Chrysostomos <sprout@cpan.org>
Sun, 4 Feb 2018 19:13:56 +0000 (11:13 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 4 Feb 2018 20:22:15 +0000 (12:22 -0800)
outside of the main package.

Instead of actually reverting to the previous logic that excluded
packages other that main as a side effect of the logic being
faulty, this time I am checking for the main package explicitly.

op.c
t/op/sub.t

diff --git a/op.c b/op.c
index 373822a..c6f228b 100644 (file)
--- a/op.c
+++ b/op.c
@@ -9847,9 +9847,12 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
           Also, we may be called from load_module at run time, so
           PL_curstash (which sets CvSTASH) may not point to the stash the
           sub is stored in.  */
+       /* XXX This optimization is currently disabled for packages other
+              than main, since there was too much CPAN breakage.  */
        const I32 flags =
           ec ? GV_NOADD_NOINIT
              :   (IN_PERL_RUNTIME && PL_curstash != CopSTASH(PL_curcop))
+              || PL_curstash != PL_defstash
               || memchr(name, ':', namlen) || memchr(name, '\'', namlen)
                    ? gv_fetch_flags
                    : GV_ADDMULTI | GV_NOINIT | GV_NOTQUAL;
index 5de358e..c8bf72d 100644 (file)
@@ -399,6 +399,7 @@ is ref($main::{rt_129916}), 'CODE', 'simple sub stored as CV in stash (main::)';
     sub foo { 42 }
 }
 {
+    local $::TODO = "disabled for now";
     is ref($RT129916::{foo}), 'CODE', 'simple sub stored as CV in stash (non-main::)';
 }