diff options
-rw-r--r-- | gv.c | 10 | ||||
-rwxr-xr-x | t/op/method.t | 20 |
2 files changed, 28 insertions, 2 deletions
@@ -422,9 +422,17 @@ Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload) DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n", origname, HvNAME(stash), name) ); } - else + else { /* don't autovifify if ->NoSuchStash::method */ stash = gv_stashpvn(origname, nsplit - origname, FALSE); + + /* however, explicit calls to Pkg::SUPER::method may + happen, and may require autovivification to work */ + if (!stash && (nsplit - origname) >= 7 && + strnEQ(nsplit - 7, "::SUPER", 7) && + gv_stashpvn(origname, nsplit - origname - 7, FALSE)) + stash = gv_stashpvn(origname, nsplit - origname, TRUE); + } } gv = gv_fetchmeth(stash, name, nend - name, 0); diff --git a/t/op/method.t b/t/op/method.t index 16a927aa06..46c111946a 100755 --- a/t/op/method.t +++ b/t/op/method.t @@ -10,7 +10,7 @@ BEGIN { require "test.pl"; } -print "1..74\n"; +print "1..75\n"; @A::ISA = 'B'; @B::ISA = 'C'; @@ -259,3 +259,21 @@ is( is($w, ''); } +# [ID 20020305.025] PACKAGE::SUPER doesn't work anymore + +package main; +our @X; +package Amajor; +sub test { + push @main::X, 'Amajor', @_; +} +package Bminor; +use base qw(Amajor); +package main; +sub Bminor::test { + $_[0]->Bminor::SUPER::test('x', 'y'); + push @main::X, 'Bminor', @_; +} +Bminor->test('y', 'z'); +is("@X", "Amajor Bminor x y Bminor Bminor y z"); + |