summaryrefslogtreecommitdiffstats
path: root/Stash.xs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-11-12 09:13:50 -0600
committerJesse Luehrs <doy@tozt.net>2010-11-12 09:13:50 -0600
commit215f49f872bb4995c2168ca5b300ed0ac8f92aa0 (patch)
tree4e45e562ca366ad6cb7e81985f06f67b73d992a6 /Stash.xs
parent164ea0804aebc14c44d8adc54fc2c961f5caa6fa (diff)
downloadpackage-stash-xs-215f49f872bb4995c2168ca5b300ed0ac8f92aa0.tar.gz
package-stash-xs-215f49f872bb4995c2168ca5b300ed0ac8f92aa0.zip
remove_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 07ed2cf..a70683e 100644
--- a/Stash.xs
+++ b/Stash.xs
@@ -201,6 +201,45 @@ remove_package_glob(self, name)
hv_delete(_get_namespace(self), name, strlen(name), G_DISCARD);
void
+remove_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_EMPTY;
+
+ if (isGV(*entry)) {
+ GV *glob = (GV*)(*entry);
+ switch (variable.type) {
+ case VAR_SCALAR:
+ GvSV(glob) = Nullsv;
+ break;
+ case VAR_ARRAY:
+ GvAV(glob) = Nullav;
+ break;
+ case VAR_HASH:
+ GvHV(glob) = Nullhv;
+ break;
+ case VAR_CODE:
+ GvCV(glob) = Nullcv;
+ break;
+ case VAR_IO:
+ GvIOp(glob) = Null(struct io*);
+ break;
+ }
+ }
+ else {
+ if (variable.type == VAR_CODE) {
+ hv_delete(namespace, variable.name, strlen(variable.name), G_DISCARD);
+ }
+ }
+
+void
list_all_package_symbols(self, vartype=VAR_NONE)
SV *self
vartype_t vartype