diff options
-rwxr-xr-x | t/op/universal.t | 10 | ||||
-rw-r--r-- | universal.c | 6 |
2 files changed, 13 insertions, 3 deletions
diff --git a/t/op/universal.t b/t/op/universal.t index 7d5f59ae6d..71daf675cf 100755 --- a/t/op/universal.t +++ b/t/op/universal.t @@ -9,7 +9,7 @@ BEGIN { $| = 1; } -print "1..98\n"; +print "1..100\n"; $a = {}; bless $a, "Bob"; @@ -187,3 +187,11 @@ test ! UNIVERSAL::isa("\xff\xff\xff\0", 'HASH'); ::test $x->isa("Human"); ::test $x->can("eat"); } + +# bugid 3284 +# a second call to isa('UNIVERSAL') when @ISA is null failed due to caching + +@X::ISA=(); +my $x = {}; bless $x, 'X'; +test $x->isa('UNIVERSAL'); +test $x->isa('UNIVERSAL'); diff --git a/universal.c b/universal.c index b4563e41a8..9ee3e21a73 100644 --- a/universal.c +++ b/universal.c @@ -45,6 +45,9 @@ S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash, if (strEQ(HvNAME(stash), name)) return &PL_sv_yes; + if (strEQ(name, "UNIVERSAL")) + return &PL_sv_yes; + if (level > 100) Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'", HvNAME(stash)); @@ -112,8 +115,7 @@ S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash, (void)hv_store(hv,name,len,&PL_sv_no,0); } } - - return boolSV(strEQ(name, "UNIVERSAL")); + return &PL_sv_no; } /* |