diff options
author | Jesse Luehrs <doy@tozt.net> | 2010-11-12 09:13:50 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2010-11-12 09:13:50 -0600 |
commit | 215f49f872bb4995c2168ca5b300ed0ac8f92aa0 (patch) | |
tree | 4e45e562ca366ad6cb7e81985f06f67b73d992a6 /Stash.xs | |
parent | 164ea0804aebc14c44d8adc54fc2c961f5caa6fa (diff) | |
download | package-stash-xs-215f49f872bb4995c2168ca5b300ed0ac8f92aa0.tar.gz package-stash-xs-215f49f872bb4995c2168ca5b300ed0ac8f92aa0.zip |
remove_package_symbol
Diffstat (limited to 'Stash.xs')
-rw-r--r-- | Stash.xs | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -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 |