summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gv.c10
-rwxr-xr-xt/op/method.t20
2 files changed, 28 insertions, 2 deletions
diff --git a/gv.c b/gv.c
index 09210956da..a89e900bf8 100644
--- a/gv.c
+++ b/gv.c
@@ -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");
+