summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xt/op/universal.t10
-rw-r--r--universal.c6
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;
}
/*