summaryrefslogtreecommitdiffstats
path: root/Stash.xs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-11-12 09:25:55 -0600
committerJesse Luehrs <doy@tozt.net>2010-11-12 09:25:55 -0600
commit34805376fa48a707b1a7f52f3a282ee5cacd2cf9 (patch)
tree024096cf644712dcd827aa87f373131235b01dd1 /Stash.xs
parent996a8db0046b5172fadd26b389f73030f00149eb (diff)
downloadpackage-stash-xs-34805376fa48a707b1a7f52f3a282ee5cacd2cf9.tar.gz
package-stash-xs-34805376fa48a707b1a7f52f3a282ee5cacd2cf9.zip
has_package_symbol
Diffstat (limited to 'Stash.xs')
-rw-r--r--Stash.xs39
1 files changed, 39 insertions, 0 deletions
diff --git a/Stash.xs b/Stash.xs
index 58833e9..5631b9c 100644
--- a/Stash.xs
+++ b/Stash.xs
@@ -198,6 +198,45 @@ remove_package_glob(self, name)
CODE:
hv_delete(_get_namespace(self), name, strlen(name), G_DISCARD);
+int
+has_package_symbol(self, variable)
+ SV *self
+ varspec_t variable
+ PREINIT:
+ HV *namespace;
+ SV **entry;
+ CODE:
+ namespace = _get_namespace(self);
+ entry = hv_fetch(namespace, variable.name, strlen(variable.name), 0);
+ if (!entry)
+ XSRETURN_UNDEF;
+
+ if (isGV(*entry)) {
+ GV *glob = (GV*)(*entry);
+ switch (variable.type) {
+ case VAR_SCALAR:
+ RETVAL = GvSV(glob) ? 1 : 0;
+ break;
+ case VAR_ARRAY:
+ RETVAL = GvAV(glob) ? 1 : 0;
+ break;
+ case VAR_HASH:
+ RETVAL = GvHV(glob) ? 1 : 0;
+ break;
+ case VAR_CODE:
+ RETVAL = GvCV(glob) ? 1 : 0;
+ break;
+ case VAR_IO:
+ RETVAL = GvIO(glob) ? 1 : 0;
+ break;
+ }
+ }
+ else {
+ RETVAL = (variable.type == VAR_CODE);
+ }
+ OUTPUT:
+ RETVAL
+
void
remove_package_symbol(self, variable)
SV *self