summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-01-03 19:55:53 -0600
committerJesse Luehrs <doy@tozt.net>2013-01-03 19:55:53 -0600
commitd4f755a790d60fee0757d406d397153d99f1649e (patch)
tree54456e4f6545ad396fa79e14d98143c0eef3b565
parentcd533531efb6c83b02fd00fc50b264beb066be5f (diff)
downloadpackage-stash-d4f755a790d60fee0757d406d397153d99f1649e.tar.gz
package-stash-d4f755a790d60fee0757d406d397153d99f1649e.zip
handle things like PL_sv_undef here
it's B::SPECIAL, not B::SV (sigh)
-rw-r--r--lib/Package/Stash/PP.pm5
-rwxr-xr-xt/edge-cases.t6
2 files changed, 10 insertions, 1 deletions
diff --git a/lib/Package/Stash/PP.pm b/lib/Package/Stash/PP.pm
index 2508052..71ee4e5 100644
--- a/lib/Package/Stash/PP.pm
+++ b/lib/Package/Stash/PP.pm
@@ -250,7 +250,10 @@ sub has_symbol {
return defined ${ *{$entry_ref}{$type} };
}
else {
- return B::svref_2object($entry_ref)->SV->isa('B::SV');
+ my $sv = B::svref_2object($entry_ref)->SV;
+ return $sv->isa('B::SV')
+ || ($sv->isa('B::SPECIAL')
+ && $B::specialsv_name[$$sv] ne 'Nullsv');
}
}
else {
diff --git a/t/edge-cases.t b/t/edge-cases.t
index 49f56ed..58b819e 100755
--- a/t/edge-cases.t
+++ b/t/edge-cases.t
@@ -87,4 +87,10 @@ SKIP: {
is($warning, undef, "no redefinition warnings");
}
+{
+ my $stash = Package::Stash->new('Baz');
+ $stash->add_symbol('$baz', \undef);
+ ok($stash->has_symbol('$baz'));
+}
+
done_testing;