summaryrefslogtreecommitdiff
path: root/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/pad.h
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-03-15 03:06:35 +0000
committerNorbert Preining <norbert@preining.info>2024-03-15 03:06:35 +0000
commit12679ab7d3c2a210f4123163671b532b8b55d5f9 (patch)
tree0060d13467186ad977f4e73488ee20dd6c0017ab /systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/pad.h
parent62170822e034fdd3f81de7274835d0d3b0467100 (diff)
CTAN sync 202403150306
Diffstat (limited to 'systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/pad.h')
-rw-r--r--systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/pad.h116
1 files changed, 86 insertions, 30 deletions
diff --git a/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/pad.h b/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/pad.h
index 07c4d86863..8f339ae6c4 100644
--- a/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/pad.h
+++ b/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/pad.h
@@ -23,8 +23,9 @@ typedef SSize_t PADOFFSET; /* signed so that -1 is a valid value */
struct padlist {
SSize_t xpadl_max; /* max index for which array has space */
union {
- PAD ** xpadlarr_alloc; /* Pointer to beginning of array of AVs.
- index 0 is a padnamelist * */
+ PAD ** xpadlarr_alloc; /* Pointer to beginning of array of AVs.
+ Note that a 'padnamelist *' is stored
+ in the 0 index of the AV. */
struct {
PADNAMELIST * padnl;
PAD * pad_1; /* this slice of PAD * array always alloced */
@@ -54,6 +55,8 @@ struct padnamelist {
# define PERL_PADNAME_MINIMAL
#endif
+struct padname_fieldinfo;
+
#define _PADNAME_BASE \
char * xpadn_pv; \
HV * xpadn_ourstash; \
@@ -61,6 +64,7 @@ struct padnamelist {
HV * xpadn_typestash; \
CV * xpadn_protocv; \
} xpadn_type_u; \
+ struct padname_fieldinfo *xpadn_fieldinfo; \
U32 xpadn_low; \
U32 xpadn_high; \
U32 xpadn_refcnt; \
@@ -86,6 +90,19 @@ struct padname_with_str {
#define PADNAME_FROM_PV(s) \
((PADNAME *)((s) - STRUCT_OFFSET(struct padname_with_str, xpadn_str)))
+/* Most padnames are not field names. Keep all the field-related info in its
+ * own substructure, stored in ->xpadn_fieldinfo.
+ */
+struct padname_fieldinfo {
+ U32 refcount;
+ PADOFFSET fieldix; /* index of this field within ObjectFIELDS() array */
+ HV *fieldstash; /* original class package which added this field */
+ OP *defop; /* optree fragment for defaulting expression */
+ SV *paramname; /* name of the :param to look for in constructor */
+ int def_if_undef : 1; /* default op uses //= */
+ int def_if_false : 1; /* default op uses ||= */
+};
+
/* a value that PL_cop_seqmax is guaranteed never to be,
* flagging that a lexical is being introduced, or has not yet left scope
@@ -131,6 +148,8 @@ typedef enum {
#define padadd_NO_DUP_CHECK 0x04 /* skip warning on dups. */
#define padadd_STALEOK 0x08 /* allow stale lexical in active
* sub, but only one level up */
+#define padadd_FIELD 0x10 /* set PADNAMEt_FIELD */
+#define padfind_FIELD_OK 0x20 /* pad_findlex is permitted to see fields */
/* ASSERT_CURPAD_LEGAL and ASSERT_CURPAD_ACTIVE respectively determine
* whether PL_comppad and PL_curpad are consistent and whether they have
@@ -160,8 +179,9 @@ typedef enum {
/* Note: the following three macros are actually defined in scope.h, but
* they are documented here for completeness, since they directly or
- * indirectly affect pads.
+ * indirectly affect pads. */
+/*
=for apidoc m|void|SAVEPADSV |PADOFFSET po
Save a pad slot (used to restore after an iteration)
@@ -242,6 +262,10 @@ are often referred to as 'fake'.
=for apidoc m|bool|PadnameIsSTATE|PADNAME * pn
Whether this is a "state" variable.
+=for apidoc m|bool|PadnameIsFIELD|PADNAME * pn
+Whether this is a "field" variable. PADNAMEs where this is true will
+have additional information available via C<PadnameFIELDINFO>.
+
=for apidoc m|HV *|PadnameTYPE|PADNAME * pn
The stash associated with a typed lexical. This returns the C<%Foo::> hash
for C<my Foo $bar>.
@@ -249,6 +273,9 @@ for C<my Foo $bar>.
=for apidoc Amx|SSize_t|PadnameREFCNT|PADNAME * pn
The reference count of the pad name.
+=for apidoc Amx|PADNAME *|PadnameREFCNT_inc|PADNAME * pn
+Increases the reference count of the pad name. Returns the pad name itself.
+
=for apidoc Amx|void|PadnameREFCNT_dec|PADNAME * pn
Lowers the reference count of the pad name.
@@ -304,6 +331,7 @@ Restore the old pad saved into the local variable C<opad> by C<PAD_SAVE_LOCAL()>
#define PadnamelistMAX(pnl) (pnl)->xpadnl_fill
#define PadnamelistMAXNAMED(pnl) (pnl)->xpadnl_max_named
#define PadnamelistREFCNT(pnl) (pnl)->xpadnl_refcnt
+#define PadnamelistREFCNT_inc(pnl) Perl_padnamelist_refcnt_inc(pnl)
#define PadnamelistREFCNT_dec(pnl) Perl_padnamelist_free(aTHX_ pnl)
#define PadARRAY(pad) AvARRAY(pad)
@@ -315,39 +343,56 @@ Restore the old pad saved into the local variable C<opad> by C<PAD_SAVE_LOCAL()>
#define PadnameSV(pn) \
newSVpvn_flags(PadnamePV(pn), PadnameLEN(pn), SVs_TEMP|SVf_UTF8)
#define PadnameFLAGS(pn) (pn)->xpadn_flags
-#define PadnameIsOUR(pn) (!!(pn)->xpadn_ourstash)
+#define PadnameIsOUR(pn) cBOOL((pn)->xpadn_ourstash)
#define PadnameOURSTASH(pn) (pn)->xpadn_ourstash
#define PadnameTYPE(pn) (pn)->xpadn_type_u.xpadn_typestash
+#define PadnameHasTYPE(pn) cBOOL(PadnameTYPE(pn))
#define PadnamePROTOCV(pn) (pn)->xpadn_type_u.xpadn_protocv
#define PadnameREFCNT(pn) (pn)->xpadn_refcnt
+#define PadnameREFCNT_inc(pn) Perl_padname_refcnt_inc(pn)
#define PadnameREFCNT_dec(pn) Perl_padname_free(aTHX_ pn)
#define PadnameOURSTASH_set(pn,s) (PadnameOURSTASH(pn) = (s))
#define PadnameTYPE_set(pn,s) (PadnameTYPE(pn) = (s))
-#define PadnameOUTER(pn) (PadnameFLAGS(pn) & PADNAMEt_OUTER)
-#define PadnameIsSTATE(pn) (PadnameFLAGS(pn) & PADNAMEt_STATE)
-#define PadnameLVALUE(pn) (PadnameFLAGS(pn) & PADNAMEt_LVALUE)
-
-#define PadnameLVALUE_on(pn) (PadnameFLAGS(pn) |= PADNAMEt_LVALUE)
-#define PadnameIsSTATE_on(pn) (PadnameFLAGS(pn) |= PADNAMEt_STATE)
-
-#define PADNAMEt_OUTER 1 /* outer lexical var */
-#define PADNAMEt_STATE 2 /* state var */
-#define PADNAMEt_LVALUE 4 /* used as lvalue */
-#define PADNAMEt_TYPED 8 /* for B; unused by core */
-#define PADNAMEt_OUR 16 /* for B; unused by core */
+#define PadnameFIELDINFO(pn) (pn)->xpadn_fieldinfo
+#define PadnameOUTER(pn) (PadnameFLAGS(pn) & PADNAMEf_OUTER)
+#define PadnameIsSTATE(pn) (PadnameFLAGS(pn) & PADNAMEf_STATE)
+#define PadnameLVALUE(pn) (PadnameFLAGS(pn) & PADNAMEf_LVALUE)
+#define PadnameIsFIELD(pn) (PadnameFLAGS(pn) & PADNAMEf_FIELD)
+
+#define PadnameLVALUE_on(pn) (PadnameFLAGS(pn) |= PADNAMEf_LVALUE)
+#define PadnameIsSTATE_on(pn) (PadnameFLAGS(pn) |= PADNAMEf_STATE)
+
+#define PADNAMEf_OUTER 0x01 /* outer lexical var */
+#define PADNAMEf_STATE 0x02 /* state var */
+#define PADNAMEf_LVALUE 0x04 /* used as lvalue */
+#define PADNAMEf_TYPED 0x08 /* for B; unused by core */
+#define PADNAMEf_OUR 0x10 /* for B; unused by core */
+#define PADNAMEf_FIELD 0x20 /* field var */
/* backward compatibility */
-#define SvPAD_STATE PadnameIsSTATE
-#define SvPAD_TYPED(pn) (!!PadnameTYPE(pn))
-#define SvPAD_OUR(pn) (!!PadnameOURSTASH(pn))
-#define SvPAD_STATE_on PadnameIsSTATE_on
-#define SvPAD_TYPED_on(pn) (PadnameFLAGS(pn) |= PADNAMEt_TYPED)
-#define SvPAD_OUR_on(pn) (PadnameFLAGS(pn) |= PADNAMEt_OUR)
-#define SvOURSTASH PadnameOURSTASH
-#define SvOURSTASH_set PadnameOURSTASH_set
-#define SVpad_STATE PADNAMEt_STATE
-#define SVpad_TYPED PADNAMEt_TYPED
-#define SVpad_OUR PADNAMEt_OUR
+#ifndef PERL_CORE
+# define SvPAD_STATE PadnameIsSTATE
+# define SvPAD_TYPED PadnameHasTYPE
+# define SvPAD_OUR(pn) cBOOL(PadnameOURSTASH(pn))
+# define SvPAD_STATE_on PadnameIsSTATE_on
+# define SvPAD_TYPED_on(pn) (PadnameFLAGS(pn) |= PADNAMEf_TYPED)
+# define SvPAD_OUR_on(pn) (PadnameFLAGS(pn) |= PADNAMEf_OUR)
+# define SvOURSTASH PadnameOURSTASH
+# define SvOURSTASH_set PadnameOURSTASH_set
+# define SVpad_STATE PADNAMEf_STATE
+# define SVpad_TYPED PADNAMEf_TYPED
+# define SVpad_OUR PADNAMEf_OUR
+# define PADNAMEt_OUTER PADNAMEf_OUTER
+# define PADNAMEt_STATE PADNAMEf_STATE
+# define PADNAMEt_LVALUE PADNAMEf_LVALUE
+# define PADNAMEt_TYPED PADNAMEf_TYPED
+# define PADNAMEt_OUR PADNAMEf_OUR
+#endif
+
+#ifdef USE_ITHREADS
+# define padnamelist_dup_inc(pnl,param) PadnamelistREFCNT_inc(padnamelist_dup(pnl,param))
+# define padname_dup_inc(pn,param) PadnameREFCNT_inc(padname_dup(pn,param))
+#endif
#ifdef DEBUGGING
# define PAD_SV(po) pad_sv(po)
@@ -445,13 +490,12 @@ ling pad (lvalue) to C<gen>.
#define PAD_COMPNAME(po) PAD_COMPNAME_SV(po)
#define PAD_COMPNAME_SV(po) (PadnamelistARRAY(PL_comppad_name)[(po)])
#define PAD_COMPNAME_FLAGS(po) PadnameFLAGS(PAD_COMPNAME(po))
-#define PAD_COMPNAME_FLAGS_isOUR(po) SvPAD_OUR(PAD_COMPNAME_SV(po))
+#define PAD_COMPNAME_FLAGS_isOUR(po) PadnameIsOUR(PAD_COMPNAME_SV(po))
#define PAD_COMPNAME_PV(po) PadnamePV(PAD_COMPNAME(po))
#define PAD_COMPNAME_TYPE(po) PadnameTYPE(PAD_COMPNAME(po))
-#define PAD_COMPNAME_OURSTASH(po) \
- (SvOURSTASH(PAD_COMPNAME_SV(po)))
+#define PAD_COMPNAME_OURSTASH(po) (PadnameOURSTASH(PAD_COMPNAME_SV(po)))
#define PAD_COMPNAME_GEN(po) \
((STRLEN)PadnamelistARRAY(PL_comppad_name)[po]->xpadn_gen)
@@ -513,6 +557,18 @@ instead of a string/length pair.
#define pad_findmy_pvs(name,flags) \
Perl_pad_findmy_pvn(aTHX_ STR_WITH_LEN(name), flags)
+struct suspended_compcv
+{
+ CV *compcv;
+ STRLEN padix, constpadix;
+ STRLEN comppad_name_fill;
+ STRLEN min_intro_pending, max_intro_pending;
+ bool cv_has_eval, pad_reset_pending;
+};
+
+#define resume_compcv_final(buffer) Perl_resume_compcv(aTHX_ buffer, false)
+#define resume_compcv_and_save(buffer) Perl_resume_compcv(aTHX_ buffer, true)
+
/*
* ex: set ts=8 sts=4 sw=4 et:
*/