diff options
author | Jesse Luehrs <doy@tozt.net> | 2010-11-12 09:25:55 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2010-11-12 09:25:55 -0600 |
commit | 34805376fa48a707b1a7f52f3a282ee5cacd2cf9 (patch) | |
tree | 024096cf644712dcd827aa87f373131235b01dd1 /Stash.xs | |
parent | 996a8db0046b5172fadd26b389f73030f00149eb (diff) | |
download | package-stash-xs-34805376fa48a707b1a7f52f3a282ee5cacd2cf9.tar.gz package-stash-xs-34805376fa48a707b1a7f52f3a282ee5cacd2cf9.zip |
has_package_symbol
Diffstat (limited to 'Stash.xs')
-rw-r--r-- | Stash.xs | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -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 |