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 /Stash.xs | |
parent | e3ad44fd3e7afaec9dbe9420082df0a227d7c696 (diff) | |
download | package-stash-xs-cb4df463eddfb4fb9b4090e43a860a2722ae6d34.tar.gz package-stash-xs-cb4df463eddfb4fb9b4090e43a860a2722ae6d34.zip |
expand constant stash entries on get
Diffstat (limited to 'Stash.xs')
-rw-r--r-- | Stash.xs | 54 |
1 files changed, 32 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 |