This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #124387] call AUTOLOAD when DESTROY isn't defined
authorTony Cook <tony@develop-help.com>
Tue, 19 Jan 2016 00:42:21 +0000 (11:42 +1100)
committerTony Cook <tony@develop-help.com>
Mon, 8 Feb 2016 03:52:57 +0000 (14:52 +1100)
sv.c
t/op/method.t

diff --git a/sv.c b/sv.c
index 42baa29..1650ed5 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -6776,6 +6776,7 @@ S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
          if (HvNAME(stash)) {
            CV* destructor = NULL;
             struct mro_meta *meta;
+
            assert (SvOOK(stash));
 
             DEBUG_o( Perl_deb(aTHX_ "Looking for DESTROY method for %s\n",
@@ -6791,7 +6792,7 @@ S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
             }
             else {
                GV * const gv =
-                   gv_fetchmeth_autoload(stash, "DESTROY", 7, 0);
+                   gv_fetchmethod_pvn_flags(stash, "DESTROY", 7, GV_AUTOLOAD);
                if (gv) destructor = GvCV(gv);
                 meta->destroy_gen = PL_sub_generation;
                 meta->destroy = destructor;
index bdac5bb..d11a703 100644 (file)
@@ -361,6 +361,7 @@ for my $meth (['Bar', 'Foo::Bar'],
 {
     fresh_perl_is(<<EOT,
 package UNIVERSAL; sub AUTOLOAD { my \$c = shift; print "\$c \$AUTOLOAD\\n" }
+sub DESTROY {} # prevent AUTOLOAD being called on DESTROY
 package Xyz;
 package main; Foo->$meth->[0]();
 EOT
@@ -462,7 +463,6 @@ is $kalled, 1, 'calling a class method via a magic variable';
 
 {
     # [perl #124387]
-    local $::TODO = "AUTOLOAD not being called for DESTROY";
     my $autoloaded;
     package AutoloadDestroy;
     sub AUTOLOAD { $autoloaded = 1 }