summaryrefslogtreecommitdiff
path: root/pad.h
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-08-17 14:21:37 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-08-21 16:51:16 -0700
commit35e035ccb58e33947405288b1177fb0b9c1da197 (patch)
treefec171998002fc9523f006c88610f31e252d5d5f /pad.h
parentdb4cf31d1d6c1d09bce93986aa993818ea7b17cf (diff)
downloadperl-35e035ccb58e33947405288b1177fb0b9c1da197.tar.gz
More PAD APIs
If we are making padlists their own type, and no longer AVs, it makes sense to add APIs for pads, too, so that CPAN code that needs to change now will only have to change once if we ever stop pads them- selves from being AVs. There is no reason pad names have to be SVs, so I am adding sep- arate APIs for pad names, too. The AV containing pad names is now officially a PADNAMELIST, which is accessed, not via *PADLIST_ARRAY(padlist), but via PADLIST_NAMES(padlist). Future optimisations may even merge the padlist with its name list so I have also added macros to access the parts of the name list directly from the padlist.
Diffstat (limited to 'pad.h')
-rw-r--r--pad.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/pad.h b/pad.h
index 314db989be..05bbc62ad9 100644
--- a/pad.h
+++ b/pad.h
@@ -175,7 +175,55 @@ Clear the pointed to pad value on scope exit. (i.e. the runtime action of 'my')
save PL_comppad and PL_curpad
+=for apidoc Amx|PAD **|PADLIST_ARRAY|PADLIST padlist
+The C array of a padlist, containing the pads. Only subscript it with
+numbers >= 1, as the 0th entry is not guaranteed to remain usable.
+=for apidoc Amx|SSize_t|PADLIST_MAX|PADLIST padlist
+The index of the last pad in the padlist.
+
+=for apidoc Amx|PADNAMELIST *|PADLIST_NAMES|PADLIST padlist
+The names associated with pad entries.
+
+=for apidoc Amx|PADNAME **|PADLIST_NAMESARRAY|PADLIST padlist
+The C array of pad names.
+
+=for apidoc Amx|SSize_t|PADLIST_NAMESMAX|PADLIST padlist
+The index of the last pad name.
+
+=for apidoc Amx|U32|PADLIST_REFCNT|PADLIST padlist
+The reference count of the padlist. Currently this is always 1.
+
+=for apidoc Amx|PADNAME **|PADNAMELIST_ARRAY|PADNAMELIST pnl
+The C array of pad names.
+
+=for apidoc Amx|SSize_t|PADNAMELIST_MAX|PADNAMELIST pnl
+The index of the last pad name.
+
+=for apidoc Amx|SV **|PAD_ARRAY|PAD pad
+The C array of pad entries.
+
+=for apidoc Amx|SSize_t|PAD_MAX|PAD pad
+The index of the last pad entry.
+
+=for apidoc Amx|char *|PADNAME_PV|PADNAME pn
+The name stored in the pad name struct.
+
+=for apidoc Amx|STRLEN|PADNAME_LEN|PADNAME pn
+The length of the name.
+
+=for apidoc Amx|bool|PADNAME_UTF8|PADNAME pn
+Whether PADNAME_PV is in UTF8.
+
+=for apidoc m|bool|PADNAME_isOUR|PADNAME pn
+Whether this is an "our" variable.
+
+=for apidoc m|HV *|PADNAME_OURSTASH
+The stash in which this "our" variable was declared.
+
+=for apidoc m|HV *|PADNAME_TYPE|PADNAME pn
+The stash associated with a typed lexical. This returns the %Foo:: hash
+for C<my Foo $bar>.
=for apidoc m|SV *|PAD_SETSV |PADOFFSET po|SV* sv
@@ -220,8 +268,25 @@ Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
#define PADLIST_ARRAY(pl) (pl)->xpadl_alloc
#define PADLIST_MAX(pl) (pl)->xpadl_max
+#define PADLIST_NAMES(pl) (*PADLIST_ARRAY(pl))
+#define PADLIST_NAMESARRAY(pl) PADNAMELIST_ARRAY(PADLIST_NAMES(pl))
+#define PADLIST_NAMESMAX(pl) PADNAMELIST_MAX(PADLIST_NAMES(pl))
#define PADLIST_REFCNT(pl) 1 /* reserved for future use */
+#define PADNAMELIST_ARRAY(pnl) AvARRAY(pnl)
+#define PADNAMELIST_MAX(pnl) AvFILLp(pnl)
+
+#define PAD_ARRAY(pad) AvARRAY(pad)
+#define PAD_MAX(pad) AvFILLp(pad)
+
+#define PADNAME_PV(pn) SvPV_nolen(pn)
+#define PADNAME_LEN(pn) SvCUR(pn)
+#define PADNAME_UTF8(pn) !!SvUTF8(pn)
+#define PADNAME_isOUR(pn) !!SvPAD_OUR(pn)
+#define PADNAME_OURSTASH SvOURSTASH(pn)
+#define PADNAME_TYPE(pn) (SvPAD_TYPED(pn) ? SvSTASH(pn) : NULL)
+
+
#ifdef DEBUGGING
# define PAD_SV(po) pad_sv(po)
# define PAD_SETSV(po,sv) pad_setsv(po,sv)
@@ -316,6 +381,7 @@ ling pad (lvalue) to C<gen>. Note that C<SvUV_set> is hijacked for this purpose
*/
+#define PAD_COMPNAME(po) PAD_COMPNAME_SV(po)
#define PAD_COMPNAME_SV(po) (*av_fetch(PL_comppad_name, (po), FALSE))
#define PAD_COMPNAME_FLAGS(po) SvFLAGS(PAD_COMPNAME_SV(po))
#define PAD_COMPNAME_FLAGS_isOUR(po) SvPAD_OUR(PAD_COMPNAME_SV(po))