diff options
author | Jesse Luehrs <doy@tozt.net> | 2010-11-12 14:21:02 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2010-11-12 14:21:02 -0600 |
commit | cb4df463eddfb4fb9b4090e43a860a2722ae6d34 (patch) | |
tree | b70e43e39c2e6a35cbc5f4d6a4a1424cf6485983 | |
parent | e3ad44fd3e7afaec9dbe9420082df0a227d7c696 (diff) | |
download | package-stash-xs-cb4df463eddfb4fb9b4090e43a860a2722ae6d34.tar.gz package-stash-xs-cb4df463eddfb4fb9b4090e43a860a2722ae6d34.zip |
expand constant stash entries on get
-rw-r--r-- | Stash.xs | 54 | ||||
-rwxr-xr-x | t/07-edge-cases.t | 3 |
2 files changed, 35 insertions, 22 deletions
@@ -394,6 +394,7 @@ get_package_symbol(self, variable, ...) PREINIT: HV *namespace; SV **entry; + GV *glob; CODE: namespace = _get_namespace(self); @@ -419,29 +420,38 @@ get_package_symbol(self, variable, ...) if (!entry) XSRETURN_UNDEF; - if (isGV(*entry)) { - GV *glob = (GV*)(*entry); - switch (variable.type) { - case VAR_SCALAR: - RETVAL = newRV(GvSV(glob)); - break; - case VAR_ARRAY: - RETVAL = newRV((SV*)GvAV(glob)); - break; - case VAR_HASH: - RETVAL = newRV((SV*)GvHV(glob)); - break; - case VAR_CODE: - RETVAL = newRV((SV*)GvCV(glob)); - break; - case VAR_IO: - RETVAL = newRV((SV*)GvIO(glob)); - break; - } + glob = (GV*)(*entry); + + if (!isGV(*entry)) { + SV *namesv; + char *name; + int len; + + namesv = newSVsv(_get_name(self)); + sv_catpvs(namesv, "::"); + sv_catpv(namesv, variable.name); + + name = SvPV(namesv, len); + + gv_init(glob, namespace, name, len, 1); } - else { - /* XXX: need to expand code slots */ - XSRETURN_UNDEF; + + switch (variable.type) { + case VAR_SCALAR: + RETVAL = newRV(GvSV(glob)); + break; + case VAR_ARRAY: + RETVAL = newRV((SV*)GvAV(glob)); + break; + case VAR_HASH: + RETVAL = newRV((SV*)GvHV(glob)); + break; + case VAR_CODE: + RETVAL = newRV((SV*)GvCV(glob)); + break; + case VAR_IO: + RETVAL = newRV((SV*)GvIO(glob)); + break; } OUTPUT: RETVAL diff --git a/t/07-edge-cases.t b/t/07-edge-cases.t index a742c76..e5928a5 100755 --- a/t/07-edge-cases.t +++ b/t/07-edge-cases.t @@ -39,4 +39,7 @@ ok(!$stash->has_package_symbol('$added'), '$added'); ok(!$stash->has_package_symbol('@added'), '@added'); ok($stash->has_package_symbol('%added'), '%added'); +my $constant = $stash->get_package_symbol('&FOO'); +is(ref($constant), 'CODE', "expanded a constant into a coderef"); + done_testing; |