diff options
-rw-r--r-- | pp_hot.c | 5 | ||||
-rw-r--r-- | sv.c | 6 | ||||
-rw-r--r-- | t/mro/method_caching.t | 1 |
3 files changed, 4 insertions, 8 deletions
@@ -180,11 +180,6 @@ PP(pp_sassign) SvREFCNT_dec(cv); LEAVE; } - - if (strEQ(GvNAME(right),"isa")) { - GvCVGEN(right) = 0; - ++PL_sub_generation; /* I don't get this at all --blblack */ - } } SvSetMagicSV(right, left); SETs(right); @@ -3237,18 +3237,18 @@ S_glob_assign_ref(pTHX_ SV *dstr, SV *sstr) { common: if (intro) { if (stype == SVt_PVCV) { - if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) { + /*if (GvCVGEN(dstr) && (GvCV(dstr) != (CV*)sref || GvCVGEN(dstr))) {*/ + if (GvCVGEN(dstr)) { SvREFCNT_dec(GvCV(dstr)); GvCV(dstr) = NULL; GvCVGEN(dstr) = 0; /* Switch off cacheness. */ - mro_method_changed_in(GvSTASH(dstr)); } } SAVEGENERICSV(*location); } else dref = *location; - if (stype == SVt_PVCV && *location != sref) { + if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) { CV* const cv = (CV*)*location; if (cv) { if (!GvCVGEN((GV*)dstr) && diff --git a/t/mro/method_caching.t b/t/mro/method_caching.t index dd70da6afb..a20da2a9d5 100644 --- a/t/mro/method_caching.t +++ b/t/mro/method_caching.t @@ -38,6 +38,7 @@ my @testsubs = ( sub { undef *MCTest::Base::foo; eval { MCTest::Derived->foo(0) }; like($@, qr/locate object method/); }, sub { sub MCTest::Base::foo($); *MCTest::Base::foo = \&ASDF::asdf; is(MCTest::Derived->foo(0), 7); }, sub { *XYZ = sub { $_[1]+8 }; ${MCTest::Base::}{foo} = \&XYZ; is(MCTest::Derived->foo(0), 8); }, + sub { *MCTest::Derived::foo = \&MCTest::Base::foo; eval { MCTest::Derived::foo(0,0) }; ok(!$@); undef *MCTest::Derived::foo }, ); plan(tests => scalar(@testsubs) + 1); |