diff options
Diffstat (limited to 'upstream/archlinux/man1/perlintern.1perl')
-rw-r--r-- | upstream/archlinux/man1/perlintern.1perl | 5045 |
1 files changed, 5045 insertions, 0 deletions
diff --git a/upstream/archlinux/man1/perlintern.1perl b/upstream/archlinux/man1/perlintern.1perl new file mode 100644 index 00000000..4e4e731c --- /dev/null +++ b/upstream/archlinux/man1/perlintern.1perl @@ -0,0 +1,5045 @@ +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. +.ie n \{\ +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "PERLINTERN 1perl" +.TH PERLINTERN 1perl 2024-02-11 "perl v5.38.2" "Perl Programmers Reference Guide" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH NAME +perlintern \- autogenerated documentation of purely internal +Perl functions +.SH DESCRIPTION +.IX Xref "internal Perl functions interpreter functions" +.IX Header "DESCRIPTION" +This file is the autogenerated documentation of functions in the +Perl interpreter that are documented using Perl's internal documentation +format but are not marked as part of the Perl API. In other words, +\&\fBthey are not for use in extensions\fR! +.PP +It has the same sections as perlapi, though some may be empty. +.SH "AV Handling" +.IX Header "AV Handling" +.ie n .IP """av_fetch_simple""" 4 +.el .IP \f(CWav_fetch_simple\fR 4 +.IX Xref "av_fetch_simple" +.IX Item "av_fetch_simple" +This is a cut-down version of av_fetch that assumes that the array is +very straightforward \- no magic, not readonly, and AvREAL \- and that +\&\f(CW\*(C`key\*(C'\fR is not negative. This function MUST NOT be used in situations +where any of those assumptions may not hold. +.Sp +Returns the SV at the specified index in the array. The \f(CW\*(C`key\*(C'\fR is the +index. If lval is true, you are guaranteed to get a real SV back (in case +it wasn't real before), which you can then modify. Check that the return +value is non-null before dereferencing it to a \f(CW\*(C`SV*\*(C'\fR. +.Sp +The rough perl equivalent is \f(CW$myarray[$key]\fR. +.RS 4 +.Sp +.Vb 1 +\& SV ** av_fetch_simple(AV *av, SSize_t key, I32 lval) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """AvFILLp""" 4 +.el .IP \f(CWAvFILLp\fR 4 +.IX Xref "AvFILLp" +.IX Item "AvFILLp" +If the array \f(CW\*(C`av\*(C'\fR is empty, this returns \-1; otherwise it returns the maximum +value of the indices of all the array elements which are currently defined in +\&\f(CW\*(C`av\*(C'\fR. It does not handle magic, hence the \f(CW\*(C`p\*(C'\fR private indication in its name. +.RS 4 +.Sp +.Vb 1 +\& SSize_t AvFILLp(AV* av) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """av_new_alloc""" 4 +.el .IP \f(CWav_new_alloc\fR 4 +.IX Xref "av_new_alloc" +.IX Item "av_new_alloc" +This implements "\f(CW\*(C`newAV_alloc_x\*(C'\fR" in perlapi +and "\f(CW\*(C`newAV_alloc_xz\*(C'\fR" in perlapi, which are the public API for this +functionality. +.Sp +Creates a new AV and allocates its SV* array. +.Sp +This is similar to, but more efficient than doing: +.Sp +.Vb 2 +\& AV *av = newAV(); +\& av_extend(av, key); +.Ve +.Sp +The size parameter is used to pre-allocate a SV* array large enough to +hold at least elements \f(CW\*(C`0..(size\-1)\*(C'\fR. \f(CW\*(C`size\*(C'\fR must be at least 1. +.Sp +The \f(CW\*(C`zeroflag\*(C'\fR parameter controls whether or not the array is NULL +initialized. +.RS 4 +.Sp +.Vb 1 +\& AV * av_new_alloc(SSize_t size, bool zeroflag) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """av_store_simple""" 4 +.el .IP \f(CWav_store_simple\fR 4 +.IX Xref "av_store_simple" +.IX Item "av_store_simple" +This is a cut-down version of av_store that assumes that the array is +very straightforward \- no magic, not readonly, and AvREAL \- and that +\&\f(CW\*(C`key\*(C'\fR is not negative. This function MUST NOT be used in situations +where any of those assumptions may not hold. +.Sp +Stores an SV in an array. The array index is specified as \f(CW\*(C`key\*(C'\fR. It +can be dereferenced to get the \f(CW\*(C`SV*\*(C'\fR that was stored there (= \f(CW\*(C`val\*(C'\fR)). +.Sp +Note that the caller is responsible for suitably incrementing the reference +count of \f(CW\*(C`val\*(C'\fR before the call. +.Sp +Approximate Perl equivalent: \f(CW\*(C`splice(@myarray, $key, 1, $val)\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& SV ** av_store_simple(AV *av, SSize_t key, SV *val) +.Ve +.RE +.RS 4 +.RE +.SH "Callback Functions" +.IX Header "Callback Functions" +.ie n .IP """dowantarray""" 4 +.el .IP \f(CWdowantarray\fR 4 +.IX Xref "dowantarray" +.IX Item "dowantarray" +\&\f(CW\*(C`\fR\f(CBDEPRECATED!\fR\f(CW\*(C'\fR It is planned to remove \f(CW\*(C`dowantarray\*(C'\fR +from a future release of Perl. Do not use it for +new code; remove it from existing code. +.Sp +Implements the deprecated "\f(CW\*(C`GIMME\*(C'\fR" in perlapi. +.RS 4 +.Sp +.Vb 1 +\& U8 dowantarray() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """leave_scope""" 4 +.el .IP \f(CWleave_scope\fR 4 +.IX Xref "leave_scope" +.IX Item "leave_scope" +Implements \f(CW\*(C`LEAVE_SCOPE\*(C'\fR which you should use instead. +.RS 4 +.Sp +.Vb 1 +\& void leave_scope(I32 base) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """magic_freedestruct""" 4 +.el .IP \f(CWmagic_freedestruct\fR 4 +.IX Xref "magic_freedestruct" +.IX Item "magic_freedestruct" +This function is called via magic to implement the +\&\f(CWmortal_destructor_sv()\fR and \f(CWmortal_destructor_x()\fR functions. It +should not be called directly and has no user servicable parts. +.RS 4 +.Sp +.Vb 1 +\& int magic_freedestruct(SV *sv, MAGIC *mg) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """mortal_svfunc_x""" 4 +.el .IP \f(CWmortal_svfunc_x\fR 4 +.IX Xref "mortal_svfunc_x" +.IX Item "mortal_svfunc_x" +This function arranges for a C function reference to be called at the +\&\fBend of the current statement\fR with the arguments provided. It is a +wrapper around \f(CWmortal_destructor_sv()\fR which ensures that the latter +function is called appropriately. +.Sp +Be aware that there is a signficant difference in timing between the +\&\fIend of the current statement\fR and the \fIend of the current pseudo +block\fR. If you are looking for a mechanism to trigger a function at the +end of the \fBcurrent pseudo block\fR you should look at +\&\f(CWSAVEDESTRUCTORX()\fR instead of this function. +.RS 4 +.Sp +.Vb 1 +\& void mortal_svfunc_x(SVFUNC_t f, SV *p) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pop_scope""" 4 +.el .IP \f(CWpop_scope\fR 4 +.IX Xref "pop_scope" +.IX Item "pop_scope" +Implements "\f(CW\*(C`LEAVE\*(C'\fR" in perlapi +.RS 4 +.Sp +.Vb 1 +\& void pop_scope() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """push_scope""" 4 +.el .IP \f(CWpush_scope\fR 4 +.IX Xref "push_scope" +.IX Item "push_scope" +Implements "\f(CW\*(C`ENTER\*(C'\fR" in perlapi +.RS 4 +.Sp +.Vb 1 +\& void push_scope() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_adelete""" 4 +.el .IP \f(CWsave_adelete\fR 4 +.IX Xref "save_adelete" +.IX Item "save_adelete" +Implements \f(CW\*(C`SAVEADELETE\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void save_adelete(AV *av, SSize_t key) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_freercpv""" 4 +.el .IP \f(CWsave_freercpv\fR 4 +.IX Xref "save_freercpv" +.IX Item "save_freercpv" +Implements \f(CW\*(C`SAVEFREERCPV\*(C'\fR. +.Sp +Saves and frees a refcounted string. Calls \fBrcpv_free()\fR +on the argument when the current pseudo block is finished. +.RS 4 +.Sp +.Vb 1 +\& void save_freercpv(char *rcpv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_generic_pvref""" 4 +.el .IP \f(CWsave_generic_pvref\fR 4 +.IX Xref "save_generic_pvref" +.IX Item "save_generic_pvref" +Implements \f(CW\*(C`SAVEGENERICPV\*(C'\fR. +.Sp +Like \fBsave_pptr()\fR, but also \fBSafefree()\fRs the new value if it is different +from the old one. Can be used to restore a global char* to its prior +contents, freeing new value. +.RS 4 +.Sp +.Vb 1 +\& void save_generic_pvref(char **str) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_generic_svref""" 4 +.el .IP \f(CWsave_generic_svref\fR 4 +.IX Xref "save_generic_svref" +.IX Item "save_generic_svref" +Implements \f(CW\*(C`SAVEGENERICSV\*(C'\fR. +.Sp +Like \fBsave_sptr()\fR, but also \fBSvREFCNT_dec()\fRs the new value. Can be used to +restore a global SV to its prior contents, freeing new value. +.RS 4 +.Sp +.Vb 1 +\& void save_generic_svref(SV **sptr) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_hdelete""" 4 +.el .IP \f(CWsave_hdelete\fR 4 +.IX Xref "save_hdelete" +.IX Item "save_hdelete" +Implements \f(CW\*(C`SAVEHDELETE\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void save_hdelete(HV *hv, SV *keysv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_hints""" 4 +.el .IP \f(CWsave_hints\fR 4 +.IX Xref "save_hints" +.IX Item "save_hints" +Implements \f(CW\*(C`SAVEHINTS\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void save_hints() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_op""" 4 +.el .IP \f(CWsave_op\fR 4 +.IX Xref "save_op" +.IX Item "save_op" +Implements \f(CW\*(C`SAVEOP\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void save_op() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_padsv_and_mortalize""" 4 +.el .IP \f(CWsave_padsv_and_mortalize\fR 4 +.IX Xref "save_padsv_and_mortalize" +.IX Item "save_padsv_and_mortalize" +Implements \f(CW\*(C`SAVEPADSVANDMORTALIZE\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void save_padsv_and_mortalize(PADOFFSET off) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_pushptr""" 4 +.el .IP \f(CWsave_pushptr\fR 4 +.IX Xref "save_pushptr" +.IX Item "save_pushptr" +The refcnt of object \f(CW\*(C`ptr\*(C'\fR will be decremented at the end of the current +\&\fIpseudo-block\fR. \f(CW\*(C`type\*(C'\fR gives the type of \f(CW\*(C`ptr\*(C'\fR, expressed as one of the +constants in \fIscope.h\fR whose name begins with \f(CW\*(C`SAVEt_\*(C'\fR. +.Sp +This is the underlying implementation of several macros, like +\&\f(CW\*(C`SAVEFREESV\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void save_pushptr(void * const ptr, const int type) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_rcpv""" 4 +.el .IP \f(CWsave_rcpv\fR 4 +.IX Xref "save_rcpv" +.IX Item "save_rcpv" +Implements \f(CW\*(C`SAVERCPV\*(C'\fR. +.Sp +Saves and restores a refcounted string, similar to what +save_generic_svref would do for a SV*. Can be used to restore +a refcounted string to its previous state. Performs the +appropriate refcount counting so that nothing should leak +or be prematurely freed. +.RS 4 +.Sp +.Vb 1 +\& void save_rcpv(char **prcpv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_scalar_at""" 4 +.el .IP \f(CWsave_scalar_at\fR 4 +.IX Xref "save_scalar_at" +.IX Item "save_scalar_at" +A helper function for localizing the SV referenced by \f(CW*sptr\fR. +.Sp +If \f(CW\*(C`SAVEf_KEEPOLDELEM\*(C'\fR is set in in \f(CW\*(C`flags\*(C'\fR, the function returns the input +scalar untouched. +.Sp +Otherwise it replaces \f(CW*sptr\fR with a new \f(CW\*(C`undef\*(C'\fR scalar, and returns that. +The new scalar will have the old one's magic (if any) copied to it. +If there is such magic, and \f(CW\*(C`SAVEf_SETMAGIC\*(C'\fR is set in in \f(CW\*(C`flags\*(C'\fR, 'set' +magic will be processed on the new scalar. If unset, 'set' magic will be +skipped. The latter typically means that assignment will soon follow (\fIe.g.\fR, +\&\f(CW\*(Aqlocal\ $x\ =\ $y\*(Aq\fR), and that will handle the magic. +.RS 4 +.Sp +.Vb 1 +\& SV * save_scalar_at(SV **sptr, const U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_set_svflags""" 4 +.el .IP \f(CWsave_set_svflags\fR 4 +.IX Xref "save_set_svflags" +.IX Item "save_set_svflags" +Implements \f(CW\*(C`SAVESETSVFLAGS\*(C'\fR. +.Sp +Set the SvFLAGS specified by mask to the values in val +.RS 4 +.Sp +.Vb 1 +\& void save_set_svflags(SV *sv, U32 mask, U32 val) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_shared_pvref""" 4 +.el .IP \f(CWsave_shared_pvref\fR 4 +.IX Xref "save_shared_pvref" +.IX Item "save_shared_pvref" +Implements \f(CW\*(C`SAVESHAREDPV\*(C'\fR. +.Sp +Like \fBsave_generic_pvref()\fR, but uses \fBPerlMemShared_free()\fR rather than \fBSafefree()\fR. +Can be used to restore a shared global char* to its prior +contents, freeing new value. +.RS 4 +.Sp +.Vb 1 +\& void save_shared_pvref(char **str) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """save_vptr""" 4 +.el .IP \f(CWsave_vptr\fR 4 +.IX Xref "save_vptr" +.IX Item "save_vptr" +Implements \f(CW\*(C`SAVEVPTR\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void save_vptr(void *ptr) +.Ve +.RE +.RS 4 +.RE +.SH Casting +.IX Xref "NUM2PTR" +.IX Header "Casting" +There are currently no internal API items in Casting +.SH "Character case changing" +.IX Header "Character case changing" +There are currently no internal API items in Character case changing +.SH "Character classification" +.IX Header "Character classification" +There are currently no internal API items in Character classification +.SH "Compiler and Preprocessor information" +.IX Header "Compiler and Preprocessor information" +There are currently no internal API items in Compiler and Preprocessor information +.SH "Compiler directives" +.IX Header "Compiler directives" +There are currently no internal API items in Compiler directives +.SH "Compile-time scope hooks" +.IX Header "Compile-time scope hooks" +.ie n .IP """BhkENTRY""" 4 +.el .IP \f(CWBhkENTRY\fR 4 +.IX Xref "BhkENTRY" +.IX Item "BhkENTRY" +NOTE: \f(CW\*(C`BhkENTRY\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +Return an entry from the BHK structure. \f(CW\*(C`which\*(C'\fR is a preprocessor token +indicating which entry to return. If the appropriate flag is not set +this will return \f(CW\*(C`NULL\*(C'\fR. The type of the return value depends on which +entry you ask for. +.RS 4 +.Sp +.Vb 1 +\& void * BhkENTRY(BHK *hk, token which) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """BhkFLAGS""" 4 +.el .IP \f(CWBhkFLAGS\fR 4 +.IX Xref "BhkFLAGS" +.IX Item "BhkFLAGS" +NOTE: \f(CW\*(C`BhkFLAGS\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +Return the BHK's flags. +.RS 4 +.Sp +.Vb 1 +\& U32 BhkFLAGS(BHK *hk) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """CALL_BLOCK_HOOKS""" 4 +.el .IP \f(CWCALL_BLOCK_HOOKS\fR 4 +.IX Xref "CALL_BLOCK_HOOKS" +.IX Item "CALL_BLOCK_HOOKS" +NOTE: \f(CW\*(C`CALL_BLOCK_HOOKS\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +Call all the registered block hooks for type \f(CW\*(C`which\*(C'\fR. \f(CW\*(C`which\*(C'\fR is a +preprocessing token; the type of \f(CW\*(C`arg\*(C'\fR depends on \f(CW\*(C`which\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void CALL_BLOCK_HOOKS(token which, arg) +.Ve +.RE +.RS 4 +.RE +.SH Concurrency +.IX Header "Concurrency" +.ie n .IP """CVf_SLABBED""" 4 +.el .IP \f(CWCVf_SLABBED\fR 4 +.IX Item "CVf_SLABBED" +.PD 0 +.ie n .IP """CvROOT""" 4 +.el .IP \f(CWCvROOT\fR 4 +.IX Item "CvROOT" +.ie n .IP """CvSTART""" 4 +.el .IP \f(CWCvSTART\fR 4 +.IX Item "CvSTART" +.PD +Described in perlguts. +.ie n .IP """CX_CUR""" 4 +.el .IP \f(CWCX_CUR\fR 4 +.IX Item "CX_CUR" +Described in perlguts. +.RS 4 +.Sp +.Vb 1 +\& CX_CUR() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """CXINC""" 4 +.el .IP \f(CWCXINC\fR 4 +.IX Item "CXINC" +Described in perlguts. +.ie n .IP """CX_LEAVE_SCOPE""" 4 +.el .IP \f(CWCX_LEAVE_SCOPE\fR 4 +.IX Item "CX_LEAVE_SCOPE" +Described in perlguts. +.RS 4 +.Sp +.Vb 1 +\& void CX_LEAVE_SCOPE(PERL_CONTEXT* cx) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """CX_POP""" 4 +.el .IP \f(CWCX_POP\fR 4 +.IX Item "CX_POP" +Described in perlguts. +.RS 4 +.Sp +.Vb 1 +\& void CX_POP(PERL_CONTEXT* cx) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """cxstack""" 4 +.el .IP \f(CWcxstack\fR 4 +.IX Item "cxstack" +Described in perlguts. +.ie n .IP """cxstack_ix""" 4 +.el .IP \f(CWcxstack_ix\fR 4 +.IX Item "cxstack_ix" +Described in perlguts. +.ie n .IP """CXt_BLOCK""" 4 +.el .IP \f(CWCXt_BLOCK\fR 4 +.IX Item "CXt_BLOCK" +.PD 0 +.ie n .IP """CXt_EVAL""" 4 +.el .IP \f(CWCXt_EVAL\fR 4 +.IX Item "CXt_EVAL" +.ie n .IP """CXt_FORMAT""" 4 +.el .IP \f(CWCXt_FORMAT\fR 4 +.IX Item "CXt_FORMAT" +.ie n .IP """CXt_GIVEN""" 4 +.el .IP \f(CWCXt_GIVEN\fR 4 +.IX Item "CXt_GIVEN" +.ie n .IP """CXt_LOOP_ARY""" 4 +.el .IP \f(CWCXt_LOOP_ARY\fR 4 +.IX Item "CXt_LOOP_ARY" +.ie n .IP """CXt_LOOP_LAZYIV""" 4 +.el .IP \f(CWCXt_LOOP_LAZYIV\fR 4 +.IX Item "CXt_LOOP_LAZYIV" +.ie n .IP """CXt_LOOP_LAZYSV""" 4 +.el .IP \f(CWCXt_LOOP_LAZYSV\fR 4 +.IX Item "CXt_LOOP_LAZYSV" +.ie n .IP """CXt_LOOP_LIST""" 4 +.el .IP \f(CWCXt_LOOP_LIST\fR 4 +.IX Item "CXt_LOOP_LIST" +.ie n .IP """CXt_LOOP_PLAIN""" 4 +.el .IP \f(CWCXt_LOOP_PLAIN\fR 4 +.IX Item "CXt_LOOP_PLAIN" +.ie n .IP """CXt_NULL""" 4 +.el .IP \f(CWCXt_NULL\fR 4 +.IX Item "CXt_NULL" +.ie n .IP """CXt_SUB""" 4 +.el .IP \f(CWCXt_SUB\fR 4 +.IX Item "CXt_SUB" +.ie n .IP """CXt_SUBST""" 4 +.el .IP \f(CWCXt_SUBST\fR 4 +.IX Item "CXt_SUBST" +.ie n .IP """CXt_WHEN""" 4 +.el .IP \f(CWCXt_WHEN\fR 4 +.IX Item "CXt_WHEN" +.PD +Described in perlguts. +.ie n .IP """cx_type""" 4 +.el .IP \f(CWcx_type\fR 4 +.IX Item "cx_type" +Described in perlguts. +.ie n .IP """dounwind""" 4 +.el .IP \f(CWdounwind\fR 4 +.IX Item "dounwind" +Described in perlguts. +.RS 4 +.Sp +.Vb 1 +\& void dounwind(I32 cxix) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """my_fork""" 4 +.el .IP \f(CWmy_fork\fR 4 +.IX Xref "my_fork" +.IX Item "my_fork" +This is for the use of \f(CW\*(C`PerlProc_fork\*(C'\fR as a wrapper for the C library +\&\fBfork\fR\|(2) on some platforms to hide some platform quirks. It should not be +used except through \f(CW\*(C`PerlProc_fork\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& Pid_t my_fork() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PERL_CONTEXT""" 4 +.el .IP \f(CWPERL_CONTEXT\fR 4 +.IX Item "PERL_CONTEXT" +Described in perlguts. +.SH "COPs and Hint Hashes" +.IX Header "COPs and Hint Hashes" +There are currently no internal API items in COPs and Hint Hashes +.SH "Custom Operators" +.IX Header "Custom Operators" +.ie n .IP """core_prototype""" 4 +.el .IP \f(CWcore_prototype\fR 4 +.IX Xref "core_prototype" +.IX Item "core_prototype" +This function assigns the prototype of the named core function to \f(CW\*(C`sv\*(C'\fR, or +to a new mortal SV if \f(CW\*(C`sv\*(C'\fR is \f(CW\*(C`NULL\*(C'\fR. It returns the modified \f(CW\*(C`sv\*(C'\fR, or +\&\f(CW\*(C`NULL\*(C'\fR if the core function has no prototype. \f(CW\*(C`code\*(C'\fR is a code as returned +by \f(CWkeyword()\fR. It must not be equal to 0. +.RS 4 +.Sp +.Vb 2 +\& SV * core_prototype(SV *sv, const char *name, const int code, +\& int * const opnum) +.Ve +.RE +.RS 4 +.RE +.SH "CV Handling" +.IX Header "CV Handling" +.ie n .IP """CvREFCOUNTED_ANYSV""" 4 +.el .IP \f(CWCvREFCOUNTED_ANYSV\fR 4 +.IX Xref "CvREFCOUNTED_ANYSV" +.IX Item "CvREFCOUNTED_ANYSV" +If true, indicates that the \f(CW\*(C`CvXSUBANY(cv).any_sv\*(C'\fR member contains an SV +pointer whose reference count should be decremented when the CV itself is +freed. In addition, \f(CWcv_clone()\fR will increment the reference count, and +\&\f(CWsv_dup()\fR will duplicate the entire pointed-to SV if this flag is set. +.Sp +Any CV that wraps an XSUB has an \f(CW\*(C`ANY\*(C'\fR union that the XSUB function is free +to use for its own purposes. It may be the case that the code wishes to store +an SV in the \f(CW\*(C`any_sv\*(C'\fR member of this union. By setting this flag, this SV +reference will be properly reclaimed or duplicated when the CV itself is. +.RS 4 +.Sp +.Vb 1 +\& bool CvREFCOUNTED_ANYSV(CV *cv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """CvREFCOUNTED_ANYSV_off""" 4 +.el .IP \f(CWCvREFCOUNTED_ANYSV_off\fR 4 +.IX Xref "CvREFCOUNTED_ANYSV_off" +.IX Item "CvREFCOUNTED_ANYSV_off" +Helper macro to turn off the \f(CW\*(C`CvREFCOUNTED_ANYSV\*(C'\fR flag. +.RS 4 +.Sp +.Vb 1 +\& void CvREFCOUNTED_ANYSV_off(CV *cv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """CvREFCOUNTED_ANYSV_on""" 4 +.el .IP \f(CWCvREFCOUNTED_ANYSV_on\fR 4 +.IX Xref "CvREFCOUNTED_ANYSV_on" +.IX Item "CvREFCOUNTED_ANYSV_on" +Helper macro to turn on the \f(CW\*(C`CvREFCOUNTED_ANYSV\*(C'\fR flag. +.RS 4 +.Sp +.Vb 1 +\& void CvREFCOUNTED_ANYSV_on(CV *cv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """CvWEAKOUTSIDE""" 4 +.el .IP \f(CWCvWEAKOUTSIDE\fR 4 +.IX Xref "CvWEAKOUTSIDE" +.IX Item "CvWEAKOUTSIDE" +Each CV has a pointer, \f(CWCvOUTSIDE()\fR, to its lexically enclosing +CV (if any). Because pointers to anonymous sub prototypes are +stored in \f(CW\*(C`&\*(C'\fR pad slots, it is a possible to get a circular reference, +with the parent pointing to the child and vice-versa. To avoid the +ensuing memory leak, we do not increment the reference count of the CV +pointed to by \f(CW\*(C`CvOUTSIDE\*(C'\fR in the \fIone specific instance\fR that the parent +has a \f(CW\*(C`&\*(C'\fR pad slot pointing back to us. In this case, we set the +\&\f(CW\*(C`CvWEAKOUTSIDE\*(C'\fR flag in the child. This allows us to determine under what +circumstances we should decrement the refcount of the parent when freeing +the child. +.Sp +There is a further complication with non-closure anonymous subs (i.e. those +that do not refer to any lexicals outside that sub). In this case, the +anonymous prototype is shared rather than being cloned. This has the +consequence that the parent may be freed while there are still active +children, \fIe.g.\fR, +.Sp +.Vb 1 +\& BEGIN { $a = sub { eval \*(Aq$x\*(Aq } } +.Ve +.Sp +In this case, the BEGIN is freed immediately after execution since there +are no active references to it: the anon sub prototype has +\&\f(CW\*(C`CvWEAKOUTSIDE\*(C'\fR set since it's not a closure, and \f(CW$a\fR points to the same +CV, so it doesn't contribute to BEGIN's refcount either. When \f(CW$a\fR is +executed, the \f(CW\*(C`eval \*(Aq$x\*(Aq\*(C'\fR causes the chain of \f(CW\*(C`CvOUTSIDE\*(C'\fRs to be followed, +and the freed BEGIN is accessed. +.Sp +To avoid this, whenever a CV and its associated pad is freed, any +\&\f(CW\*(C`&\*(C'\fR entries in the pad are explicitly removed from the pad, and if the +refcount of the pointed-to anon sub is still positive, then that +child's \f(CW\*(C`CvOUTSIDE\*(C'\fR is set to point to its grandparent. This will only +occur in the single specific case of a non-closure anon prototype +having one or more active references (such as \f(CW$a\fR above). +.Sp +One other thing to consider is that a CV may be merely undefined +rather than freed, eg \f(CW\*(C`undef &foo\*(C'\fR. In this case, its refcount may +not have reached zero, but we still delete its pad and its \f(CW\*(C`CvROOT\*(C'\fR etc. +Since various children may still have their \f(CW\*(C`CvOUTSIDE\*(C'\fR pointing at this +undefined CV, we keep its own \f(CW\*(C`CvOUTSIDE\*(C'\fR for the time being, so that +the chain of lexical scopes is unbroken. For example, the following +should print 123: +.Sp +.Vb 5 +\& my $x = 123; +\& sub tmp { sub { eval \*(Aq$x\*(Aq } } +\& my $a = tmp(); +\& undef &tmp; +\& print $a\->(); +.Ve +.RS 4 +.Sp +.Vb 1 +\& bool CvWEAKOUTSIDE(CV *cv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """docatch""" 4 +.el .IP \f(CWdocatch\fR 4 +.IX Xref "docatch" +.IX Item "docatch" +Interpose, for the current op and RUNOPS loop, +.Sp +.Vb 3 +\& \- a new JMPENV stack catch frame, and +\& \- an inner RUNOPS loop to run all the remaining ops following the +\& current PL_op. +.Ve +.Sp +Then handle any exceptions raised while in that loop. +For a caught eval at this level, re-enter the loop with the specified +restart op (i.e. the op following the OP_LEAVETRY etc); otherwise re-throw +the exception. +.Sp +\&\fBdocatch()\fR is intended to be used like this: +.Sp +.Vb 4 +\& PP(pp_entertry) +\& { +\& if (CATCH_GET) +\& return docatch(Perl_pp_entertry); +\& +\& ... rest of function ... +\& return PL_op\->op_next; +\& } +.Ve +.Sp +If a new catch frame isn't needed, the op behaves normally. Otherwise it +calls \fBdocatch()\fR, which recursively calls \fBpp_entertry()\fR, this time with +\&\fBCATCH_GET()\fR false, so the rest of the body of the entertry is run. Then +\&\fBdocatch()\fR calls \fBCALLRUNOPS()\fR which executes all the ops following the +entertry. When the loop finally finishes, control returns to \fBdocatch()\fR, +which pops the JMPENV and returns to the parent \fBpp_entertry()\fR, which +itself immediately returns. Note that *all* subsequent ops are run within +the inner RUNOPS loop, not just the body of the eval. For example, in +.Sp +.Vb 2 +\& sub TIEARRAY { eval {1}; my $x } +\& tie @a, "main"; +.Ve +.Sp +at the point the 'my' is executed, the C stack will look something like: +.Sp +.Vb 11 +\& #10 main() +\& #9 perl_run() # JMPENV_PUSH level 1 here +\& #8 S_run_body() +\& #7 Perl_runops_standard() # main RUNOPS loop +\& #6 Perl_pp_tie() +\& #5 Perl_call_sv() +\& #4 Perl_runops_standard() # unguarded RUNOPS loop: no new JMPENV +\& #3 Perl_pp_entertry() +\& #2 S_docatch() # JMPENV_PUSH level 2 here +\& #1 Perl_runops_standard() # docatch()\*(Aqs RUNOPs loop +\& #0 Perl_pp_padsv() +.Ve +.Sp +Basically, any section of the perl core which starts a RUNOPS loop may +make a promise that it will catch any exceptions and restart the loop if +necessary. If it's not prepared to do that (like \fBcall_sv()\fR isn't), then +it sets \fBCATCH_GET()\fR to true, so that any later eval-like code knows to +set up a new handler and loop (via \fBdocatch()\fR). +.Sp +See "Exception handing" in perlinterp for further details. +.RS 4 +.Sp +.Vb 1 +\& OP * docatch(Perl_ppaddr_t firstpp) +.Ve +.RE +.RS 4 +.RE +.SH Debugging +.IX Header "Debugging" +.ie n .IP """comma_aDEPTH""" 4 +.el .IP \f(CWcomma_aDEPTH\fR 4 +.IX Xref "comma_aDEPTH" +.IX Item "comma_aDEPTH" +Some functions when compiled under DEBUGGING take an extra final argument named +\&\f(CW\*(C`depth\*(C'\fR, indicating the C stack depth. This argument is omitted otherwise. +This macro expands to either \f(CW\*(C`,\ depth\*(C'\fR under DEBUGGING, or to nothing at +all when not under DEBUGGING, reducing the number of \f(CW\*(C`#ifdef\*(C'\fR's in the code. +.Sp +The program is responsible for maintaining the correct value for \f(CW\*(C`depth\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& comma_aDEPTH +.Ve +.RE +.RS 4 +.RE +.ie n .IP """comma_pDEPTH""" 4 +.el .IP \f(CWcomma_pDEPTH\fR 4 +.IX Xref "comma_pDEPTH" +.IX Item "comma_pDEPTH" +This is used in the prototype declarations for functions that take a "\f(CW\*(C`comma_aDEPTH\*(C'\fR" +final parameter, much like \f(CW\*(C`pTHX_\*(C'\fR +is used in functions that take a thread context initial parameter. +.ie n .IP """debop""" 4 +.el .IP \f(CWdebop\fR 4 +.IX Xref "debop" +.IX Item "debop" +Implements \fB\-Dt\fR perl command line option on OP \f(CW\*(C`o\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& I32 debop(const OP *o) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """debprof""" 4 +.el .IP \f(CWdebprof\fR 4 +.IX Xref "debprof" +.IX Item "debprof" +Called to indicate that \f(CW\*(C`o\*(C'\fR was executed, for profiling purposes under the +\&\f(CW\*(C`\-DP\*(C'\fR command line option. +.RS 4 +.Sp +.Vb 1 +\& void debprof(const OP *o) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """debprofdump""" 4 +.el .IP \f(CWdebprofdump\fR 4 +.IX Xref "debprofdump" +.IX Item "debprofdump" +Dumps the contents of the data collected by the \f(CW\*(C`\-DP\*(C'\fR perl command line +option. +.RS 4 +.Sp +.Vb 1 +\& void debprofdump() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """debug_aDEPTH""" 4 +.el .IP \f(CWdebug_aDEPTH\fR 4 +.IX Xref "debug_aDEPTH" +.IX Item "debug_aDEPTH" +Same as "\f(CW\*(C`comma_aDEPTH\*(C'\fR" but with no leading argument. Intended for functions with +no normal arguments, and used by "\f(CW\*(C`comma_aDEPTH\*(C'\fR" itself. +.RS 4 +.Sp +.Vb 1 +\& debug_aDEPTH +.Ve +.RE +.RS 4 +.RE +.ie n .IP """debug_pDEPTH""" 4 +.el .IP \f(CWdebug_pDEPTH\fR 4 +.IX Xref "debug_pDEPTH" +.IX Item "debug_pDEPTH" +Same as "\f(CW\*(C`comma_pDEPTH\*(C'\fR" but with no leading argument. Intended for functions with +no normal arguments, and used by "\f(CW\*(C`comma_pDEPTH\*(C'\fR" itself. +.RS 4 +.Sp +.Vb 1 +\& debug_pDEPTH +.Ve +.RE +.RS 4 +.RE +.ie n .IP """free_c_backtrace""" 4 +.el .IP \f(CWfree_c_backtrace\fR 4 +.IX Xref "free_c_backtrace" +.IX Item "free_c_backtrace" +Deallocates a backtrace received from get_c_backtrace. +.RS 4 +.Sp +.Vb 1 +\& void free_c_backtrace(Perl_c_backtrace *bt) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """get_c_backtrace""" 4 +.el .IP \f(CWget_c_backtrace\fR 4 +.IX Xref "get_c_backtrace" +.IX Item "get_c_backtrace" +Collects the backtrace (aka "stacktrace") into a single linear +malloced buffer, which the caller \fBmust\fR \f(CWPerl_free_c_backtrace()\fR. +.Sp +Scans the frames back by \f(CW\*(C`depth\ +\ skip\*(C'\fR, then drops the \f(CW\*(C`skip\*(C'\fR innermost, +returning at most \f(CW\*(C`depth\*(C'\fR frames. +.RS 4 +.Sp +.Vb 1 +\& Perl_c_backtrace * get_c_backtrace(int max_depth, int skip) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PL_DBsingle""" 4 +.el .IP \f(CWPL_DBsingle\fR 4 +.IX Xref "PL_DBsingle" +.IX Item "PL_DBsingle" +When Perl is run in debugging mode, with the \fB\-d\fR switch, this SV is a +boolean which indicates whether subs are being single-stepped. +Single-stepping is automatically turned on after every step. This is the C +variable which corresponds to Perl's \f(CW$DB::single\fR variable. See +\&\f(CW"PL_DBsub"\fR. +.Sp +On threaded perls, each thread has an independent copy of this variable; +each initialized at creation time with the current value of the creating +thread's copy. +.RS 4 +.Sp +.Vb 1 +\& SV * PL_DBsingle +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PL_DBsub""" 4 +.el .IP \f(CWPL_DBsub\fR 4 +.IX Xref "PL_DBsub" +.IX Item "PL_DBsub" +When Perl is run in debugging mode, with the \fB\-d\fR switch, this GV contains +the SV which holds the name of the sub being debugged. This is the C +variable which corresponds to Perl's \f(CW$DB::sub\fR variable. See +\&\f(CW"PL_DBsingle"\fR. +.Sp +On threaded perls, each thread has an independent copy of this variable; +each initialized at creation time with the current value of the creating +thread's copy. +.RS 4 +.Sp +.Vb 1 +\& GV * PL_DBsub +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PL_DBtrace""" 4 +.el .IP \f(CWPL_DBtrace\fR 4 +.IX Xref "PL_DBtrace" +.IX Item "PL_DBtrace" +Trace variable used when Perl is run in debugging mode, with the \fB\-d\fR +switch. This is the C variable which corresponds to Perl's \f(CW$DB::trace\fR +variable. See \f(CW"PL_DBsingle"\fR. +.Sp +On threaded perls, each thread has an independent copy of this variable; +each initialized at creation time with the current value of the creating +thread's copy. +.RS 4 +.Sp +.Vb 1 +\& SV * PL_DBtrace +.Ve +.RE +.RS 4 +.RE +.ie n .IP """runops_debug""" 4 +.el .IP \f(CWrunops_debug\fR 4 +.IX Item "runops_debug" +Described in perlguts. +.RS 4 +.Sp +.Vb 1 +\& int runops_debug() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """runops_standard""" 4 +.el .IP \f(CWrunops_standard\fR 4 +.IX Item "runops_standard" +Described in perlguts. +.RS 4 +.Sp +.Vb 1 +\& int runops_standard() +.Ve +.RE +.RS 4 +.RE +.SH "Display functions" +.IX Xref "PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_NOCLEAR PERL_PV_PRETTY_REGPROP" +.IX Header "Display functions" +.ie n .IP """sv_peek""" 4 +.el .IP \f(CWsv_peek\fR 4 +.IX Xref "sv_peek" +.IX Item "sv_peek" +Implements \f(CW\*(C`SvPEEK\*(C'\fR +.RS 4 +.Sp +.Vb 1 +\& char * sv_peek(SV *sv) +.Ve +.RE +.RS 4 +.RE +.SH "Embedding, Threads, and Interpreter Cloning" +.IX Header "Embedding, Threads, and Interpreter Cloning" +.ie n .IP """cv_dump""" 4 +.el .IP \f(CWcv_dump\fR 4 +.IX Xref "cv_dump" +.IX Item "cv_dump" +dump the contents of a CV +.RS 4 +.Sp +.Vb 1 +\& void cv_dump(const CV *cv, const char *title) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """cv_forget_slab""" 4 +.el .IP \f(CWcv_forget_slab\fR 4 +.IX Xref "cv_forget_slab" +.IX Item "cv_forget_slab" +When a CV has a reference count on its slab (\f(CW\*(C`CvSLABBED\*(C'\fR), it is responsible +for making sure it is freed. (Hence, no two CVs should ever have a +reference count on the same slab.) The CV only needs to reference the slab +during compilation. Once it is compiled and \f(CW\*(C`CvROOT\*(C'\fR attached, it has +finished its job, so it can forget the slab. +.RS 4 +.Sp +.Vb 1 +\& void cv_forget_slab(CV *cv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """do_dump_pad""" 4 +.el .IP \f(CWdo_dump_pad\fR 4 +.IX Xref "do_dump_pad" +.IX Item "do_dump_pad" +Dump the contents of a padlist +.RS 4 +.Sp +.Vb 2 +\& void do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist, +\& int full) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """get_context""" 4 +.el .IP \f(CWget_context\fR 4 +.IX Xref "get_context" +.IX Item "get_context" +Implements "\f(CW\*(C`PERL_GET_CONTEXT\*(C'\fR" in perlapi, which you should use instead. +.RS 4 +.Sp +.Vb 1 +\& void * get_context() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_alloc_name""" 4 +.el .IP \f(CWpad_alloc_name\fR 4 +.IX Xref "pad_alloc_name" +.IX Item "pad_alloc_name" +Allocates a place in the currently-compiling +pad (via "pad_alloc" in perlapi) and +then stores a name for that entry. \f(CW\*(C`name\*(C'\fR is adopted and +becomes the name entry; it must already contain the name +string. \f(CW\*(C`typestash\*(C'\fR and \f(CW\*(C`ourstash\*(C'\fR and the \f(CW\*(C`padadd_STATE\*(C'\fR +flag get added to \f(CW\*(C`name\*(C'\fR. None of the other +processing of "pad_add_name_pvn" in perlapi +is done. Returns the offset of the allocated pad slot. +.RS 4 +.Sp +.Vb 2 +\& PADOFFSET pad_alloc_name(PADNAME *name, U32 flags, HV *typestash, +\& HV *ourstash) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_block_start""" 4 +.el .IP \f(CWpad_block_start\fR 4 +.IX Xref "pad_block_start" +.IX Item "pad_block_start" +Update the pad compilation state variables on entry to a new block. +.RS 4 +.Sp +.Vb 1 +\& void pad_block_start(int full) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_check_dup""" 4 +.el .IP \f(CWpad_check_dup\fR 4 +.IX Xref "pad_check_dup" +.IX Item "pad_check_dup" +Check for duplicate declarations: report any of: +.Sp +.Vb 3 +\& * a \*(Aqmy\*(Aq in the current scope with the same name; +\& * an \*(Aqour\*(Aq (anywhere in the pad) with the same name and the +\& same stash as \*(Aqourstash\*(Aq +.Ve +.Sp +\&\f(CW\*(C`is_our\*(C'\fR indicates that the name to check is an \f(CW"our"\fR declaration. +.RS 4 +.Sp +.Vb 1 +\& void pad_check_dup(PADNAME *name, U32 flags, const HV *ourstash) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_findlex""" 4 +.el .IP \f(CWpad_findlex\fR 4 +.IX Xref "pad_findlex" +.IX Item "pad_findlex" +Find a named lexical anywhere in a chain of nested pads. Add fake entries +in the inner pads if it's found in an outer one. +.Sp +Returns the offset in the bottom pad of the lex or the fake lex. +\&\f(CW\*(C`cv\*(C'\fR is the CV in which to start the search, and seq is the current \f(CW\*(C`cop_seq\*(C'\fR +to match against. If \f(CW\*(C`warn\*(C'\fR is true, print appropriate warnings. The \f(CW\*(C`out_\*(C'\fR* +vars return values, and so are pointers to where the returned values +should be stored. \f(CW\*(C`out_capture\*(C'\fR, if non-null, requests that the innermost +instance of the lexical is captured; \f(CW\*(C`out_name\*(C'\fR is set to the innermost +matched pad name or fake pad name; \f(CW\*(C`out_flags\*(C'\fR returns the flags normally +associated with the \f(CW\*(C`PARENT_FAKELEX_FLAGS\*(C'\fR field of a fake pad name. +.Sp +Note that \f(CWpad_findlex()\fR is recursive; it recurses up the chain of CVs, +then comes back down, adding fake entries +as it goes. It has to be this way +because fake names in anon prototypes have to store in \f(CW\*(C`xpadn_low\*(C'\fR the +index into the parent pad. +.RS 4 +.Sp +.Vb 4 +\& PADOFFSET pad_findlex(const char *namepv, STRLEN namelen, +\& U32 flags, const CV *cv, U32 seq, int warn, +\& SV **out_capture, PADNAME **out_name, +\& int *out_flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_fixup_inner_anons""" 4 +.el .IP \f(CWpad_fixup_inner_anons\fR 4 +.IX Xref "pad_fixup_inner_anons" +.IX Item "pad_fixup_inner_anons" +For any anon CVs in the pad, change \f(CW\*(C`CvOUTSIDE\*(C'\fR of that CV from +\&\f(CW\*(C`old_cv\*(C'\fR to \f(CW\*(C`new_cv\*(C'\fR if necessary. Needed when a newly-compiled CV has to be +moved to a pre-existing CV struct. +.RS 4 +.Sp +.Vb 2 +\& void pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv, +\& CV *new_cv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_free""" 4 +.el .IP \f(CWpad_free\fR 4 +.IX Xref "pad_free" +.IX Item "pad_free" +Free the SV at offset po in the current pad. +.RS 4 +.Sp +.Vb 1 +\& void pad_free(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_leavemy""" 4 +.el .IP \f(CWpad_leavemy\fR 4 +.IX Xref "pad_leavemy" +.IX Item "pad_leavemy" +Cleanup at end of scope during compilation: set the max seq number for +lexicals in this scope and warn of any lexicals that never got introduced. +.RS 4 +.Sp +.Vb 1 +\& OP * pad_leavemy() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """padlist_dup""" 4 +.el .IP \f(CWpadlist_dup\fR 4 +.IX Xref "padlist_dup" +.IX Item "padlist_dup" +Duplicates a pad. +.RS 4 +.Sp +.Vb 1 +\& PADLIST * padlist_dup(PADLIST *srcpad, CLONE_PARAMS *param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """padname_dup""" 4 +.el .IP \f(CWpadname_dup\fR 4 +.IX Xref "padname_dup" +.IX Item "padname_dup" +Duplicates a pad name. +.RS 4 +.Sp +.Vb 1 +\& PADNAME * padname_dup(PADNAME *src, CLONE_PARAMS *param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """padnamelist_dup""" 4 +.el .IP \f(CWpadnamelist_dup\fR 4 +.IX Xref "padnamelist_dup" +.IX Item "padnamelist_dup" +Duplicates a pad name list. +.RS 4 +.Sp +.Vb 2 +\& PADNAMELIST * padnamelist_dup(PADNAMELIST *srcpad, +\& CLONE_PARAMS *param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_push""" 4 +.el .IP \f(CWpad_push\fR 4 +.IX Xref "pad_push" +.IX Item "pad_push" +Push a new pad frame onto the padlist, unless there's already a pad at +this depth, in which case don't bother creating a new one. Then give +the new pad an \f(CW@_\fR in slot zero. +.RS 4 +.Sp +.Vb 1 +\& void pad_push(PADLIST *padlist, int depth) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_reset""" 4 +.el .IP \f(CWpad_reset\fR 4 +.IX Xref "pad_reset" +.IX Item "pad_reset" +Mark all the current temporaries for reuse +.RS 4 +.Sp +.Vb 1 +\& void pad_reset() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_setsv""" 4 +.el .IP \f(CWpad_setsv\fR 4 +.IX Xref "pad_setsv" +.IX Item "pad_setsv" +Set the value at offset \f(CW\*(C`po\*(C'\fR in the current (compiling or executing) pad. +Use the macro \f(CWPAD_SETSV()\fR rather than calling this function directly. +.RS 4 +.Sp +.Vb 1 +\& void pad_setsv(PADOFFSET po, SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_sv""" 4 +.el .IP \f(CWpad_sv\fR 4 +.IX Xref "pad_sv" +.IX Item "pad_sv" +Get the value at offset \f(CW\*(C`po\*(C'\fR in the current (compiling or executing) pad. +Use macro \f(CW\*(C`PAD_SV\*(C'\fR instead of calling this function directly. +.RS 4 +.Sp +.Vb 1 +\& SV * pad_sv(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """pad_swipe""" 4 +.el .IP \f(CWpad_swipe\fR 4 +.IX Xref "pad_swipe" +.IX Item "pad_swipe" +Abandon the tmp in the current pad at offset \f(CW\*(C`po\*(C'\fR and replace with a +new one. +.RS 4 +.Sp +.Vb 1 +\& void pad_swipe(PADOFFSET po, bool refadjust) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """set_context""" 4 +.el .IP \f(CWset_context\fR 4 +.IX Xref "set_context" +.IX Item "set_context" +Implements "\f(CW\*(C`PERL_SET_CONTEXT\*(C'\fR" in perlapi, which you should use instead. +.RS 4 +.Sp +.Vb 1 +\& void set_context(void *t) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """si_dup""" 4 +.el .IP \f(CWsi_dup\fR 4 +.IX Xref "si_dup" +.IX Item "si_dup" +Duplicate a stack info structure, returning a pointer to the cloned object. +.RS 4 +.Sp +.Vb 1 +\& PERL_SI * si_dup(PERL_SI *si, CLONE_PARAMS *param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """ss_dup""" 4 +.el .IP \f(CWss_dup\fR 4 +.IX Xref "ss_dup" +.IX Item "ss_dup" +Duplicate the save stack, returning a pointer to the cloned object. +.RS 4 +.Sp +.Vb 1 +\& ANY * ss_dup(PerlInterpreter *proto_perl, CLONE_PARAMS *param) +.Ve +.RE +.RS 4 +.RE +.SH Errno +.IX Header "Errno" +.ie n .IP """dSAVEDERRNO""" 4 +.el .IP \f(CWdSAVEDERRNO\fR 4 +.IX Xref "dSAVEDERRNO" +.IX Item "dSAVEDERRNO" +Declare variables needed to save \f(CW\*(C`errno\*(C'\fR and any operating system +specific error number. +.RS 4 +.Sp +.Vb 1 +\& void dSAVEDERRNO +.Ve +.RE +.RS 4 +.RE +.ie n .IP """dSAVE_ERRNO""" 4 +.el .IP \f(CWdSAVE_ERRNO\fR 4 +.IX Xref "dSAVE_ERRNO" +.IX Item "dSAVE_ERRNO" +Declare variables needed to save \f(CW\*(C`errno\*(C'\fR and any operating system +specific error number, and save them for optional later restoration +by \f(CW\*(C`RESTORE_ERRNO\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void dSAVE_ERRNO +.Ve +.RE +.RS 4 +.RE +.ie n .IP """RESTORE_ERRNO""" 4 +.el .IP \f(CWRESTORE_ERRNO\fR 4 +.IX Xref "RESTORE_ERRNO" +.IX Item "RESTORE_ERRNO" +Restore \f(CW\*(C`errno\*(C'\fR and any operating system specific error number that +was saved by \f(CW\*(C`dSAVE_ERRNO\*(C'\fR or \f(CW\*(C`RESTORE_ERRNO\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void RESTORE_ERRNO +.Ve +.RE +.RS 4 +.RE +.ie n .IP """SAVE_ERRNO""" 4 +.el .IP \f(CWSAVE_ERRNO\fR 4 +.IX Xref "SAVE_ERRNO" +.IX Item "SAVE_ERRNO" +Save \f(CW\*(C`errno\*(C'\fR and any operating system specific error number for +optional later restoration by \f(CW\*(C`RESTORE_ERRNO\*(C'\fR. Requires +\&\f(CW\*(C`dSAVEDERRNO\*(C'\fR or \f(CW\*(C`dSAVE_ERRNO\*(C'\fR in scope. +.RS 4 +.Sp +.Vb 1 +\& void SAVE_ERRNO +.Ve +.RE +.RS 4 +.RE +.ie n .IP """SETERRNO""" 4 +.el .IP \f(CWSETERRNO\fR 4 +.IX Xref "SETERRNO" +.IX Item "SETERRNO" +Set \f(CW\*(C`errno\*(C'\fR, and on VMS set \f(CW\*(C`vaxc$errno\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void SETERRNO(int errcode, int vmserrcode) +.Ve +.RE +.RS 4 +.RE +.SH "Exception Handling (simple) Macros" +.IX Header "Exception Handling (simple) Macros" +There are currently no internal API items in Exception Handling (simple) Macros +.SH "Filesystem configuration values" +.IX Header "Filesystem configuration values" +There are currently no internal API items in Filesystem configuration values +.SH "Floating point" +.IX Header "Floating point" +There are currently no internal API items in Floating point +.SH "General Configuration" +.IX Header "General Configuration" +There are currently no internal API items in General Configuration +.SH "Global Variables" +.IX Header "Global Variables" +There are currently no internal API items in Global Variables +.SH "GV Handling and Stashes" +.IX Xref "GV_CACHE_ONLY" +.IX Header "GV Handling and Stashes" +.ie n .IP """amagic_applies""" 4 +.el .IP \f(CWamagic_applies\fR 4 +.IX Xref "amagic_applies" +.IX Item "amagic_applies" +Check \f(CW\*(C`sv\*(C'\fR to see if the overloaded (active magic) operation \f(CW\*(C`method\*(C'\fR +applies to it. If the sv is not SvROK or it is not an object then returns +false, otherwise checks if the object is blessed into a class supporting +overloaded operations, and returns true if a call to \fBamagic_call()\fR with +this SV and the given method would trigger an amagic operation, including +via the overload fallback rules or via nomethod. Thus a call like: +.Sp +.Vb 1 +\& amagic_applies(sv, string_amg, AMG_unary) +.Ve +.Sp +would return true for an object with overloading set up in any of the +following ways: +.Sp +.Vb 2 +\& use overload q("") => sub { ... }; +\& use overload q(0+) => sub { ... }, fallback => 1; +.Ve +.Sp +and could be used to tell if a given object would stringify to something +other than the normal default ref stringification. +.Sp +Note that the fact that this function returns TRUE does not mean you +can succesfully perform the operation with \fBamagic_call()\fR, for instance +any overloaded method might throw a fatal exception, however if this +function returns FALSE you can be confident that it will NOT perform +the given overload operation. +.Sp +\&\f(CW\*(C`method\*(C'\fR is an integer enum, one of the values found in \fIoverload.h\fR, +for instance \f(CW\*(C`string_amg\*(C'\fR. +.Sp +\&\f(CW\*(C`flags\*(C'\fR should be set to AMG_unary for unary operations. +.RS 4 +.Sp +.Vb 1 +\& bool amagic_applies(SV *sv, int method, int flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """gp_dup""" 4 +.el .IP \f(CWgp_dup\fR 4 +.IX Xref "gp_dup" +.IX Item "gp_dup" +Duplicate a typeglob, returning a pointer to the cloned object. +.RS 4 +.Sp +.Vb 1 +\& GP * gp_dup(GP * const gp, CLONE_PARAMS * const param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """gv_handler""" 4 +.el .IP \f(CWgv_handler\fR 4 +.IX Xref "gv_handler" +.IX Item "gv_handler" +Implements \f(CW\*(C`StashHANDLER\*(C'\fR, which you should use instead +.RS 4 +.Sp +.Vb 1 +\& CV * gv_handler(HV *stash, I32 id) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """gv_stashsvpvn_cached""" 4 +.el .IP \f(CWgv_stashsvpvn_cached\fR 4 +.IX Xref "gv_stashsvpvn_cached" +.IX Item "gv_stashsvpvn_cached" +Returns a pointer to the stash for a specified package, possibly +cached. Implements both "\f(CW\*(C`gv_stashpvn\*(C'\fR" in perlapi and +"\f(CW\*(C`gv_stashsv\*(C'\fR" in perlapi. +.Sp +Requires one of either \f(CW\*(C`namesv\*(C'\fR or \f(CW\*(C`namepv\*(C'\fR to be non-null. +.Sp +If the flag \f(CW\*(C`GV_CACHE_ONLY\*(C'\fR is set, return the stash only if found in the +cache; see "\f(CW\*(C`gv_stashpvn\*(C'\fR" in perlapi for details on the other \f(CW\*(C`flags\*(C'\fR. +.Sp +Note it is strongly preferred for \f(CW\*(C`namesv\*(C'\fR to be non-null, for performance +reasons. +.RS 4 +.Sp +.Vb 2 +\& HV * gv_stashsvpvn_cached(SV *namesv, const char *name, +\& U32 namelen, I32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """gv_try_downgrade""" 4 +.el .IP \f(CWgv_try_downgrade\fR 4 +.IX Xref "gv_try_downgrade" +.IX Item "gv_try_downgrade" +NOTE: \f(CW\*(C`gv_try_downgrade\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +If the typeglob \f(CW\*(C`gv\*(C'\fR can be expressed more succinctly, by having +something other than a real GV in its place in the stash, replace it +with the optimised form. Basic requirements for this are that \f(CW\*(C`gv\*(C'\fR +is a real typeglob, is sufficiently ordinary, and is only referenced +from its package. This function is meant to be used when a GV has been +looked up in part to see what was there, causing upgrading, but based +on what was found it turns out that the real GV isn't required after all. +.Sp +If \f(CW\*(C`gv\*(C'\fR is a completely empty typeglob, it is deleted from the stash. +.Sp +If \f(CW\*(C`gv\*(C'\fR is a typeglob containing only a sufficiently-ordinary constant +sub, the typeglob is replaced with a scalar-reference placeholder that +more compactly represents the same thing. +.RS 4 +.Sp +.Vb 1 +\& void gv_try_downgrade(GV *gv) +.Ve +.RE +.RS 4 +.RE +.SH "Hook manipulation" +.IX Header "Hook manipulation" +There are currently no internal API items in Hook manipulation +.SH "HV Handling" +.IX Xref "HvNAME_get" +.IX Header "HV Handling" +.ie n .IP """hv_eiter_p""" 4 +.el .IP \f(CWhv_eiter_p\fR 4 +.IX Xref "hv_eiter_p" +.IX Item "hv_eiter_p" +Implements \f(CW\*(C`HvEITER\*(C'\fR which you should use instead. +.Sp +NOTE: \f(CW\*(C`hv_eiter_p\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_hv_eiter_p\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& HE ** Perl_hv_eiter_p(pTHX_ HV *hv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """hv_eiter_set""" 4 +.el .IP \f(CWhv_eiter_set\fR 4 +.IX Xref "hv_eiter_set" +.IX Item "hv_eiter_set" +Implements \f(CW\*(C`HvEITER_set\*(C'\fR which you should use instead. +.Sp +NOTE: \f(CW\*(C`hv_eiter_set\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_hv_eiter_set\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& void Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """hv_ename_add""" 4 +.el .IP \f(CWhv_ename_add\fR 4 +.IX Xref "hv_ename_add" +.IX Item "hv_ename_add" +Adds a name to a stash's internal list of effective names. See +\&\f(CW"hv_ename_delete"\fR. +.Sp +This is called when a stash is assigned to a new location in the symbol +table. +.RS 4 +.Sp +.Vb 1 +\& void hv_ename_add(HV *hv, const char *name, U32 len, U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """hv_ename_delete""" 4 +.el .IP \f(CWhv_ename_delete\fR 4 +.IX Xref "hv_ename_delete" +.IX Item "hv_ename_delete" +Removes a name from a stash's internal list of effective names. If this is +the name returned by \f(CW\*(C`HvENAME\*(C'\fR, then another name in the list will take +its place (\f(CW\*(C`HvENAME\*(C'\fR will use it). +.Sp +This is called when a stash is deleted from the symbol table. +.RS 4 +.Sp +.Vb 2 +\& void hv_ename_delete(HV *hv, const char *name, U32 len, +\& U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """hv_fill""" 4 +.el .IP \f(CWhv_fill\fR 4 +.IX Xref "hv_fill" +.IX Item "hv_fill" +Returns the number of hash buckets that happen to be in use. +.Sp +This function implements the \f(CW\*(C`HvFILL\*(C'\fR macro which you should +use instead. +.Sp +As of perl 5.25 this function is used only for debugging +purposes, and the number of used hash buckets is not +in any way cached, thus this function can be costly +to execute as it must iterate over all the buckets in the +hash. +.Sp +NOTE: \f(CW\*(C`hv_fill\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_hv_fill\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& STRLEN Perl_hv_fill(pTHX_ HV * const hv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """hv_placeholders_get""" 4 +.el .IP \f(CWhv_placeholders_get\fR 4 +.IX Xref "hv_placeholders_get" +.IX Item "hv_placeholders_get" +Implements \f(CW\*(C`HvPLACEHOLDERS_get\*(C'\fR, which you should use instead. +.Sp +NOTE: \f(CW\*(C`hv_placeholders_get\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_hv_placeholders_get\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& I32 Perl_hv_placeholders_get(pTHX_ const HV *hv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """hv_placeholders_set""" 4 +.el .IP \f(CWhv_placeholders_set\fR 4 +.IX Xref "hv_placeholders_set" +.IX Item "hv_placeholders_set" +Implements \f(CW\*(C`HvPLACEHOLDERS_set\*(C'\fR, which you should use instead. +.Sp +NOTE: \f(CW\*(C`hv_placeholders_set\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_hv_placeholders_set\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& void Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """hv_riter_p""" 4 +.el .IP \f(CWhv_riter_p\fR 4 +.IX Xref "hv_riter_p" +.IX Item "hv_riter_p" +Implements \f(CW\*(C`HvRITER\*(C'\fR which you should use instead. +.Sp +NOTE: \f(CW\*(C`hv_riter_p\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_hv_riter_p\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& I32 * Perl_hv_riter_p(pTHX_ HV *hv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """hv_riter_set""" 4 +.el .IP \f(CWhv_riter_set\fR 4 +.IX Xref "hv_riter_set" +.IX Item "hv_riter_set" +Implements \f(CW\*(C`HvRITER_set\*(C'\fR which you should use instead. +.Sp +NOTE: \f(CW\*(C`hv_riter_set\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_hv_riter_set\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& void Perl_hv_riter_set(pTHX_ HV *hv, I32 riter) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_chain_2hv""" 4 +.el .IP \f(CWrefcounted_he_chain_2hv\fR 4 +.IX Xref "refcounted_he_chain_2hv" +.IX Item "refcounted_he_chain_2hv" +Generates and returns a \f(CW\*(C`HV *\*(C'\fR representing the content of a +\&\f(CW\*(C`refcounted_he\*(C'\fR chain. +\&\f(CW\*(C`flags\*(C'\fR is currently unused and must be zero. +.RS 4 +.Sp +.Vb 2 +\& HV * refcounted_he_chain_2hv(const struct refcounted_he *c, +\& U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_fetch_pv""" 4 +.el .IP \f(CWrefcounted_he_fetch_pv\fR 4 +.IX Xref "refcounted_he_fetch_pv" +.IX Item "refcounted_he_fetch_pv" +Like "refcounted_he_fetch_pvn", but takes a nul-terminated string +instead of a string/length pair. +.RS 4 +.Sp +.Vb 2 +\& SV * refcounted_he_fetch_pv(const struct refcounted_he *chain, +\& const char *key, U32 hash, U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_fetch_pvn""" 4 +.el .IP \f(CWrefcounted_he_fetch_pvn\fR 4 +.IX Xref "refcounted_he_fetch_pvn" +.IX Item "refcounted_he_fetch_pvn" +Search along a \f(CW\*(C`refcounted_he\*(C'\fR chain for an entry with the key specified +by \f(CW\*(C`keypv\*(C'\fR and \f(CW\*(C`keylen\*(C'\fR. If \f(CW\*(C`flags\*(C'\fR has the \f(CW\*(C`REFCOUNTED_HE_KEY_UTF8\*(C'\fR +bit set, the key octets are interpreted as UTF\-8, otherwise they +are interpreted as Latin\-1. \f(CW\*(C`hash\*(C'\fR is a precomputed hash of the key +string, or zero if it has not been precomputed. Returns a mortal scalar +representing the value associated with the key, or \f(CW&PL_sv_placeholder\fR +if there is no value associated with the key. +.RS 4 +.Sp +.Vb 3 +\& SV * refcounted_he_fetch_pvn(const struct refcounted_he *chain, +\& const char *keypv, STRLEN keylen, +\& U32 hash, U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_fetch_pvs""" 4 +.el .IP \f(CWrefcounted_he_fetch_pvs\fR 4 +.IX Xref "refcounted_he_fetch_pvs" +.IX Item "refcounted_he_fetch_pvs" +Like "refcounted_he_fetch_pvn", but takes a literal string +instead of a string/length pair, and no precomputed hash. +.RS 4 +.Sp +.Vb 2 +\& SV * refcounted_he_fetch_pvs(const struct refcounted_he *chain, +\& "key", U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_fetch_sv""" 4 +.el .IP \f(CWrefcounted_he_fetch_sv\fR 4 +.IX Xref "refcounted_he_fetch_sv" +.IX Item "refcounted_he_fetch_sv" +Like "refcounted_he_fetch_pvn", but takes a Perl scalar instead of a +string/length pair. +.RS 4 +.Sp +.Vb 2 +\& SV * refcounted_he_fetch_sv(const struct refcounted_he *chain, +\& SV *key, U32 hash, U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_free""" 4 +.el .IP \f(CWrefcounted_he_free\fR 4 +.IX Xref "refcounted_he_free" +.IX Item "refcounted_he_free" +Decrements the reference count of a \f(CW\*(C`refcounted_he\*(C'\fR by one. If the +reference count reaches zero the structure's memory is freed, which +(recursively) causes a reduction of its parent \f(CW\*(C`refcounted_he\*(C'\fR's +reference count. It is safe to pass a null pointer to this function: +no action occurs in this case. +.RS 4 +.Sp +.Vb 1 +\& void refcounted_he_free(struct refcounted_he *he) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_inc""" 4 +.el .IP \f(CWrefcounted_he_inc\fR 4 +.IX Xref "refcounted_he_inc" +.IX Item "refcounted_he_inc" +Increment the reference count of a \f(CW\*(C`refcounted_he\*(C'\fR. The pointer to the +\&\f(CW\*(C`refcounted_he\*(C'\fR is also returned. It is safe to pass a null pointer +to this function: no action occurs and a null pointer is returned. +.RS 4 +.Sp +.Vb 2 +\& struct refcounted_he * refcounted_he_inc( +\& struct refcounted_he *he) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_new_pv""" 4 +.el .IP \f(CWrefcounted_he_new_pv\fR 4 +.IX Xref "refcounted_he_new_pv" +.IX Item "refcounted_he_new_pv" +Like "refcounted_he_new_pvn", but takes a nul-terminated string instead +of a string/length pair. +.RS 4 +.Sp +.Vb 4 +\& struct refcounted_he * refcounted_he_new_pv( +\& struct refcounted_he *parent, +\& const char *key, U32 hash, +\& SV *value, U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_new_pvn""" 4 +.el .IP \f(CWrefcounted_he_new_pvn\fR 4 +.IX Xref "refcounted_he_new_pvn" +.IX Item "refcounted_he_new_pvn" +Creates a new \f(CW\*(C`refcounted_he\*(C'\fR. This consists of a single key/value +pair and a reference to an existing \f(CW\*(C`refcounted_he\*(C'\fR chain (which may +be empty), and thus forms a longer chain. When using the longer chain, +the new key/value pair takes precedence over any entry for the same key +further along the chain. +.Sp +The new key is specified by \f(CW\*(C`keypv\*(C'\fR and \f(CW\*(C`keylen\*(C'\fR. If \f(CW\*(C`flags\*(C'\fR has +the \f(CW\*(C`REFCOUNTED_HE_KEY_UTF8\*(C'\fR bit set, the key octets are interpreted +as UTF\-8, otherwise they are interpreted as Latin\-1. \f(CW\*(C`hash\*(C'\fR is +a precomputed hash of the key string, or zero if it has not been +precomputed. +.Sp +\&\f(CW\*(C`value\*(C'\fR is the scalar value to store for this key. \f(CW\*(C`value\*(C'\fR is copied +by this function, which thus does not take ownership of any reference +to it, and later changes to the scalar will not be reflected in the +value visible in the \f(CW\*(C`refcounted_he\*(C'\fR. Complex types of scalar will not +be stored with referential integrity, but will be coerced to strings. +\&\f(CW\*(C`value\*(C'\fR may be either null or \f(CW&PL_sv_placeholder\fR to indicate that no +value is to be associated with the key; this, as with any non-null value, +takes precedence over the existence of a value for the key further along +the chain. +.Sp +\&\f(CW\*(C`parent\*(C'\fR points to the rest of the \f(CW\*(C`refcounted_he\*(C'\fR chain to be +attached to the new \f(CW\*(C`refcounted_he\*(C'\fR. This function takes ownership +of one reference to \f(CW\*(C`parent\*(C'\fR, and returns one reference to the new +\&\f(CW\*(C`refcounted_he\*(C'\fR. +.RS 4 +.Sp +.Vb 5 +\& struct refcounted_he * refcounted_he_new_pvn( +\& struct refcounted_he *parent, +\& const char *keypv, +\& STRLEN keylen, U32 hash, +\& SV *value, U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_new_pvs""" 4 +.el .IP \f(CWrefcounted_he_new_pvs\fR 4 +.IX Xref "refcounted_he_new_pvs" +.IX Item "refcounted_he_new_pvs" +Like "refcounted_he_new_pvn", but takes a literal string +instead of a string/length pair, and no precomputed hash. +.RS 4 +.Sp +.Vb 3 +\& struct refcounted_he * refcounted_he_new_pvs( +\& struct refcounted_he *parent, +\& "key", SV *value, U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """refcounted_he_new_sv""" 4 +.el .IP \f(CWrefcounted_he_new_sv\fR 4 +.IX Xref "refcounted_he_new_sv" +.IX Item "refcounted_he_new_sv" +Like "refcounted_he_new_pvn", but takes a Perl scalar instead of a +string/length pair. +.RS 4 +.Sp +.Vb 4 +\& struct refcounted_he * refcounted_he_new_sv( +\& struct refcounted_he *parent, +\& SV *key, U32 hash, SV *value, +\& U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """unsharepvn""" 4 +.el .IP \f(CWunsharepvn\fR 4 +.IX Xref "unsharepvn" +.IX Item "unsharepvn" +If no one has access to shared string \f(CW\*(C`str\*(C'\fR with length \f(CW\*(C`len\*(C'\fR, free it. +.Sp +\&\f(CW\*(C`len\*(C'\fR and \f(CW\*(C`hash\*(C'\fR must both be valid for \f(CW\*(C`str\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void unsharepvn(const char *sv, I32 len, U32 hash) +.Ve +.RE +.RS 4 +.RE +.SH Input/Output +.IX Header "Input/Output" +.ie n .IP """dirp_dup""" 4 +.el .IP \f(CWdirp_dup\fR 4 +.IX Xref "dirp_dup" +.IX Item "dirp_dup" +Duplicate a directory handle, returning a pointer to the cloned object. +.RS 4 +.Sp +.Vb 1 +\& DIR * dirp_dup(DIR * const dp, CLONE_PARAMS * const param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """fp_dup""" 4 +.el .IP \f(CWfp_dup\fR 4 +.IX Xref "fp_dup" +.IX Item "fp_dup" +Duplicate a file handle, returning a pointer to the cloned object. +.RS 4 +.Sp +.Vb 2 +\& PerlIO * fp_dup(PerlIO * const fp, const char type, +\& CLONE_PARAMS * const param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """my_fflush_all""" 4 +.el .IP \f(CWmy_fflush_all\fR 4 +.IX Xref "my_fflush_all" +.IX Item "my_fflush_all" +Implements \f(CW\*(C`PERL_FLUSHALL_FOR_CHILD\*(C'\fR on some platforms. +.RS 4 +.Sp +.Vb 1 +\& I32 my_fflush_all() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """my_mkostemp""" 4 +.el .IP \f(CWmy_mkostemp\fR 4 +.IX Xref "my_mkostemp" +.IX Item "my_mkostemp" +The C library \f(CWmkostemp(3)\fR if available, or a Perl implementation of it. +.Sp +NOTE: \f(CW\*(C`my_mkostemp\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_my_mkostemp\*(C'\fR +\&. +.RS 4 +.Sp +.Vb 1 +\& int Perl_my_mkostemp(char *templte, int flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """my_mkstemp""" 4 +.el .IP \f(CWmy_mkstemp\fR 4 +.IX Xref "my_mkstemp" +.IX Item "my_mkstemp" +The C library \f(CWmkstemp(3)\fR if available, or a Perl implementation of it. +.Sp +NOTE: \f(CW\*(C`my_mkstemp\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_my_mkstemp\*(C'\fR +\&. +.RS 4 +.Sp +.Vb 1 +\& int Perl_my_mkstemp(char *templte) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PL_last_in_gv""" 4 +.el .IP \f(CWPL_last_in_gv\fR 4 +.IX Xref "PL_last_in_gv" +.IX Item "PL_last_in_gv" +The GV which was last used for a filehandle input operation. (\f(CW\*(C`<FH>\*(C'\fR) +.Sp +On threaded perls, each thread has an independent copy of this variable; +each initialized at creation time with the current value of the creating +thread's copy. +.RS 4 +.Sp +.Vb 1 +\& GV* PL_last_in_gv +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PL_ofsgv""" 4 +.el .IP \f(CWPL_ofsgv\fR 4 +.IX Xref "PL_ofsgv" +.IX Item "PL_ofsgv" +The glob containing the output field separator \- \f(CW\*(C`*,\*(C'\fR in Perl space. +.Sp +On threaded perls, each thread has an independent copy of this variable; +each initialized at creation time with the current value of the creating +thread's copy. +.RS 4 +.Sp +.Vb 1 +\& GV* PL_ofsgv +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PL_rs""" 4 +.el .IP \f(CWPL_rs\fR 4 +.IX Xref "PL_rs" +.IX Item "PL_rs" +The input record separator \- \f(CW$/\fR in Perl space. +.Sp +On threaded perls, each thread has an independent copy of this variable; +each initialized at creation time with the current value of the creating +thread's copy. +.RS 4 +.Sp +.Vb 1 +\& SV* PL_rs +.Ve +.RE +.RS 4 +.RE +.ie n .IP """start_glob""" 4 +.el .IP \f(CWstart_glob\fR 4 +.IX Xref "start_glob" +.IX Item "start_glob" +NOTE: \f(CW\*(C`start_glob\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +Function called by \f(CW\*(C`do_readline\*(C'\fR to spawn a glob (or do the glob inside +perl on VMS). This code used to be inline, but now perl uses \f(CW\*(C`File::Glob\*(C'\fR +this glob starter is only used by miniperl during the build process, +or when PERL_EXTERNAL_GLOB is defined. +Moving it away shrinks \fIpp_hot.c\fR; shrinking \fIpp_hot.c\fR helps speed perl up. +.Sp +NOTE: \f(CW\*(C`start_glob\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_start_glob\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& PerlIO * Perl_start_glob(pTHX_ SV *tmpglob, IO *io) +.Ve +.RE +.RS 4 +.RE +.SH Integer +.IX Header "Integer" +There are currently no internal API items in Integer +.SH "I/O Formats" +.IX Header "I/O Formats" +There are currently no internal API items in I/O Formats +.SH "Lexer interface" +.IX Header "Lexer interface" +.ie n .IP """resume_compcv_and_save""" 4 +.el .IP \f(CWresume_compcv_and_save\fR 4 +.IX Xref "resume_compcv_and_save" +.IX Item "resume_compcv_and_save" +Resumes a buffer previously suspended by the \f(CW\*(C`suspend_compcv\*(C'\fR function, in a +way that will be re-suspended at the end of the scope so it can be used again +later. This should be used within an \f(CW\*(C`ENTER\*(C'\fR/\f(CW\*(C`LEAVE\*(C'\fR scoped pair. +.RS 4 +.Sp +.Vb 1 +\& void resume_compcv_and_save(struct suspended_compcv *buffer) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """resume_compcv_final""" 4 +.el .IP \f(CWresume_compcv_final\fR 4 +.IX Xref "resume_compcv_final" +.IX Item "resume_compcv_final" +Resumes the parser state previously saved using the \f(CW\*(C`suspend_compcv\*(C'\fR function +for a final time before being compiled into a full CV. This should be used +within an \f(CW\*(C`ENTER\*(C'\fR/\f(CW\*(C`LEAVE\*(C'\fR scoped pair. +.RS 4 +.Sp +.Vb 1 +\& void resume_compcv_final(struct suspended_compcv *buffer) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """validate_proto""" 4 +.el .IP \f(CWvalidate_proto\fR 4 +.IX Xref "validate_proto" +.IX Item "validate_proto" +NOTE: \f(CW\*(C`validate_proto\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +This function performs syntax checking on a prototype, \f(CW\*(C`proto\*(C'\fR. +If \f(CW\*(C`warn\*(C'\fR is true, any illegal characters or mismatched brackets +will trigger illegalproto warnings, declaring that they were +detected in the prototype for \f(CW\*(C`name\*(C'\fR. +.Sp +The return value is \f(CW\*(C`true\*(C'\fR if this is a valid prototype, and +\&\f(CW\*(C`false\*(C'\fR if it is not, regardless of whether \f(CW\*(C`warn\*(C'\fR was \f(CW\*(C`true\*(C'\fR or +\&\f(CW\*(C`false\*(C'\fR. +.Sp +Note that \f(CW\*(C`NULL\*(C'\fR is a valid \f(CW\*(C`proto\*(C'\fR and will always return \f(CW\*(C`true\*(C'\fR. +.RS 4 +.Sp +.Vb 2 +\& bool validate_proto(SV *name, SV *proto, bool warn, +\& bool curstash) +.Ve +.RE +.RS 4 +.RE +.SH Locales +.IX Header "Locales" +There are currently no internal API items in Locales +.SH Magic +.IX Header "Magic" +.ie n .IP """magic_clearhint""" 4 +.el .IP \f(CWmagic_clearhint\fR 4 +.IX Xref "magic_clearhint" +.IX Item "magic_clearhint" +Triggered by a delete from \f(CW\*(C`%^H\*(C'\fR, records the key to +\&\f(CW\*(C`PL_compiling.cop_hints_hash\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& int magic_clearhint(SV *sv, MAGIC *mg) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """magic_clearhints""" 4 +.el .IP \f(CWmagic_clearhints\fR 4 +.IX Xref "magic_clearhints" +.IX Item "magic_clearhints" +Triggered by clearing \f(CW\*(C`%^H\*(C'\fR, resets \f(CW\*(C`PL_compiling.cop_hints_hash\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& int magic_clearhints(SV *sv, MAGIC *mg) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """magic_methcall""" 4 +.el .IP \f(CWmagic_methcall\fR 4 +.IX Xref "magic_methcall" +.IX Item "magic_methcall" +Invoke a magic method (like FETCH). +.Sp +\&\f(CW\*(C`sv\*(C'\fR and \f(CW\*(C`mg\*(C'\fR are the tied thingy and the tie magic. +.Sp +\&\f(CW\*(C`meth\*(C'\fR is the name of the method to call. +.Sp +\&\f(CW\*(C`argc\*(C'\fR is the number of args (in addition to \f(CW$self\fR) to pass to the method. +.Sp +The \f(CW\*(C`flags\*(C'\fR can be: +.Sp +.Vb 4 +\& G_DISCARD invoke method with G_DISCARD flag and don\*(Aqt +\& return a value +\& G_UNDEF_FILL fill the stack with argc pointers to +\& PL_sv_undef +.Ve +.Sp +The arguments themselves are any values following the \f(CW\*(C`flags\*(C'\fR argument. +.Sp +Returns the SV (if any) returned by the method, or \f(CW\*(C`NULL\*(C'\fR on failure. +.Sp +NOTE: \f(CW\*(C`magic_methcall\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_magic_methcall\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 2 +\& SV * Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, +\& SV *meth, U32 flags, U32 argc, ...) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """magic_sethint""" 4 +.el .IP \f(CWmagic_sethint\fR 4 +.IX Xref "magic_sethint" +.IX Item "magic_sethint" +Triggered by a store to \f(CW\*(C`%^H\*(C'\fR, records the key/value pair to +\&\f(CW\*(C`PL_compiling.cop_hints_hash\*(C'\fR. It is assumed that hints aren't storing +anything that would need a deep copy. Maybe we should warn if we find a +reference. +.RS 4 +.Sp +.Vb 1 +\& int magic_sethint(SV *sv, MAGIC *mg) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """mg_dup""" 4 +.el .IP \f(CWmg_dup\fR 4 +.IX Xref "mg_dup" +.IX Item "mg_dup" +Duplicate a chain of magic, returning a pointer to the cloned object. +.RS 4 +.Sp +.Vb 1 +\& MAGIC * mg_dup(MAGIC *mg, CLONE_PARAMS * const param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """mg_localize""" 4 +.el .IP \f(CWmg_localize\fR 4 +.IX Xref "mg_localize" +.IX Item "mg_localize" +Copy some of the magic from an existing SV to new localized version of that +SV. Container magic (\fIe.g.\fR, \f(CW%ENV\fR, \f(CW$1\fR, \f(CW\*(C`tie\*(C'\fR) +gets copied, value magic doesn't (\fIe.g.\fR, +\&\f(CW\*(C`taint\*(C'\fR, \f(CW\*(C`pos\*(C'\fR). +.Sp +If \f(CW\*(C`setmagic\*(C'\fR is false then no set magic will be called on the new (empty) SV. +This typically means that assignment will soon follow (e.g. \f(CW\*(Aqlocal\ $x\ =\ $y\*(Aq\fR), +and that will handle the magic. +.RS 4 +.Sp +.Vb 1 +\& void mg_localize(SV *sv, SV *nsv, bool setmagic) +.Ve +.RE +.RS 4 +.RE +.SH "Memory Management" +.IX Header "Memory Management" +.ie n .IP """calloc""" 4 +.el .IP \f(CWcalloc\fR 4 +.IX Xref "calloc" +.IX Item "calloc" +Implements "\f(CW\*(C`Newxz\*(C'\fR" in perlapi which you should use instead. +.Sp +NOTE: \f(CW\*(C`calloc\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_calloc\*(C'\fR +\&. +.RS 4 +.Sp +.Vb 1 +\& Malloc_t Perl_calloc(MEM_SIZE elements, MEM_SIZE size) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """malloc""" 4 +.el .IP \f(CWmalloc\fR 4 +.IX Xref "malloc" +.IX Item "malloc" +Implements "\f(CW\*(C`Newx\*(C'\fR" in perlapi which you should use instead. +.Sp +NOTE: \f(CW\*(C`malloc\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_malloc\*(C'\fR +\&. +.RS 4 +.Sp +.Vb 1 +\& Malloc_t Perl_malloc(MEM_SIZE nbytes) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """mfree""" 4 +.el .IP \f(CWmfree\fR 4 +.IX Xref "mfree" +.IX Item "mfree" +Implements "\f(CW\*(C`Safefree\*(C'\fR" in perlapi which you should use instead. +.Sp +NOTE: \f(CW\*(C`mfree\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_mfree\*(C'\fR +\&. +.RS 4 +.Sp +.Vb 1 +\& Free_t Perl_mfree(Malloc_t where) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """realloc""" 4 +.el .IP \f(CWrealloc\fR 4 +.IX Xref "realloc" +.IX Item "realloc" +Implements "\f(CW\*(C`Renew\*(C'\fR" in perlapi which you should use instead. +.Sp +NOTE: \f(CW\*(C`realloc\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_realloc\*(C'\fR +\&. +.RS 4 +.Sp +.Vb 1 +\& Malloc_t Perl_realloc(Malloc_t where, MEM_SIZE nbytes) +.Ve +.RE +.RS 4 +.RE +.SH MRO +.IX Header "MRO" +.ie n .IP """mro_get_linear_isa_dfs""" 4 +.el .IP \f(CWmro_get_linear_isa_dfs\fR 4 +.IX Xref "mro_get_linear_isa_dfs" +.IX Item "mro_get_linear_isa_dfs" +Returns the Depth-First Search linearization of \f(CW@ISA\fR +the given stash. The return value is a read-only AV* +whose elements are string SVs giving class names. +\&\f(CW\*(C`level\*(C'\fR should be 0 (it is used internally in this +function's recursion). +.Sp +You are responsible for \f(CWSvREFCNT_inc()\fR on the +return value if you plan to store it anywhere +semi-permanently (otherwise it might be deleted +out from under you the next time the cache is +invalidated). +.RS 4 +.Sp +.Vb 1 +\& AV * mro_get_linear_isa_dfs(HV *stash, U32 level) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """mro_isa_changed_in""" 4 +.el .IP \f(CWmro_isa_changed_in\fR 4 +.IX Xref "mro_isa_changed_in" +.IX Item "mro_isa_changed_in" +Takes the necessary steps (cache invalidations, mostly) +when the \f(CW@ISA\fR of the given package has changed. Invoked +by the \f(CW\*(C`setisa\*(C'\fR magic, should not need to invoke directly. +.RS 4 +.Sp +.Vb 1 +\& void mro_isa_changed_in(HV *stash) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """mro_package_moved""" 4 +.el .IP \f(CWmro_package_moved\fR 4 +.IX Xref "mro_package_moved" +.IX Item "mro_package_moved" +Call this function to signal to a stash that it has been assigned to +another spot in the stash hierarchy. \f(CW\*(C`stash\*(C'\fR is the stash that has been +assigned. \f(CW\*(C`oldstash\*(C'\fR is the stash it replaces, if any. \f(CW\*(C`gv\*(C'\fR is the glob +that is actually being assigned to. +.Sp +This can also be called with a null first argument to +indicate that \f(CW\*(C`oldstash\*(C'\fR has been deleted. +.Sp +This function invalidates isa caches on the old stash, on all subpackages +nested inside it, and on the subclasses of all those, including +non-existent packages that have corresponding entries in \f(CW\*(C`stash\*(C'\fR. +.Sp +It also sets the effective names (\f(CW\*(C`HvENAME\*(C'\fR) on all the stashes as +appropriate. +.Sp +If the \f(CW\*(C`gv\*(C'\fR is present and is not in the symbol table, then this function +simply returns. This checked will be skipped if \f(CW\*(C`flags & 1\*(C'\fR. +.RS 4 +.Sp +.Vb 2 +\& void mro_package_moved(HV * const stash, HV * const oldstash, +\& const GV * const gv, U32 flags) +.Ve +.RE +.RS 4 +.RE +.SH "Multicall Functions" +.IX Header "Multicall Functions" +There are currently no internal API items in Multicall Functions +.SH "Numeric Functions" +.IX Header "Numeric Functions" +.ie n .IP """isinfnansv""" 4 +.el .IP \f(CWisinfnansv\fR 4 +.IX Xref "isinfnansv" +.IX Item "isinfnansv" +Checks whether the argument would be either an infinity or \f(CW\*(C`NaN\*(C'\fR when used +as a number, but is careful not to trigger non-numeric or uninitialized +warnings. it assumes the caller has done \f(CWSvGETMAGIC(sv)\fR already. +.Sp +Note that this always accepts trailing garbage (similar to \f(CW\*(C`grok_number_flags\*(C'\fR +with \f(CW\*(C`PERL_SCAN_TRAILING\*(C'\fR), so \f(CW"inferior"\fR and \f(CW"NAND gates"\fR will +return true. +.RS 4 +.Sp +.Vb 1 +\& bool isinfnansv(SV *sv) +.Ve +.RE +.RS 4 +.RE +.SH Optrees +.IX Header "Optrees" +.ie n .IP """newATTRSUB_x""" 4 +.el .IP \f(CWnewATTRSUB_x\fR 4 +.IX Xref "newATTRSUB_x" +.IX Item "newATTRSUB_x" +Construct a Perl subroutine, also performing some surrounding jobs. +.Sp +This function is expected to be called in a Perl compilation context, +and some aspects of the subroutine are taken from global variables +associated with compilation. In particular, \f(CW\*(C`PL_compcv\*(C'\fR represents +the subroutine that is currently being compiled. It must be non-null +when this function is called, and some aspects of the subroutine being +constructed are taken from it. The constructed subroutine may actually +be a reuse of the \f(CW\*(C`PL_compcv\*(C'\fR object, but will not necessarily be so. +.Sp +If \f(CW\*(C`block\*(C'\fR is null then the subroutine will have no body, and for the +time being it will be an error to call it. This represents a forward +subroutine declaration such as \f(CW\*(C`sub\ foo\ ($$);\*(C'\fR. If \f(CW\*(C`block\*(C'\fR is +non-null then it provides the Perl code of the subroutine body, which +will be executed when the subroutine is called. This body includes +any argument unwrapping code resulting from a subroutine signature or +similar. The pad use of the code must correspond to the pad attached +to \f(CW\*(C`PL_compcv\*(C'\fR. The code is not expected to include a \f(CW\*(C`leavesub\*(C'\fR or +\&\f(CW\*(C`leavesublv\*(C'\fR op; this function will add such an op. \f(CW\*(C`block\*(C'\fR is consumed +by this function and will become part of the constructed subroutine. +.Sp +\&\f(CW\*(C`proto\*(C'\fR specifies the subroutine's prototype, unless one is supplied +as an attribute (see below). If \f(CW\*(C`proto\*(C'\fR is null, then the subroutine +will not have a prototype. If \f(CW\*(C`proto\*(C'\fR is non-null, it must point to a +\&\f(CW\*(C`const\*(C'\fR op whose value is a string, and the subroutine will have that +string as its prototype. If a prototype is supplied as an attribute, the +attribute takes precedence over \f(CW\*(C`proto\*(C'\fR, but in that case \f(CW\*(C`proto\*(C'\fR should +preferably be null. In any case, \f(CW\*(C`proto\*(C'\fR is consumed by this function. +.Sp +\&\f(CW\*(C`attrs\*(C'\fR supplies attributes to be applied the subroutine. A handful of +attributes take effect by built-in means, being applied to \f(CW\*(C`PL_compcv\*(C'\fR +immediately when seen. Other attributes are collected up and attached +to the subroutine by this route. \f(CW\*(C`attrs\*(C'\fR may be null to supply no +attributes, or point to a \f(CW\*(C`const\*(C'\fR op for a single attribute, or point +to a \f(CW\*(C`list\*(C'\fR op whose children apart from the \f(CW\*(C`pushmark\*(C'\fR are \f(CW\*(C`const\*(C'\fR +ops for one or more attributes. Each \f(CW\*(C`const\*(C'\fR op must be a string, +giving the attribute name optionally followed by parenthesised arguments, +in the manner in which attributes appear in Perl source. The attributes +will be applied to the sub by this function. \f(CW\*(C`attrs\*(C'\fR is consumed by +this function. +.Sp +If \f(CW\*(C`o_is_gv\*(C'\fR is false and \f(CW\*(C`o\*(C'\fR is null, then the subroutine will +be anonymous. If \f(CW\*(C`o_is_gv\*(C'\fR is false and \f(CW\*(C`o\*(C'\fR is non-null, then \f(CW\*(C`o\*(C'\fR +must point to a \f(CW\*(C`const\*(C'\fR OP, which will be consumed by this function, +and its string value supplies a name for the subroutine. The name may +be qualified or unqualified, and if it is unqualified then a default +stash will be selected in some manner. If \f(CW\*(C`o_is_gv\*(C'\fR is true, then \f(CW\*(C`o\*(C'\fR +doesn't point to an \f(CW\*(C`OP\*(C'\fR at all, but is instead a cast pointer to a \f(CW\*(C`GV\*(C'\fR +by which the subroutine will be named. +.Sp +If there is already a subroutine of the specified name, then the new +sub will either replace the existing one in the glob or be merged with +the existing one. A warning may be generated about redefinition. +.Sp +If the subroutine has one of a few special names, such as \f(CW\*(C`BEGIN\*(C'\fR or +\&\f(CW\*(C`END\*(C'\fR, then it will be claimed by the appropriate queue for automatic +running of phase-related subroutines. In this case the relevant glob will +be left not containing any subroutine, even if it did contain one before. +In the case of \f(CW\*(C`BEGIN\*(C'\fR, the subroutine will be executed and the reference +to it disposed of before this function returns. +.Sp +The function returns a pointer to the constructed subroutine. If the sub +is anonymous then ownership of one counted reference to the subroutine +is transferred to the caller. If the sub is named then the caller does +not get ownership of a reference. In most such cases, where the sub +has a non-phase name, the sub will be alive at the point it is returned +by virtue of being contained in the glob that names it. A phase-named +subroutine will usually be alive by virtue of the reference owned by the +phase's automatic run queue. But a \f(CW\*(C`BEGIN\*(C'\fR subroutine, having already +been executed, will quite likely have been destroyed already by the +time this function returns, making it erroneous for the caller to make +any use of the returned pointer. It is the caller's responsibility to +ensure that it knows which of these situations applies. +.RS 4 +.Sp +.Vb 2 +\& CV * newATTRSUB_x(I32 floor, OP *o, OP *proto, OP *attrs, +\& OP *block, bool o_is_gv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """newXS_len_flags""" 4 +.el .IP \f(CWnewXS_len_flags\fR 4 +.IX Xref "newXS_len_flags" +.IX Item "newXS_len_flags" +Construct an XS subroutine, also performing some surrounding jobs. +.Sp +The subroutine will have the entry point \f(CW\*(C`subaddr\*(C'\fR. It will have +the prototype specified by the nul-terminated string \f(CW\*(C`proto\*(C'\fR, or +no prototype if \f(CW\*(C`proto\*(C'\fR is null. The prototype string is copied; +the caller can mutate the supplied string afterwards. If \f(CW\*(C`filename\*(C'\fR +is non-null, it must be a nul-terminated filename, and the subroutine +will have its \f(CW\*(C`CvFILE\*(C'\fR set accordingly. By default \f(CW\*(C`CvFILE\*(C'\fR is set to +point directly to the supplied string, which must be static. If \f(CW\*(C`flags\*(C'\fR +has the \f(CW\*(C`XS_DYNAMIC_FILENAME\*(C'\fR bit set, then a copy of the string will +be taken instead. +.Sp +Other aspects of the subroutine will be left in their default state. +If anything else needs to be done to the subroutine for it to function +correctly, it is the caller's responsibility to do that after this +function has constructed it. However, beware of the subroutine +potentially being destroyed before this function returns, as described +below. +.Sp +If \f(CW\*(C`name\*(C'\fR is null then the subroutine will be anonymous, with its +\&\f(CW\*(C`CvGV\*(C'\fR referring to an \f(CW\*(C`_\|_ANON_\|_\*(C'\fR glob. If \f(CW\*(C`name\*(C'\fR is non-null then the +subroutine will be named accordingly, referenced by the appropriate glob. +\&\f(CW\*(C`name\*(C'\fR is a string of length \f(CW\*(C`len\*(C'\fR bytes giving a sigilless symbol name, +in UTF\-8 if \f(CW\*(C`flags\*(C'\fR has the \f(CW\*(C`SVf_UTF8\*(C'\fR bit set and in Latin\-1 otherwise. +The name may be either qualified or unqualified, with the stash defaulting +in the same manner as for \f(CW\*(C`gv_fetchpvn_flags\*(C'\fR. \f(CW\*(C`flags\*(C'\fR may contain +flag bits understood by \f(CW\*(C`gv_fetchpvn_flags\*(C'\fR with the same meaning as +they have there, such as \f(CW\*(C`GV_ADDWARN\*(C'\fR. The symbol is always added to +the stash if necessary, with \f(CW\*(C`GV_ADDMULTI\*(C'\fR semantics. +.Sp +If there is already a subroutine of the specified name, then the new sub +will replace the existing one in the glob. A warning may be generated +about the redefinition. If the old subroutine was \f(CW\*(C`CvCONST\*(C'\fR then the +decision about whether to warn is influenced by an expectation about +whether the new subroutine will become a constant of similar value. +That expectation is determined by \f(CW\*(C`const_svp\*(C'\fR. (Note that the call to +this function doesn't make the new subroutine \f(CW\*(C`CvCONST\*(C'\fR in any case; +that is left to the caller.) If \f(CW\*(C`const_svp\*(C'\fR is null then it indicates +that the new subroutine will not become a constant. If \f(CW\*(C`const_svp\*(C'\fR +is non-null then it indicates that the new subroutine will become a +constant, and it points to an \f(CW\*(C`SV*\*(C'\fR that provides the constant value +that the subroutine will have. +.Sp +If the subroutine has one of a few special names, such as \f(CW\*(C`BEGIN\*(C'\fR or +\&\f(CW\*(C`END\*(C'\fR, then it will be claimed by the appropriate queue for automatic +running of phase-related subroutines. In this case the relevant glob will +be left not containing any subroutine, even if it did contain one before. +In the case of \f(CW\*(C`BEGIN\*(C'\fR, the subroutine will be executed and the reference +to it disposed of before this function returns, and also before its +prototype is set. If a \f(CW\*(C`BEGIN\*(C'\fR subroutine would not be sufficiently +constructed by this function to be ready for execution then the caller +must prevent this happening by giving the subroutine a different name. +.Sp +The function returns a pointer to the constructed subroutine. If the sub +is anonymous then ownership of one counted reference to the subroutine +is transferred to the caller. If the sub is named then the caller does +not get ownership of a reference. In most such cases, where the sub +has a non-phase name, the sub will be alive at the point it is returned +by virtue of being contained in the glob that names it. A phase-named +subroutine will usually be alive by virtue of the reference owned by the +phase's automatic run queue. But a \f(CW\*(C`BEGIN\*(C'\fR subroutine, having already +been executed, will quite likely have been destroyed already by the +time this function returns, making it erroneous for the caller to make +any use of the returned pointer. It is the caller's responsibility to +ensure that it knows which of these situations applies. +.RS 4 +.Sp +.Vb 5 +\& CV * newXS_len_flags(const char *name, STRLEN len, +\& XSUBADDR_t subaddr, +\& const char * const filename, +\& const char * const proto, SV ** const_svp, +\& U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """op_refcnt_lock""" 4 +.el .IP \f(CWop_refcnt_lock\fR 4 +.IX Xref "op_refcnt_lock" +.IX Item "op_refcnt_lock" +Implements the \f(CW\*(C`OP_REFCNT_LOCK\*(C'\fR macro which you should use instead. +.RS 4 +.Sp +.Vb 1 +\& void op_refcnt_lock() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """op_refcnt_unlock""" 4 +.el .IP \f(CWop_refcnt_unlock\fR 4 +.IX Xref "op_refcnt_unlock" +.IX Item "op_refcnt_unlock" +Implements the \f(CW\*(C`OP_REFCNT_UNLOCK\*(C'\fR macro which you should use instead. +.RS 4 +.Sp +.Vb 1 +\& void op_refcnt_unlock() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """traverse_op_tree""" 4 +.el .IP \f(CWtraverse_op_tree\fR 4 +.IX Xref "traverse_op_tree" +.IX Item "traverse_op_tree" +Return the next op in a depth-first traversal of the op tree, +returning NULL when the traversal is complete. +.Sp +The initial call must supply the root of the tree as both top and o. +.Sp +For now it's static, but it may be exposed to the API in the future. +.RS 4 +.Sp +.Vb 1 +\& OP * traverse_op_tree(OP *top, OP *o) +.Ve +.RE +.RS 4 +.RE +.SH "Pack and Unpack" +.IX Header "Pack and Unpack" +There are currently no internal API items in Pack and Unpack +.SH "Pad Data Structures" +.IX Header "Pad Data Structures" +.ie n .IP """CX_CURPAD_SAVE""" 4 +.el .IP \f(CWCX_CURPAD_SAVE\fR 4 +.IX Xref "CX_CURPAD_SAVE" +.IX Item "CX_CURPAD_SAVE" +Save the current pad in the given context block structure. +.RS 4 +.Sp +.Vb 1 +\& void CX_CURPAD_SAVE(struct context) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """CX_CURPAD_SV""" 4 +.el .IP \f(CWCX_CURPAD_SV\fR 4 +.IX Xref "CX_CURPAD_SV" +.IX Item "CX_CURPAD_SV" +Access the SV at offset \f(CW\*(C`po\*(C'\fR in the saved current pad in the given +context block structure (can be used as an lvalue). +.RS 4 +.Sp +.Vb 1 +\& SV * CX_CURPAD_SV(struct context, PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_BASE_SV""" 4 +.el .IP \f(CWPAD_BASE_SV\fR 4 +.IX Xref "PAD_BASE_SV" +.IX Item "PAD_BASE_SV" +Get the value from slot \f(CW\*(C`po\*(C'\fR in the base (DEPTH=1) pad of a padlist +.RS 4 +.Sp +.Vb 1 +\& SV * PAD_BASE_SV(PADLIST padlist, PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_CLONE_VARS""" 4 +.el .IP \f(CWPAD_CLONE_VARS\fR 4 +.IX Xref "PAD_CLONE_VARS" +.IX Item "PAD_CLONE_VARS" +Clone the state variables associated with running and compiling pads. +.RS 4 +.Sp +.Vb 2 +\& void PAD_CLONE_VARS(PerlInterpreter *proto_perl, +\& CLONE_PARAMS* param) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_COMPNAME_FLAGS""" 4 +.el .IP \f(CWPAD_COMPNAME_FLAGS\fR 4 +.IX Xref "PAD_COMPNAME_FLAGS" +.IX Item "PAD_COMPNAME_FLAGS" +Return the flags for the current compiling pad name +at offset \f(CW\*(C`po\*(C'\fR. Assumes a valid slot entry. +.RS 4 +.Sp +.Vb 1 +\& U32 PAD_COMPNAME_FLAGS(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_COMPNAME_GEN""" 4 +.el .IP \f(CWPAD_COMPNAME_GEN\fR 4 +.IX Xref "PAD_COMPNAME_GEN" +.IX Item "PAD_COMPNAME_GEN" +The generation number of the name at offset \f(CW\*(C`po\*(C'\fR in the current +compiling pad (lvalue). +.RS 4 +.Sp +.Vb 1 +\& STRLEN PAD_COMPNAME_GEN(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_COMPNAME_GEN_set""" 4 +.el .IP \f(CWPAD_COMPNAME_GEN_set\fR 4 +.IX Xref "PAD_COMPNAME_GEN_set" +.IX Item "PAD_COMPNAME_GEN_set" +Sets the generation number of the name at offset \f(CW\*(C`po\*(C'\fR in the current +ling pad (lvalue) to \f(CW\*(C`gen\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& STRLEN PAD_COMPNAME_GEN_set(PADOFFSET po, int gen) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_COMPNAME_OURSTASH""" 4 +.el .IP \f(CWPAD_COMPNAME_OURSTASH\fR 4 +.IX Xref "PAD_COMPNAME_OURSTASH" +.IX Item "PAD_COMPNAME_OURSTASH" +Return the stash associated with an \f(CW\*(C`our\*(C'\fR variable. +Assumes the slot entry is a valid \f(CW\*(C`our\*(C'\fR lexical. +.RS 4 +.Sp +.Vb 1 +\& HV * PAD_COMPNAME_OURSTASH(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_COMPNAME_PV""" 4 +.el .IP \f(CWPAD_COMPNAME_PV\fR 4 +.IX Xref "PAD_COMPNAME_PV" +.IX Item "PAD_COMPNAME_PV" +Return the name of the current compiling pad name +at offset \f(CW\*(C`po\*(C'\fR. Assumes a valid slot entry. +.RS 4 +.Sp +.Vb 1 +\& char * PAD_COMPNAME_PV(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_COMPNAME_TYPE""" 4 +.el .IP \f(CWPAD_COMPNAME_TYPE\fR 4 +.IX Xref "PAD_COMPNAME_TYPE" +.IX Item "PAD_COMPNAME_TYPE" +Return the type (stash) of the current compiling pad name at offset +\&\f(CW\*(C`po\*(C'\fR. Must be a valid name. Returns null if not typed. +.RS 4 +.Sp +.Vb 1 +\& HV * PAD_COMPNAME_TYPE(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PadnameIsFIELD""" 4 +.el .IP \f(CWPadnameIsFIELD\fR 4 +.IX Xref "PadnameIsFIELD" +.IX Item "PadnameIsFIELD" +Whether this is a "field" variable. PADNAMEs where this is true will +have additional information available via \f(CW\*(C`PadnameFIELDINFO\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& bool PadnameIsFIELD(PADNAME * pn) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PadnameIsOUR""" 4 +.el .IP \f(CWPadnameIsOUR\fR 4 +.IX Xref "PadnameIsOUR" +.IX Item "PadnameIsOUR" +Whether this is an "our" variable. +.RS 4 +.Sp +.Vb 1 +\& bool PadnameIsOUR(PADNAME * pn) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PadnameIsSTATE""" 4 +.el .IP \f(CWPadnameIsSTATE\fR 4 +.IX Xref "PadnameIsSTATE" +.IX Item "PadnameIsSTATE" +Whether this is a "state" variable. +.RS 4 +.Sp +.Vb 1 +\& bool PadnameIsSTATE(PADNAME * pn) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PadnameOURSTASH""" 4 +.el .IP \f(CWPadnameOURSTASH\fR 4 +.IX Xref "PadnameOURSTASH" +.IX Item "PadnameOURSTASH" +The stash in which this "our" variable was declared. +.RS 4 +.Sp +.Vb 1 +\& HV * PadnameOURSTASH(PADNAME * pn) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PadnameOUTER""" 4 +.el .IP \f(CWPadnameOUTER\fR 4 +.IX Xref "PadnameOUTER" +.IX Item "PadnameOUTER" +Whether this entry belongs to an outer pad. Entries for which this is true +are often referred to as 'fake'. +.RS 4 +.Sp +.Vb 1 +\& bool PadnameOUTER(PADNAME * pn) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PadnameTYPE""" 4 +.el .IP \f(CWPadnameTYPE\fR 4 +.IX Xref "PadnameTYPE" +.IX Item "PadnameTYPE" +The stash associated with a typed lexical. This returns the \f(CW%Foo::\fR hash +for \f(CW\*(C`my Foo $bar\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& HV * PadnameTYPE(PADNAME * pn) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_RESTORE_LOCAL""" 4 +.el .IP \f(CWPAD_RESTORE_LOCAL\fR 4 +.IX Xref "PAD_RESTORE_LOCAL" +.IX Item "PAD_RESTORE_LOCAL" +Restore the old pad saved into the local variable \f(CW\*(C`opad\*(C'\fR by \f(CWPAD_SAVE_LOCAL()\fR +.RS 4 +.Sp +.Vb 1 +\& void PAD_RESTORE_LOCAL(PAD *opad) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_SAVE_LOCAL""" 4 +.el .IP \f(CWPAD_SAVE_LOCAL\fR 4 +.IX Xref "PAD_SAVE_LOCAL" +.IX Item "PAD_SAVE_LOCAL" +Save the current pad to the local variable \f(CW\*(C`opad\*(C'\fR, then make the +current pad equal to \f(CW\*(C`npad\*(C'\fR +.RS 4 +.Sp +.Vb 1 +\& void PAD_SAVE_LOCAL(PAD *opad, PAD *npad) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_SAVE_SETNULLPAD""" 4 +.el .IP \f(CWPAD_SAVE_SETNULLPAD\fR 4 +.IX Xref "PAD_SAVE_SETNULLPAD" +.IX Item "PAD_SAVE_SETNULLPAD" +Save the current pad then set it to null. +.RS 4 +.Sp +.Vb 1 +\& void PAD_SAVE_SETNULLPAD() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_SET_CUR""" 4 +.el .IP \f(CWPAD_SET_CUR\fR 4 +.IX Xref "PAD_SET_CUR" +.IX Item "PAD_SET_CUR" +Set the current pad to be pad \f(CW\*(C`n\*(C'\fR in the padlist, saving +the previous current pad. NB currently this macro expands to a string too +long for some compilers, so it's best to replace it with +.Sp +.Vb 2 +\& SAVECOMPPAD(); +\& PAD_SET_CUR_NOSAVE(padlist,n); +.Ve +.RS 4 +.Sp +.Vb 1 +\& void PAD_SET_CUR(PADLIST padlist, I32 n) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_SET_CUR_NOSAVE""" 4 +.el .IP \f(CWPAD_SET_CUR_NOSAVE\fR 4 +.IX Xref "PAD_SET_CUR_NOSAVE" +.IX Item "PAD_SET_CUR_NOSAVE" +like PAD_SET_CUR, but without the save +.RS 4 +.Sp +.Vb 1 +\& void PAD_SET_CUR_NOSAVE(PADLIST padlist, I32 n) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_SETSV""" 4 +.el .IP \f(CWPAD_SETSV\fR 4 +.IX Xref "PAD_SETSV" +.IX Item "PAD_SETSV" +Set the slot at offset \f(CW\*(C`po\*(C'\fR in the current pad to \f(CW\*(C`sv\*(C'\fR +.RS 4 +.Sp +.Vb 1 +\& SV * PAD_SETSV(PADOFFSET po, SV* sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_SV""" 4 +.el .IP \f(CWPAD_SV\fR 4 +.IX Xref "PAD_SV" +.IX Item "PAD_SV" +Get the value at offset \f(CW\*(C`po\*(C'\fR in the current pad +.RS 4 +.Sp +.Vb 1 +\& SV * PAD_SV(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PAD_SVl""" 4 +.el .IP \f(CWPAD_SVl\fR 4 +.IX Xref "PAD_SVl" +.IX Item "PAD_SVl" +Lightweight and lvalue version of \f(CW\*(C`PAD_SV\*(C'\fR. +Get or set the value at offset \f(CW\*(C`po\*(C'\fR in the current pad. +Unlike \f(CW\*(C`PAD_SV\*(C'\fR, does not print diagnostics with \-DX. +For internal use only. +.RS 4 +.Sp +.Vb 1 +\& SV * PAD_SVl(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """SAVECLEARSV""" 4 +.el .IP \f(CWSAVECLEARSV\fR 4 +.IX Xref "SAVECLEARSV" +.IX Item "SAVECLEARSV" +Clear the pointed to pad value on scope exit. (i.e. the runtime action of +\&\f(CW\*(C`my\*(C'\fR) +.RS 4 +.Sp +.Vb 1 +\& void SAVECLEARSV(SV **svp) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """SAVECOMPPAD""" 4 +.el .IP \f(CWSAVECOMPPAD\fR 4 +.IX Xref "SAVECOMPPAD" +.IX Item "SAVECOMPPAD" +save \f(CW\*(C`PL_comppad\*(C'\fR and \f(CW\*(C`PL_curpad\*(C'\fR +.RS 4 +.Sp +.Vb 1 +\& void SAVECOMPPAD() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """SAVEPADSV""" 4 +.el .IP \f(CWSAVEPADSV\fR 4 +.IX Xref "SAVEPADSV" +.IX Item "SAVEPADSV" +Save a pad slot (used to restore after an iteration) +.RS 4 +.Sp +.Vb 1 +\& void SAVEPADSV(PADOFFSET po) +.Ve +.RE +.RS 4 +.RE +.SH "Password and Group access" +.IX Header "Password and Group access" +There are currently no internal API items in Password and Group access +.SH "Paths to system commands" +.IX Header "Paths to system commands" +There are currently no internal API items in Paths to system commands +.SH "Prototype information" +.IX Header "Prototype information" +There are currently no internal API items in Prototype information +.SH "REGEXP Functions" +.IX Header "REGEXP Functions" +.ie n .IP """regnode""" 4 +.el .IP \f(CWregnode\fR 4 +.IX Item "regnode" +Described in perlreguts. +.SH "Reports and Formats" +.IX Header "Reports and Formats" +There are currently no internal API items in Reports and Formats +.SH Signals +.IX Header "Signals" +There are currently no internal API items in Signals +.SH "Site configuration" +.IX Header "Site configuration" +There are currently no internal API items in Site configuration +.SH "Sockets configuration values" +.IX Header "Sockets configuration values" +There are currently no internal API items in Sockets configuration values +.SH "Source Filters" +.IX Header "Source Filters" +There are currently no internal API items in Source Filters +.SH "Stack Manipulation Macros" +.IX Header "Stack Manipulation Macros" +.ie n .IP """djSP""" 4 +.el .IP \f(CWdjSP\fR 4 +.IX Xref "djSP" +.IX Item "djSP" +Declare Just \f(CW\*(C`SP\*(C'\fR. This is actually identical to \f(CW\*(C`dSP\*(C'\fR, and declares +a local copy of perl's stack pointer, available via the \f(CW\*(C`SP\*(C'\fR macro. +See \f(CW\*(C`"SP" in perlapi\*(C'\fR. (Available for backward source code compatibility with +the old (Perl 5.005) thread model.) +.RS 4 +.Sp +.Vb 1 +\& djSP(); +.Ve +.RE +.RS 4 +.RE +.ie n .IP """LVRET""" 4 +.el .IP \f(CWLVRET\fR 4 +.IX Xref "LVRET" +.IX Item "LVRET" +True if this op will be the return value of an lvalue subroutine +.ie n .IP """save_alloc""" 4 +.el .IP \f(CWsave_alloc\fR 4 +.IX Xref "save_alloc" +.IX Item "save_alloc" +Implements "\f(CW\*(C`SSNEW\*(C'\fR" in perlapi and kin, which should be used instead of this +function. +.RS 4 +.Sp +.Vb 1 +\& SSize_t save_alloc(SSize_t size, I32 pad) +.Ve +.RE +.RS 4 +.RE +.SH "String Handling" +.IX Header "String Handling" +.ie n .IP """delimcpy_no_escape""" 4 +.el .IP \f(CWdelimcpy_no_escape\fR 4 +.IX Xref "delimcpy_no_escape" +.IX Item "delimcpy_no_escape" +Copy a source buffer to a destination buffer, stopping at (but not including) +the first occurrence in the source of the delimiter byte, \f(CW\*(C`delim\*(C'\fR. The source +is the bytes between \f(CW\*(C`from\*(C'\fR\ and\ \f(CW\*(C`from_end\*(C'\fR\ \-\ 1. Similarly, the dest is +\&\f(CW\*(C`to\*(C'\fR up to \f(CW\*(C`to_end\*(C'\fR. +.Sp +The number of bytes copied is written to \f(CW*retlen\fR. +.Sp +Returns the position of \f(CW\*(C`delim\*(C'\fR in the \f(CW\*(C`from\*(C'\fR buffer, but if there is no +such occurrence before \f(CW\*(C`from_end\*(C'\fR, then \f(CW\*(C`from_end\*(C'\fR is returned, and the entire +buffer \f(CW\*(C`from\*(C'\fR\ ..\ \f(CW\*(C`from_end\*(C'\fR\ \-\ 1 is copied. +.Sp +If there is room in the destination available after the copy, an extra +terminating safety \f(CW\*(C`NUL\*(C'\fR byte is appended (not included in the returned +length). +.Sp +The error case is if the destination buffer is not large enough to accommodate +everything that should be copied. In this situation, a value larger than +\&\f(CW\*(C`to_end\*(C'\fR\ \-\ \f(CW\*(C`to\*(C'\fR is written to \f(CW*retlen\fR, and as much of the source as +fits will be written to the destination. Not having room for the safety \f(CW\*(C`NUL\*(C'\fR +is not considered an error. +.RS 4 +.Sp +.Vb 3 +\& char * delimcpy_no_escape(char *to, const char *to_end, +\& const char *from, const char *from_end, +\& const int delim, I32 *retlen) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """my_cxt_init""" 4 +.el .IP \f(CWmy_cxt_init\fR 4 +.IX Xref "my_cxt_init" +.IX Item "my_cxt_init" +Implements the "\f(CW\*(C`MY_CXT_INIT\*(C'\fR" in perlxs macro, which you should use instead. +.Sp +The first time a module is loaded, the global \f(CW\*(C`PL_my_cxt_index\*(C'\fR is incremented, +and that value is assigned to that module's static \f(CW\*(C`my_cxt_index\*(C'\fR (whose +address is passed as an arg). Then, for each interpreter this function is +called for, it makes sure a \f(CW\*(C`void*\*(C'\fR slot is available to hang the static data +off, by allocating or extending the interpreter's \f(CW\*(C`PL_my_cxt_list\*(C'\fR array +.Sp +NOTE: \f(CW\*(C`my_cxt_init\*(C'\fR must be explicitly called as +\&\f(CW\*(C`Perl_my_cxt_init\*(C'\fR +with an \f(CW\*(C`aTHX_\*(C'\fR parameter. +.RS 4 +.Sp +.Vb 1 +\& void * Perl_my_cxt_init(pTHX_ int *indexp, size_t size) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """quadmath_format_needed""" 4 +.el .IP \f(CWquadmath_format_needed\fR 4 +.IX Xref "quadmath_format_needed" +.IX Item "quadmath_format_needed" +\&\f(CWquadmath_format_needed()\fR returns true if the \f(CW\*(C`format\*(C'\fR string seems to +contain at least one non-Q-prefixed \f(CW\*(C`%[efgaEFGA]\*(C'\fR format specifier, +or returns false otherwise. +.Sp +The format specifier detection is not complete printf-syntax detection, +but it should catch most common cases. +.Sp +If true is returned, those arguments \fBshould\fR in theory be processed +with \f(CWquadmath_snprintf()\fR, but in case there is more than one such +format specifier (see "quadmath_format_valid"), and if there is +anything else beyond that one (even just a single byte), they +\&\fBcannot\fR be processed because \f(CWquadmath_snprintf()\fR is very strict, +accepting only one format spec, and nothing else. +In this case, the code should probably fail. +.RS 4 +.Sp +.Vb 1 +\& bool quadmath_format_needed(const char *format) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """quadmath_format_valid""" 4 +.el .IP \f(CWquadmath_format_valid\fR 4 +.IX Xref "quadmath_format_valid" +.IX Item "quadmath_format_valid" +\&\f(CWquadmath_snprintf()\fR is very strict about its \f(CW\*(C`format\*(C'\fR string and will +fail, returning \-1, if the format is invalid. It accepts exactly +one format spec. +.Sp +\&\f(CWquadmath_format_valid()\fR checks that the intended single spec looks +sane: begins with \f(CW\*(C`%\*(C'\fR, has only one \f(CW\*(C`%\*(C'\fR, ends with \f(CW\*(C`[efgaEFGA]\*(C'\fR, +and has \f(CW\*(C`Q\*(C'\fR before it. This is not a full "printf syntax check", +just the basics. +.Sp +Returns true if it is valid, false if not. +.Sp +See also "quadmath_format_needed". +.RS 4 +.Sp +.Vb 1 +\& bool quadmath_format_valid(const char *format) +.Ve +.RE +.RS 4 +.RE +.SH "SV Flags" +.IX Header "SV Flags" +.ie n .IP """SVt_INVLIST""" 4 +.el .IP \f(CWSVt_INVLIST\fR 4 +.IX Xref "SVt_INVLIST" +.IX Item "SVt_INVLIST" +Type flag for scalars. See "svtype" in perlapi. +.SH "SV Handling" +.IX Header "SV Handling" +.ie n .IP """PL_Sv""" 4 +.el .IP \f(CWPL_Sv\fR 4 +.IX Xref "PL_Sv" +.IX Item "PL_Sv" +A scratch pad SV for whatever temporary use you need. Chiefly used as a +fallback by macros on platforms where "PERL_USE_GCC_BRACE_GROUPS" in perlapi> is +unavailable, and which would otherwise evaluate their SV parameter more than +once. +.Sp +\&\fBBUT BEWARE\fR, if this is used in a situation where something that is using it +is in a call stack with something else that is using it, this variable would +get zapped, leading to hard-to-diagnose errors. +.RS 4 +.Sp +.Vb 1 +\& PL_Sv +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_add_arena""" 4 +.el .IP \f(CWsv_add_arena\fR 4 +.IX Xref "sv_add_arena" +.IX Item "sv_add_arena" +Given a chunk of memory, link it to the head of the list of arenas, +and split it into a list of free SVs. +.RS 4 +.Sp +.Vb 2 +\& void sv_add_arena(char * const ptr, const U32 size, +\& const U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_2bool""" 4 +.el .IP \f(CWsv_2bool\fR 4 +.IX Xref "sv_2bool" +.IX Item "sv_2bool" +This macro is only used by \f(CWsv_true()\fR or its macro equivalent, and only if +the latter's argument is neither \f(CW\*(C`SvPOK\*(C'\fR, \f(CW\*(C`SvIOK\*(C'\fR nor \f(CW\*(C`SvNOK\*(C'\fR. +It calls \f(CW\*(C`sv_2bool_flags\*(C'\fR with the \f(CW\*(C`SV_GMAGIC\*(C'\fR flag. +.RS 4 +.Sp +.Vb 1 +\& bool sv_2bool(SV * const sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_2bool_flags""" 4 +.el .IP \f(CWsv_2bool_flags\fR 4 +.IX Xref "sv_2bool_flags" +.IX Item "sv_2bool_flags" +This function is only used by \f(CWsv_true()\fR and friends, and only if +the latter's argument is neither \f(CW\*(C`SvPOK\*(C'\fR, \f(CW\*(C`SvIOK\*(C'\fR nor \f(CW\*(C`SvNOK\*(C'\fR. If the flags +contain \f(CW\*(C`SV_GMAGIC\*(C'\fR, then it does an \f(CWmg_get()\fR first. +.RS 4 +.Sp +.Vb 1 +\& bool sv_2bool_flags(SV *sv, I32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_clean_all""" 4 +.el .IP \f(CWsv_clean_all\fR 4 +.IX Xref "sv_clean_all" +.IX Item "sv_clean_all" +Decrement the refcnt of each remaining SV, possibly triggering a +cleanup. This function may have to be called multiple times to free +SVs which are in complex self-referential hierarchies. +.RS 4 +.Sp +.Vb 1 +\& I32 sv_clean_all() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_clean_objs""" 4 +.el .IP \f(CWsv_clean_objs\fR 4 +.IX Xref "sv_clean_objs" +.IX Item "sv_clean_objs" +Attempt to destroy all objects not yet freed. +.RS 4 +.Sp +.Vb 1 +\& void sv_clean_objs() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_free_arenas""" 4 +.el .IP \f(CWsv_free_arenas\fR 4 +.IX Xref "sv_free_arenas" +.IX Item "sv_free_arenas" +Deallocate the memory used by all arenas. Note that all the individual SV +heads and bodies within the arenas must already have been freed. +.RS 4 +.Sp +.Vb 1 +\& void sv_free_arenas() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_grow""" 4 +.el .IP \f(CWsv_grow\fR 4 +.IX Xref "sv_grow" +.IX Item "sv_grow" +Expands the character buffer in the SV. If necessary, uses \f(CW\*(C`sv_unref\*(C'\fR and +upgrades the SV to \f(CW\*(C`SVt_PV\*(C'\fR. Returns a pointer to the character buffer. +Use the \f(CW\*(C`SvGROW\*(C'\fR wrapper instead. +.RS 4 +.Sp +.Vb 1 +\& char * sv_grow(SV * const sv, STRLEN newlen) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_grow_fresh""" 4 +.el .IP \f(CWsv_grow_fresh\fR 4 +.IX Xref "sv_grow_fresh" +.IX Item "sv_grow_fresh" +A cut-down version of sv_grow intended only for when sv is a freshly-minted +SVt_PV, SVt_PVIV, SVt_PVNV, or SVt_PVMG. i.e. sv has the default flags, has +never been any other type, and does not have an existing string. Basically, +just assigns a char buffer and returns a pointer to it. +.RS 4 +.Sp +.Vb 1 +\& char * sv_grow_fresh(SV * const sv, STRLEN newlen) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_newref""" 4 +.el .IP \f(CWsv_newref\fR 4 +.IX Xref "sv_newref" +.IX Item "sv_newref" +Increment an SV's reference count. Use the \f(CWSvREFCNT_inc()\fR wrapper +instead. +.RS 4 +.Sp +.Vb 1 +\& SV * sv_newref(SV * const sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_2num""" 4 +.el .IP \f(CWsv_2num\fR 4 +.IX Xref "sv_2num" +.IX Item "sv_2num" +NOTE: \f(CW\*(C`sv_2num\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +Return an SV with the numeric value of the source SV, doing any necessary +reference or overload conversion. The caller is expected to have handled +get-magic already. +.RS 4 +.Sp +.Vb 1 +\& SV * sv_2num(SV * const sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_pv""" 4 +.el .IP \f(CWsv_pv\fR 4 +.IX Xref "sv_pv" +.IX Item "sv_pv" +Use the \f(CW\*(C`SvPV_nolen\*(C'\fR macro instead +.RS 4 +.Sp +.Vb 1 +\& char * sv_pv(SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_pvbyte""" 4 +.el .IP \f(CWsv_pvbyte\fR 4 +.IX Xref "sv_pvbyte" +.IX Item "sv_pvbyte" +Use \f(CW\*(C`SvPVbyte_nolen\*(C'\fR instead. +.RS 4 +.Sp +.Vb 1 +\& char * sv_pvbyte(SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_pvbyten_force""" 4 +.el .IP \f(CWsv_pvbyten_force\fR 4 +.IX Xref "sv_pvbyten_force" +.IX Item "sv_pvbyten_force" +The backend for the \f(CW\*(C`SvPVbytex_force\*(C'\fR macro. Always use the macro +instead. If the SV cannot be downgraded from UTF\-8, this croaks. +.RS 4 +.Sp +.Vb 1 +\& char * sv_pvbyten_force(SV * const sv, STRLEN * const lp) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_2pvbyte_nolen""" 4 +.el .IP \f(CWsv_2pvbyte_nolen\fR 4 +.IX Xref "sv_2pvbyte_nolen" +.IX Item "sv_2pvbyte_nolen" +Return a pointer to the byte-encoded representation of the SV. +May cause the SV to be downgraded from UTF\-8 as a side-effect. +.Sp +Usually accessed via the \f(CW\*(C`SvPVbyte_nolen\*(C'\fR macro. +.RS 4 +.Sp +.Vb 1 +\& char * sv_2pvbyte_nolen(SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_pvn_force""" 4 +.el .IP \f(CWsv_pvn_force\fR 4 +.IX Xref "sv_pvn_force" +.IX Item "sv_pvn_force" +Get a sensible string out of the SV somehow. +A private implementation of the \f(CW\*(C`SvPV_force\*(C'\fR macro for compilers which +can't cope with complex macro expressions. Always use the macro instead. +.RS 4 +.Sp +.Vb 1 +\& char * sv_pvn_force(SV *sv, STRLEN *lp) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_2pv_nolen""" 4 +.el .IP \f(CWsv_2pv_nolen\fR 4 +.IX Xref "sv_2pv_nolen" +.IX Item "sv_2pv_nolen" +Like \f(CWsv_2pv()\fR, but doesn't return the length too. You should usually +use the macro wrapper \f(CWSvPV_nolen(sv)\fR instead. +.RS 4 +.Sp +.Vb 1 +\& char * sv_2pv_nolen(SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_pvutf8n_force""" 4 +.el .IP \f(CWsv_pvutf8n_force\fR 4 +.IX Xref "sv_pvutf8n_force" +.IX Item "sv_pvutf8n_force" +The backend for the \f(CW\*(C`SvPVutf8x_force\*(C'\fR macro. Always use the macro +instead. +.RS 4 +.Sp +.Vb 1 +\& char * sv_pvutf8n_force(SV * const sv, STRLEN * const lp) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_2pvutf8_nolen""" 4 +.el .IP \f(CWsv_2pvutf8_nolen\fR 4 +.IX Xref "sv_2pvutf8_nolen" +.IX Item "sv_2pvutf8_nolen" +Return a pointer to the UTF\-8\-encoded representation of the SV. +May cause the SV to be upgraded to UTF\-8 as a side-effect. +.Sp +Usually accessed via the \f(CW\*(C`SvPVutf8_nolen\*(C'\fR macro. +.RS 4 +.Sp +.Vb 1 +\& char * sv_2pvutf8_nolen(SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_pvutf8""" 4 +.el .IP \f(CWsv_pvutf8\fR 4 +.IX Xref "sv_pvutf8" +.IX Item "sv_pvutf8" +Use the \f(CW\*(C`SvPVutf8_nolen\*(C'\fR macro instead +.RS 4 +.Sp +.Vb 1 +\& char * sv_pvutf8(SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_tainted""" 4 +.el .IP \f(CWsv_tainted\fR 4 +.IX Xref "sv_tainted" +.IX Item "sv_tainted" +Test an SV for taintedness. Use \f(CW\*(C`SvTAINTED\*(C'\fR instead. +.RS 4 +.Sp +.Vb 1 +\& bool sv_tainted(SV * const sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """SvTHINKFIRST""" 4 +.el .IP \f(CWSvTHINKFIRST\fR 4 +.IX Xref "SvTHINKFIRST" +.IX Item "SvTHINKFIRST" +A quick flag check to see whether an \f(CW\*(C`sv\*(C'\fR should be passed to \f(CW\*(C`sv_force_normal\*(C'\fR +to be "downgraded" before \f(CW\*(C`SvIVX\*(C'\fR or \f(CW\*(C`SvPVX\*(C'\fR can be modified directly. +.Sp +For example, if your scalar is a reference and you want to modify the \f(CW\*(C`SvIVX\*(C'\fR +slot, you can't just do \f(CW\*(C`SvROK_off\*(C'\fR, as that will leak the referent. +.Sp +This is used internally by various sv-modifying functions, such as +\&\f(CW\*(C`sv_setsv\*(C'\fR, \f(CW\*(C`sv_setiv\*(C'\fR and \f(CW\*(C`sv_pvn_force\*(C'\fR. +.Sp +One case that this does not handle is a gv without SvFAKE set. After +.Sp +.Vb 1 +\& if (SvTHINKFIRST(gv)) sv_force_normal(gv); +.Ve +.Sp +it will still be a gv. +.Sp +\&\f(CW\*(C`SvTHINKFIRST\*(C'\fR sometimes produces false positives. In those cases +\&\f(CW\*(C`sv_force_normal\*(C'\fR does nothing. +.RS 4 +.Sp +.Vb 1 +\& U32 SvTHINKFIRST(SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_true""" 4 +.el .IP \f(CWsv_true\fR 4 +.IX Xref "sv_true" +.IX Item "sv_true" +Returns true if the SV has a true value by Perl's rules. +Use the \f(CW\*(C`SvTRUE\*(C'\fR macro instead, which may call \f(CWsv_true()\fR or may +instead use an in-line version. +.RS 4 +.Sp +.Vb 1 +\& I32 sv_true(SV * const sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """sv_untaint""" 4 +.el .IP \f(CWsv_untaint\fR 4 +.IX Xref "sv_untaint" +.IX Item "sv_untaint" +Untaint an SV. Use \f(CW\*(C`SvTAINTED_off\*(C'\fR instead. +.RS 4 +.Sp +.Vb 1 +\& void sv_untaint(SV * const sv) +.Ve +.RE +.RS 4 +.RE +.SH Tainting +.IX Header "Tainting" +.ie n .IP """sv_taint""" 4 +.el .IP \f(CWsv_taint\fR 4 +.IX Xref "sv_taint" +.IX Item "sv_taint" +Taint an SV. Use \f(CW\*(C`SvTAINTED_on\*(C'\fR instead. +.RS 4 +.Sp +.Vb 1 +\& void sv_taint(SV *sv) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT""" 4 +.el .IP \f(CWTAINT\fR 4 +.IX Xref "TAINT" +.IX Item "TAINT" +If we aren't in taint checking mode, do nothing; +otherwise indicate to "\f(CW\*(C`TAINT_set\*(C'\fR" and "\f(CW\*(C`TAINT_PROPER\*(C'\fR" that some +unspecified element is tainted. +.RS 4 +.Sp +.Vb 1 +\& void TAINT() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT_ENV""" 4 +.el .IP \f(CWTAINT_ENV\fR 4 +.IX Xref "TAINT_ENV" +.IX Item "TAINT_ENV" +Looks at several components of \f(CW%ENV\fR for taintedness, and +calls "\f(CW\*(C`taint_proper\*(C'\fR" if any are tainted. The components it searches are +things like \f(CW$PATH\fR. +.RS 4 +.Sp +.Vb 1 +\& void TAINT_ENV +.Ve +.RE +.RS 4 +.RE +.ie n .IP """taint_env""" 4 +.el .IP \f(CWtaint_env\fR 4 +.IX Xref "taint_env" +.IX Item "taint_env" +Implements the "TAINT_ENV" macro, which you should generally use instead. +.RS 4 +.Sp +.Vb 1 +\& void taint_env() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT_get""" 4 +.el .IP \f(CWTAINT_get\fR 4 +.IX Xref "TAINT_get" +.IX Item "TAINT_get" +Returns a boolean as to whether some element is tainted or not. +.RS 4 +.Sp +.Vb 1 +\& bool TAINT_get() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT_IF""" 4 +.el .IP \f(CWTAINT_IF\fR 4 +.IX Xref "TAINT_IF" +.IX Item "TAINT_IF" +If \f(CW\*(C`c\*(C'\fR evaluates to true, call "\f(CW\*(C`TAINT\*(C'\fR" to indicate that something is +tainted; otherwise do nothing. +.RS 4 +.Sp +.Vb 1 +\& void TAINT_IF(bool c) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINTING_get""" 4 +.el .IP \f(CWTAINTING_get\fR 4 +.IX Xref "TAINTING_get" +.IX Item "TAINTING_get" +Returns a boolean as to whether taint checking is enabled or not. +.RS 4 +.Sp +.Vb 1 +\& bool TAINTING_get() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINTING_set""" 4 +.el .IP \f(CWTAINTING_set\fR 4 +.IX Xref "TAINTING_set" +.IX Item "TAINTING_set" +Turn taint checking mode off/on +.RS 4 +.Sp +.Vb 1 +\& void TAINTING_set(bool s) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT_NOT""" 4 +.el .IP \f(CWTAINT_NOT\fR 4 +.IX Xref "TAINT_NOT" +.IX Item "TAINT_NOT" +Remove any taintedness previously set by, \fIe.g.\fR, \f(CW\*(C`TAINT\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& void TAINT_NOT() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT_PROPER""" 4 +.el .IP \f(CWTAINT_PROPER\fR 4 +.IX Xref "TAINT_PROPER" +.IX Item "TAINT_PROPER" +If no element is tainted, do nothing; +otherwise output a message (containing \f(CW\*(C`s\*(C'\fR) that indicates there is a +tainting violation. If such violations are fatal, it croaks. +.RS 4 +.Sp +.Vb 1 +\& void TAINT_PROPER(const char * s) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """taint_proper""" 4 +.el .IP \f(CWtaint_proper\fR 4 +.IX Xref "taint_proper" +.IX Item "taint_proper" +Implements the "TAINT_PROPER" macro, which you should generally use instead. +.RS 4 +.Sp +.Vb 1 +\& void taint_proper(const char *f, const char * const s) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT_set""" 4 +.el .IP \f(CWTAINT_set\fR 4 +.IX Xref "TAINT_set" +.IX Item "TAINT_set" +If \f(CW\*(C`s\*(C'\fR is true, "\f(CW\*(C`TAINT_get\*(C'\fR" returns true; +If \f(CW\*(C`s\*(C'\fR is false, "\f(CW\*(C`TAINT_get\*(C'\fR" returns false; +.RS 4 +.Sp +.Vb 1 +\& void TAINT_set(bool s) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT_WARN_get""" 4 +.el .IP \f(CWTAINT_WARN_get\fR 4 +.IX Xref "TAINT_WARN_get" +.IX Item "TAINT_WARN_get" +Returns false if tainting violations are fatal; +Returns true if they're just warnings +.RS 4 +.Sp +.Vb 1 +\& bool TAINT_WARN_get() +.Ve +.RE +.RS 4 +.RE +.ie n .IP """TAINT_WARN_set""" 4 +.el .IP \f(CWTAINT_WARN_set\fR 4 +.IX Xref "TAINT_WARN_set" +.IX Item "TAINT_WARN_set" +\&\f(CW\*(C`s\*(C'\fR being true indicates "\f(CW\*(C`TAINT_WARN_get\*(C'\fR" should return that tainting +violations are just warnings +.Sp +\&\f(CW\*(C`s\*(C'\fR being false indicates "\f(CW\*(C`TAINT_WARN_get\*(C'\fR" should return that tainting +violations are fatal. +.RS 4 +.Sp +.Vb 1 +\& void TAINT_WARN_set(bool s) +.Ve +.RE +.RS 4 +.RE +.SH Time +.IX Header "Time" +There are currently no internal API items in Time +.SH "Typedef names" +.IX Header "Typedef names" +There are currently no internal API items in Typedef names +.SH "Unicode Support" +.IX Xref "FOLDEQ_LOCALE FOLDEQ_S1_ALREADY_FOLDED FOLDEQ_S1_FOLDS_SANE FOLDEQ_S2_ALREADY_FOLDED FOLDEQ_S2_FOLDS_SANE FOLDEQ_UTF8_NOMIX_ASCII" +.IX Header "Unicode Support" +.ie n .IP """bytes_from_utf8_loc""" 4 +.el .IP \f(CWbytes_from_utf8_loc\fR 4 +.IX Xref "bytes_from_utf8_loc" +.IX Item "bytes_from_utf8_loc" +NOTE: \f(CW\*(C`bytes_from_utf8_loc\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +Like \f(CW\*(C`"bytes_from_utf8" in perlapi()\*(C'\fR, but takes an extra parameter, a pointer +to where to store the location of the first character in \f(CW"s"\fR that cannot be +converted to non\-UTF8. +.Sp +If that parameter is \f(CW\*(C`NULL\*(C'\fR, this function behaves identically to +\&\f(CW\*(C`bytes_from_utf8\*(C'\fR. +.Sp +Otherwise if \f(CW*is_utf8p\fR is 0 on input, the function behaves identically to +\&\f(CW\*(C`bytes_from_utf8\*(C'\fR, except it also sets \f(CW*first_non_downgradable\fR to \f(CW\*(C`NULL\*(C'\fR. +.Sp +Otherwise, the function returns a newly created \f(CW\*(C`NUL\*(C'\fR\-terminated string +containing the non\-UTF8 equivalent of the convertible first portion of +\&\f(CW"s"\fR. \f(CW*lenp\fR is set to its length, not including the terminating \f(CW\*(C`NUL\*(C'\fR. +If the entire input string was converted, \f(CW*is_utf8p\fR is set to a FALSE value, +and \f(CW*first_non_downgradable\fR is set to \f(CW\*(C`NULL\*(C'\fR. +.Sp +Otherwise, \f(CW*first_non_downgradable\fR is set to point to the first byte of the +first character in the original string that wasn't converted. \f(CW*is_utf8p\fR is +unchanged. Note that the new string may have length 0. +.Sp +Another way to look at it is, if \f(CW*first_non_downgradable\fR is non\-\f(CW\*(C`NULL\*(C'\fR and +\&\f(CW*is_utf8p\fR is TRUE, this function starts at the beginning of \f(CW"s"\fR and +converts as many characters in it as possible stopping at the first one it +finds that can't be converted to non\-UTF\-8. \f(CW*first_non_downgradable\fR is +set to point to that. The function returns the portion that could be converted +in a newly created \f(CW\*(C`NUL\*(C'\fR\-terminated string, and \f(CW*lenp\fR is set to its length, +not including the terminating \f(CW\*(C`NUL\*(C'\fR. If the very first character in the +original could not be converted, \f(CW*lenp\fR will be 0, and the new string will +contain just a single \f(CW\*(C`NUL\*(C'\fR. If the entire input string was converted, +\&\f(CW*is_utf8p\fR is set to FALSE and \f(CW*first_non_downgradable\fR is set to \f(CW\*(C`NULL\*(C'\fR. +.Sp +Upon successful return, the number of variants in the converted portion of the +string can be computed by having saved the value of \f(CW*lenp\fR before the call, +and subtracting the after-call value of \f(CW*lenp\fR from it. +.RS 4 +.Sp +.Vb 3 +\& U8 * bytes_from_utf8_loc(const U8 *s, STRLEN *lenp, +\& bool *is_utf8p, +\& const U8 **first_unconverted) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """find_uninit_var""" 4 +.el .IP \f(CWfind_uninit_var\fR 4 +.IX Xref "find_uninit_var" +.IX Item "find_uninit_var" +NOTE: \f(CW\*(C`find_uninit_var\*(C'\fR is \fBexperimental\fR and may change or be +removed without notice. +.Sp +Find the name of the undefined variable (if any) that caused the operator +to issue a "Use of uninitialized value" warning. +If match is true, only return a name if its value matches \f(CW\*(C`uninit_sv\*(C'\fR. +So roughly speaking, if a unary operator (such as \f(CW\*(C`OP_COS\*(C'\fR) generates a +warning, then following the direct child of the op may yield an +\&\f(CW\*(C`OP_PADSV\*(C'\fR or \f(CW\*(C`OP_GV\*(C'\fR that gives the name of the undefined variable. On the +other hand, with \f(CW\*(C`OP_ADD\*(C'\fR there are two branches to follow, so we only print +the variable name if we get an exact match. +\&\f(CW\*(C`desc_p\*(C'\fR points to a string pointer holding the description of the op. +This may be updated if needed. +.Sp +The name is returned as a mortal SV. +.Sp +Assumes that \f(CW\*(C`PL_op\*(C'\fR is the OP that originally triggered the error, and that +\&\f(CW\*(C`PL_comppad\*(C'\fR/\f(CW\*(C`PL_curpad\*(C'\fR points to the currently executing pad. +.RS 4 +.Sp +.Vb 3 +\& SV * find_uninit_var(const OP * const obase, +\& const SV * const uninit_sv, bool match, +\& const char **desc_p) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """isSCRIPT_RUN""" 4 +.el .IP \f(CWisSCRIPT_RUN\fR 4 +.IX Xref "isSCRIPT_RUN" +.IX Item "isSCRIPT_RUN" +Returns a bool as to whether or not the sequence of bytes from \f(CW\*(C`s\*(C'\fR up to but +not including \f(CW\*(C`send\*(C'\fR form a "script run". \f(CW\*(C`utf8_target\*(C'\fR is TRUE iff the +sequence starting at \f(CW\*(C`s\*(C'\fR is to be treated as UTF\-8. To be precise, except for +two degenerate cases given below, this function returns TRUE iff all code +points in it come from any combination of three "scripts" given by the Unicode +"Script Extensions" property: Common, Inherited, and possibly one other. +Additionally all decimal digits must come from the same consecutive sequence of +10. +.Sp +For example, if all the characters in the sequence are Greek, or Common, or +Inherited, this function will return TRUE, provided any decimal digits in it +are from the same block of digits in Common. (These are the ASCII digits +"0".."9" and additionally a block for full width forms of these, and several +others used in mathematical notation.) For scripts (unlike Greek) that have +their own digits defined this will accept either digits from that set or from +one of the Common digit sets, but not a combination of the two. Some scripts, +such as Arabic, have more than one set of digits. All digits must come from +the same set for this function to return TRUE. +.Sp +\&\f(CW*ret_script\fR, if \f(CW\*(C`ret_script\*(C'\fR is not NULL, will on return of TRUE +contain the script found, using the \f(CW\*(C`SCX_enum\*(C'\fR typedef. Its value will be +\&\f(CW\*(C`SCX_INVALID\*(C'\fR if the function returns FALSE. +.Sp +If the sequence is empty, TRUE is returned, but \f(CW*ret_script\fR (if asked for) +will be \f(CW\*(C`SCX_INVALID\*(C'\fR. +.Sp +If the sequence contains a single code point which is unassigned to a character +in the version of Unicode being used, the function will return TRUE, and the +script will be \f(CW\*(C`SCX_Unknown\*(C'\fR. Any other combination of unassigned code points +in the input sequence will result in the function treating the input as not +being a script run. +.Sp +The returned script will be \f(CW\*(C`SCX_Inherited\*(C'\fR iff all the code points in it are +from the Inherited script. +.Sp +Otherwise, the returned script will be \f(CW\*(C`SCX_Common\*(C'\fR iff all the code points in +it are from the Inherited or Common scripts. +.RS 4 +.Sp +.Vb 2 +\& bool isSCRIPT_RUN(const U8 *s, const U8 *send, +\& const bool utf8_target) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """is_utf8_non_invariant_string""" 4 +.el .IP \f(CWis_utf8_non_invariant_string\fR 4 +.IX Xref "is_utf8_non_invariant_string" +.IX Item "is_utf8_non_invariant_string" +Returns TRUE if "is_utf8_invariant_string" in perlapi returns FALSE for the first +\&\f(CW\*(C`len\*(C'\fR bytes of the string \f(CW\*(C`s\*(C'\fR, but they are, nonetheless, legal Perl-extended +UTF\-8; otherwise returns FALSE. +.Sp +A TRUE return means that at least one code point represented by the sequence +either is a wide character not representable as a single byte, or the +representation differs depending on whether the sequence is encoded in UTF\-8 or +not. +.Sp +See also +\&\f(CW\*(C`"is_utf8_invariant_string" in perlapi\*(C'\fR, +\&\f(CW\*(C`"is_utf8_string" in perlapi\*(C'\fR +.RS 4 +.Sp +.Vb 1 +\& bool is_utf8_non_invariant_string(const U8 * const s, STRLEN len) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """utf8n_to_uvuni""" 4 +.el .IP \f(CWutf8n_to_uvuni\fR 4 +.IX Xref "utf8n_to_uvuni" +.IX Item "utf8n_to_uvuni" +\&\f(CW\*(C`\fR\f(CBDEPRECATED!\fR\f(CW\*(C'\fR It is planned to remove \f(CW\*(C`utf8n_to_uvuni\*(C'\fR +from a future release of Perl. Do not use it for +new code; remove it from existing code. +.Sp +Instead use "utf8_to_uvchr_buf" in perlapi, or rarely, "utf8n_to_uvchr" in perlapi. +.Sp +This function was useful for code that wanted to handle both EBCDIC and +ASCII platforms with Unicode properties, but starting in Perl v5.20, the +distinctions between the platforms have mostly been made invisible to most +code, so this function is quite unlikely to be what you want. If you do need +this precise functionality, use instead +\&\f(CW\*(C`NATIVE_TO_UNI(utf8_to_uvchr_buf(...))\*(C'\fR +or \f(CW\*(C`NATIVE_TO_UNI(utf8n_to_uvchr(...))\*(C'\fR. +.RS 4 +.Sp +.Vb 2 +\& UV utf8n_to_uvuni(const U8 *s, STRLEN curlen, STRLEN *retlen, +\& U32 flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """utf8_to_uvuni""" 4 +.el .IP \f(CWutf8_to_uvuni\fR 4 +.IX Xref "utf8_to_uvuni" +.IX Item "utf8_to_uvuni" +\&\f(CW\*(C`\fR\f(CBDEPRECATED!\fR\f(CW\*(C'\fR It is planned to remove \f(CW\*(C`utf8_to_uvuni\*(C'\fR +from a future release of Perl. Do not use it for +new code; remove it from existing code. +.Sp +Returns the Unicode code point of the first character in the string \f(CW\*(C`s\*(C'\fR +which is assumed to be in UTF\-8 encoding; \f(CW\*(C`retlen\*(C'\fR will be set to the +length, in bytes, of that character. +.Sp +Some, but not all, UTF\-8 malformations are detected, and in fact, some +malformed input could cause reading beyond the end of the input buffer, which +is one reason why this function is deprecated. The other is that only in +extremely limited circumstances should the Unicode versus native code point be +of any interest to you. +.Sp +If \f(CW\*(C`s\*(C'\fR points to one of the detected malformations, and UTF8 warnings are +enabled, zero is returned and \f(CW*retlen\fR is set (if \f(CW\*(C`retlen\*(C'\fR doesn't point to +NULL) to \-1. If those warnings are off, the computed value if well-defined (or +the Unicode REPLACEMENT CHARACTER, if not) is silently returned, and \f(CW*retlen\fR +is set (if \f(CW\*(C`retlen\*(C'\fR isn't NULL) so that (\f(CW\*(C`s\*(C'\fR\ +\ \f(CW*retlen\fR) is the +next possible position in \f(CW\*(C`s\*(C'\fR that could begin a non-malformed character. +See "utf8n_to_uvchr" in perlapi for details on when the REPLACEMENT CHARACTER is returned. +.RS 4 +.Sp +.Vb 1 +\& UV utf8_to_uvuni(const U8 *s, STRLEN *retlen) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """uvoffuni_to_utf8_flags""" 4 +.el .IP \f(CWuvoffuni_to_utf8_flags\fR 4 +.IX Xref "uvoffuni_to_utf8_flags" +.IX Item "uvoffuni_to_utf8_flags" +THIS FUNCTION SHOULD BE USED IN ONLY VERY SPECIALIZED CIRCUMSTANCES. +Instead, \fBAlmost all code should use "uvchr_to_utf8" in perlapi or +"uvchr_to_utf8_flags" in perlapi\fR. +.Sp +This function is like them, but the input is a strict Unicode +(as opposed to native) code point. Only in very rare circumstances should code +not be using the native code point. +.Sp +For details, see the description for "uvchr_to_utf8_flags" in perlapi. +.RS 4 +.Sp +.Vb 1 +\& U8 * uvoffuni_to_utf8_flags(U8 *d, UV uv, UV flags) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """valid_utf8_to_uvchr""" 4 +.el .IP \f(CWvalid_utf8_to_uvchr\fR 4 +.IX Xref "valid_utf8_to_uvchr" +.IX Item "valid_utf8_to_uvchr" +Like \f(CW\*(C`"utf8_to_uvchr_buf" in perlapi\*(C'\fR, but should only be called when it is +known that the next character in the input UTF\-8 string \f(CW\*(C`s\*(C'\fR is well-formed +(\fIe.g.\fR, it passes \f(CW\*(C`"isUTF8_CHAR" in perlapi\*(C'\fR. Surrogates, non-character code +points, and non-Unicode code points are allowed. +.RS 4 +.Sp +.Vb 1 +\& UV valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """variant_under_utf8_count""" 4 +.el .IP \f(CWvariant_under_utf8_count\fR 4 +.IX Xref "variant_under_utf8_count" +.IX Item "variant_under_utf8_count" +This function looks at the sequence of bytes between \f(CW\*(C`s\*(C'\fR and \f(CW\*(C`e\*(C'\fR, which are +assumed to be encoded in ASCII/Latin1, and returns how many of them would +change should the string be translated into UTF\-8. Due to the nature of UTF\-8, +each of these would occupy two bytes instead of the single one in the input +string. Thus, this function returns the precise number of bytes the string +would expand by when translated to UTF\-8. +.Sp +Unlike most of the other functions that have \f(CW\*(C`utf8\*(C'\fR in their name, the input +to this function is NOT a UTF\-8\-encoded string. The function name is slightly +\&\fIodd\fR to emphasize this. +.Sp +This function is internal to Perl because khw thinks that any XS code that +would want this is probably operating too close to the internals. Presenting a +valid use case could change that. +.Sp +See also +\&\f(CW\*(C`"is_utf8_invariant_string" in perlapi\*(C'\fR +and +\&\f(CW\*(C`"is_utf8_invariant_string_loc" in perlapi\*(C'\fR, +.RS 4 +.Sp +.Vb 2 +\& Size_t variant_under_utf8_count(const U8 * const s, +\& const U8 * const e) +.Ve +.RE +.RS 4 +.RE +.SH "Utility Functions" +.IX Header "Utility Functions" +.ie n .IP """my_popen_list""" 4 +.el .IP \f(CWmy_popen_list\fR 4 +.IX Xref "my_popen_list" +.IX Item "my_popen_list" +Implementing function on some systems for \fBPerlProc_popen_list()\fR +.RS 4 +.Sp +.Vb 1 +\& PerlIO * my_popen_list(const char *mode, int n, SV **args) +.Ve +.RE +.RS 4 +.RE +.ie n .IP """my_socketpair""" 4 +.el .IP \f(CWmy_socketpair\fR 4 +.IX Xref "my_socketpair" +.IX Item "my_socketpair" +Emulates \fBsocketpair\fR\|(2) on systems that don't have it, but which do have +enough functionality for the emulation. +.RS 4 +.Sp +.Vb 1 +\& int my_socketpair(int family, int type, int protocol, int fd[2]) +.Ve +.RE +.RS 4 +.RE +.SH Versioning +.IX Header "Versioning" +There are currently no internal API items in Versioning +.SH "Warning and Dieing" +.IX Header "Warning and Dieing" +.ie n .IP """deprecate""" 4 +.el .IP \f(CWdeprecate\fR 4 +.IX Xref "deprecate" +.IX Item "deprecate" +Wrapper around \fBPerl_ck_warner_d()\fR to produce a deprecated warning in the +given category with an appropriate message. The \f(CW\*(C`message\*(C'\fR argument must +be a C string. The string " is deprecated" will automatically be added +to the end of the \f(CW\*(C`message\*(C'\fR. +.RS 4 +.Sp +.Vb 1 +\& deprecate(U32 category, "message") +.Ve +.RE +.RS 4 +.RE +.ie n .IP """deprecate_disappears_in""" 4 +.el .IP \f(CWdeprecate_disappears_in\fR 4 +.IX Xref "deprecate_disappears_in" +.IX Item "deprecate_disappears_in" +Wrapper around \fBPerl_ck_warner_d()\fR to produce a deprecated warning in the +given category with an appropriate message that the construct referred +to by the message will disappear in a specific release. The \f(CW\*(C`when\*(C'\fR and +\&\f(CW\*(C`message\*(C'\fR arguments must be a C string. The \f(CW\*(C`when\*(C'\fR string is expected +to be of the form "5.40", with no minor element in the version. The actual +message output will be the result of the following expression \f(CW\*(C`message +" is deprecated, and will disappear in Perl " when\*(C'\fR which is why \f(CW\*(C`message\*(C'\fR +and \f(CW\*(C`when\*(C'\fR must be literal C strings. +.RS 4 +.Sp +.Vb 1 +\& deprecate_disappears_in(U32 category, "when", "message") +.Ve +.RE +.RS 4 +.RE +.ie n .IP """deprecate_fatal_in""" 4 +.el .IP \f(CWdeprecate_fatal_in\fR 4 +.IX Xref "deprecate_fatal_in" +.IX Item "deprecate_fatal_in" +Wrapper around \fBPerl_ck_warner_d()\fR to produce a deprecated warning in the +given category with an appropriate message that the construct referred +to by the message will become fatal in a specific release. The \f(CW\*(C`when\*(C'\fR +and \f(CW\*(C`message\*(C'\fR arguments must be a C string. The \f(CW\*(C`when\*(C'\fR string is expected +to be of the form "5.40", with no minor element in the version. The actual +message output will be the result of the following expression \f(CW\*(C`message " is +deprecated, and will become fatal in Perl " when\*(C'\fR which is why \f(CW\*(C`message\*(C'\fR +and \f(CW\*(C`when\*(C'\fR must be literal C strings. +.RS 4 +.Sp +.Vb 1 +\& deprecate_fatal_in(U32 category, "when", "message") +.Ve +.RE +.RS 4 +.RE +.ie n .IP """PL_dowarn""" 4 +.el .IP \f(CWPL_dowarn\fR 4 +.IX Xref "PL_dowarn" +.IX Item "PL_dowarn" +The C variable that roughly corresponds to Perl's \f(CW$^W\fR warning variable. +However, \f(CW$^W\fR is treated as a boolean, whereas \f(CW\*(C`PL_dowarn\*(C'\fR is a +collection of flag bits. +.Sp +On threaded perls, each thread has an independent copy of this variable; +each initialized at creation time with the current value of the creating +thread's copy. +.RS 4 +.Sp +.Vb 1 +\& U8 PL_dowarn +.Ve +.RE +.RS 4 +.RE +.ie n .IP """report_uninit""" 4 +.el .IP \f(CWreport_uninit\fR 4 +.IX Xref "report_uninit" +.IX Item "report_uninit" +Print appropriate "Use of uninitialized variable" warning. +.RS 4 +.Sp +.Vb 1 +\& void report_uninit(const SV *uninit_sv) +.Ve +.RE +.RS 4 +.RE +.SH XS +.IX Header "XS" +There are currently no internal API items in XS +.SH "Undocumented elements" +.IX Header "Undocumented elements" +This section lists the elements that are otherwise undocumented. If you use +any of them, please consider creating and submitting documentation for it. +.PP +Experimental and deprecated undocumented elements are listed separately at the +end. +.PP + +.IX Xref "abort_execution add_above_Latin1_folds add_cp_to_invlist _add_range_to_invlist allocmy amagic_cmp amagic_cmp_desc amagic_cmp_locale amagic_cmp_locale_desc amagic_i_ncmp amagic_i_ncmp_desc amagic_is_enabled amagic_ncmp amagic_ncmp_desc any_dup append_utf8_from_native_byte apply atfork_lock atfork_unlock av_arylen_p av_extend_guts av_iter_p av_nonelem av_reify bind_match block_gimme boot_core_builtin boot_core_mro boot_core_PerlIO boot_core_UNIVERSAL build_infix_plugin _byte_dump_string call_list cando capture_clear cast_iv cast_i32 cast_ulong cast_uv check_hash_fields_and_hekify check_regnode_after check_utf8_print ck_anoncode ck_backtick ck_bitop ck_cmp ck_concat ck_defined ck_delete ck_each ck_entersub_args_core ck_eof ck_eval ck_exec ck_exists ck_ftst ck_fun ck_glob ck_grep ck_helemexistsor ck_index ck_isa ck_join ck_length ck_lfun ck_listiob ck_match ck_method ck_null ck_open ck_prototype ck_readline ck_refassign ck_repeat ck_require ck_return ck_rfun ck_rvconst ck_sassign ck_select ck_shift ck_smartmatch ck_sort ck_spair ck_split ck_stringify ck_subr ck_substr ck_svconst ck_tell ck_trunc ck_trycatch ckwarn ckwarn_d class_add_ADJUST class_add_field class_apply_attributes class_apply_field_attributes class_prepare_initfield_parse class_prepare_method_parse class_seal_stash class_set_field_defop class_setup_stash class_wrap_method_body clear_defarray closest_cop cmpchain_extend cmpchain_finish cmpchain_start cmp_desc cmp_locale_desc cntrl_to_mnemonic construct_ahocorasick_from_trie cop_file_avn coresub_op croak_caller croak_kw_unless_class croak_memory_wrap croak_no_mem croak_popstack csighandler csighandler1 csighandler3 current_re_engine custom_op_get_field cv_clone_into cv_const_sv_or_av cvgv_from_hek cvgv_set cvstash_set cv_undef_flags cx_dump cx_dup cxinc deb_stack_all debstackptrs debug_hash_seed debug_peep debug_show_study_flags debug_studydata defelem_target despatch_signals die_unwind do_aexec do_aexec5 do_aspawn do_eof does_utf8_overflow do_exec do_exec3 dofile do_gv_dump do_gvgv_dump do_hv_dump doing_taint do_ipcctl do_ipcget do_magic_dump do_msgrcv do_msgsnd do_ncmp do_op_dump do_pmop_dump do_print do_readline doref do_seek do_semop do_shmio do_spawn do_spawn_nowait do_sv_dump do_sysseek do_tell do_trans do_uniprop_match do_vecget do_vecset do_vop drand48_init_r drand48_r dtrace_probe_call dtrace_probe_load dtrace_probe_op dtrace_probe_phase dump_all_perl dump_indent dump_packsubs_perl dump_sub_perl dump_sv_child dumpuntil dump_vindent dup_warnings find_first_differing_byte_pos find_lexical_cv find_runcv_where find_script foldEQ_latin1_s2_folded foldEQ_latin1 foldEQ_utf8_flags force_locale_unlock _force_out_malformed_utf8_message form_alien_digit_msg form_cp_too_large_msg free_tied_hv_pool free_tmps get_and_check_backslash_N_name get_ANYOFHbbm_contents get_ANYOFM_contents get_db_sub get_debug_opts get_deprecated_property_msg getenv_len get_extended_os_errno get_hash_seed get_invlist_iter_addr get_invlist_offset_addr get_invlist_previous_index_addr get_mstats get_prop_definition get_prop_values get_regclass_aux_data get_re_gclass_aux_data get_regex_charset_name get_win32_message_utf8ness gp_free gp_ref grok_bin_oct_hex grok_bslash_c grok_bslash_o grok_bslash_x gv_check gv_fetchmeth_internal gv_override gv_setref gv_stashpvn_internal he_dup hek_dup hfree_next_entry hv_auxalloc hv_common hv_common_key_len hv_delayfree_ent hv_free_ent hv_placeholders_p hv_pushkv hv_rand_set hv_undef_flags infix_plugin_standard init_argv_symbols init_constants init_dbargs init_debugger init_i18nl10n init_named_cv init_stacks init_tm init_uniprops _inverse_folds invert invlist_array _invlist_array_init invlist_clear invlist_clone _invlist_contains_cp invlist_contents _invlist_dump _invlistEQ invlist_extend invlist_highest _invlist_intersection _invlist_intersection_maybe_complement_2nd _invlist_invert invlist_is_iterating invlist_iterfinish invlist_iterinit invlist_iternext _invlist_len invlist_max invlist_previous_index _invlist_search invlist_set_len invlist_set_previous_index _invlist_subtract invlist_trim _invlist_union _invlist_union_maybe_complement_2nd invmap_dump invoke_exception_hook io_close isFF_overlong is_grapheme _is_in_locale_category is_invlist is_ssc_worth_it _is_uni_FOO _is_uni_perl_idcont _is_uni_perl_idstart is_utf8_char_helper_ is_utf8_common is_utf8_FF_helper_ _is_utf8_FOO is_utf8_overlong _is_utf8_perl_idcont _is_utf8_perl_idstart jmaybe join_exact keyword keyword_plugin_standard list load_charnames locale_panic localize lossless_NV_to_IV lsbit_pos32 lsbit_pos64 magic_clear_all_env magic_cleararylen_p magic_clearenv magic_clearhook magic_clearhookall magic_clearisa magic_clearpack magic_clearsig magic_copycallchecker magic_existspack magic_freearylen_p magic_freecollxfrm magic_freemglob magic_freeovrld magic_freeutf8 magic_get magic_getarylen magic_getdebugvar magic_getdefelem magic_getnkeys magic_getpack magic_getpos magic_getsig magic_getsubstr magic_gettaint magic_getuvar magic_getvec magic_killbackrefs magic_nextpack magic_regdata_cnt magic_regdatum_get magic_regdatum_set magic_scalarpack magic_set magic_set_all_env magic_setarylen magic_setcollxfrm magic_setdbline magic_setdebugvar magic_setdefelem magic_setenv magic_sethook magic_sethookall magic_setisa magic_setlvref magic_setmglob magic_setnkeys magic_setnonelem magic_setpack magic_setpos magic_setregexp magic_setsig magic_setsigall magic_setsubstr magic_settaint magic_setutf8 magic_setuvar magic_setvec magic_sizepack magic_wipepack make_trie malloced_size malloc_good_size markstack_grow mbtowc_ mem_collxfrm_ mem_log_alloc mem_log_del_sv mem_log_free mem_log_new_sv mem_log_realloc mg_find_mglob mg_size mode_from_discipline more_bodies more_sv moreswitches mortal_getenv mortalized_pv_copy mro_get_private_data mro_meta_dup mro_meta_init msbit_pos32 msbit_pos64 multiconcat_stringify multideref_stringify my_atof2 my_atof3 my_attrs my_clearenv my_lstat my_lstat_flags my_memrchr my_mkostemp_cloexec my_mkstemp_cloexec my_stat my_stat_flags my_strerror my_strftime8_temp my_unexec newFORM _new_invlist _new_invlist_C_array newMETHOP_internal newMYSUB newPROG new_stackinfo newSTUB newSVavdefelem newXS_deffile nextargv no_bareword_allowed no_bareword_filehandle noperl_die notify_parser_that_changed_to_utf8 oopsAV oopsHV op_clear op_integerize op_lvalue_flags opmethod_stash op_prune_chain_head op_relocate_sv opslab_force_free opslab_free opslab_free_nopad op_std_init op_varname package package_version pad_add_weakref padlist_store padname_free PadnameIN_SCOPE padnamelist_free parser_dup parser_free parser_free_nexttoke_ops parse_unicode_opts path_is_searchable peep perl_alloc_using perl_clone_using PerlEnv_putenv PerlIO_context_layers PerlIO_restore_errno PerlIO_save_errno PerlLIO_dup_cloexec PerlLIO_dup2_cloexec PerlLIO_open_cloexec PerlLIO_open3_cloexec PerlProc_pipe_cloexec PerlSock_accept_cloexec PerlSock_socket_cloexec PerlSock_socketpair_cloexec perly_sighandler pmruntime POPMARK populate_anyof_bitmap_from_invlist populate_bitmap_from_invlist populate_invlist_from_bitmap populate_isa pregfree pregfree2 ptr_hash qerror ReANY reentrant_free reentrant_init reentrant_retry reentrant_size re_exec_indentf ref reg_add_data regcurly regdump regdupe_internal regexec_flags regfree_internal reginitcolors reg_named_buff reg_named_buff_all reg_named_buff_exists reg_named_buff_fetch reg_named_buff_firstkey reg_named_buff_iter reg_named_buff_nextkey reg_named_buff_scalar regnext regnode_after reg_numbered_buff_fetch reg_numbered_buff_fetch_flags reg_numbered_buff_length reg_numbered_buff_store regprop reg_qr_package reg_skipcomment reg_temp_copy re_indentf re_intuit_start re_intuit_string re_op_compile report_evil_fh report_redefined_cv report_wrongway_fh re_printf rpeep rsignal_restore rsignal_save rvpv_dup rxres_save same_dirent save_bool save_clearsv save_delete save_destructor save_destructor_x save_freeop save_freepv save_freesv save_int save_iv save_I8 save_I16 save_I32 save_mortalizesv save_pptr save_pushi32ptr save_pushptrptr save_re_context save_sptr savestack_grow savestack_grow_cnt save_strlen sawparens scalar scalarvoid scan_commit scan_num seed set_ANYOF_arg set_caret_X setfd_cloexec setfd_cloexec_for_nonsysfd setfd_cloexec_or_inhexec_by_sysfdness setfd_inhexec setfd_inhexec_for_sysfd set_numeric_standard set_numeric_underlying set_padlist _setup_canned_invlist share_hek should_warn_nl should_we_output_Debug_r sighandler sighandler1 sighandler3 single_1bit_pos32 single_1bit_pos64 Slab_Alloc Slab_Free Slab_to_ro Slab_to_rw softref2xv sortsv_flags_impl ssc_finalize ssc_init stack_grow str_to_version strxfrm study_chunk sub_crush_depth sv_add_backref sv_buf_to_ro sv_del_backref sv_i_ncmp sv_i_ncmp_desc sv_2iv sv_magicext_mglob sv_ncmp sv_ncmp_desc sv_only_taint_gmagic sv_or_pv_pos_u2b sv_pvbyten_force_wrapper sv_pvutf8n_force_wrapper sv_resetpvn sv_sethek SvTRUE_common sv_unglob sv_2uv switch_locale_context sys_init sys_init3 sys_intern_clear sys_intern_dup sys_intern_init sys_term tied_method tmps_grow_p _to_fold_latin1 TOPMARK to_uni_fold _to_uni_fold_flags to_uni_lower to_uni_title to_uni_upper _to_upper_title_latin1 _to_utf8_fold_flags _to_utf8_lower_flags _to_utf8_title_flags _to_utf8_upper_flags translate_substr_offsets try_amagic_bin try_amagic_un uiv_2buf unlnk unshare_hek unwind_paren _utf8n_to_uvchr_msgs_helper utf16_to_utf8_base utf16_to_utf8_reversed utf16_to_utf8 utf8_to_uvchr_buf_helper utilize uvoffuni_to_utf8_flags_msgs uvuni_to_utf8 variant_byte_number varname vivify_defelem vivify_ref wait4pid warn_elem_scalar_context _warn_problematic_locale was_lvalue_sub watch win32_croak_not_implemented write_to_stderr xs_boot_epilog xs_handshake yyerror yyerror_pv yyerror_pvn yylex yyparse yyquit yyunlex" +.PP +.Vb 10 +\& abort_execution +\& add_above_Latin1_folds +\& add_cp_to_invlist +\& _add_range_to_invlist +\& allocmy +\& amagic_cmp +\& amagic_cmp_desc +\& amagic_cmp_locale +\& amagic_cmp_locale_desc +\& amagic_i_ncmp +\& amagic_i_ncmp_desc +\& amagic_is_enabled +\& amagic_ncmp +\& amagic_ncmp_desc +\& any_dup +\& append_utf8_from_native_byte +\& apply +\& atfork_lock +\& atfork_unlock +\& av_arylen_p +\& av_extend_guts +\& av_iter_p +\& av_nonelem +\& av_reify +\& bind_match +\& block_gimme +\& boot_core_builtin +\& boot_core_mro +\& boot_core_PerlIO +\& boot_core_UNIVERSAL +\& build_infix_plugin +\& _byte_dump_string +\& call_list +\& cando +\& capture_clear +\& cast_iv +\& cast_i32 +\& cast_ulong +\& cast_uv +\& check_hash_fields_and_hekify +\& check_regnode_after +\& check_utf8_print +\& ck_anoncode +\& ck_backtick +\& ck_bitop +\& ck_cmp +\& ck_concat +\& ck_defined +\& ck_delete +\& ck_each +\& ck_entersub_args_core +\& ck_eof +\& ck_eval +\& ck_exec +\& ck_exists +\& ck_ftst +\& ck_fun +\& ck_glob +\& ck_grep +\& ck_helemexistsor +\& ck_index +\& ck_isa +\& ck_join +\& ck_length +\& ck_lfun +\& ck_listiob +\& ck_match +\& ck_method +\& ck_null +\& ck_open +\& ck_prototype +\& ck_readline +\& ck_refassign +\& ck_repeat +\& ck_require +\& ck_return +\& ck_rfun +\& ck_rvconst +\& ck_sassign +\& ck_select +\& ck_shift +\& ck_smartmatch +\& ck_sort +\& ck_spair +\& ck_split +\& ck_stringify +\& ck_subr +\& ck_substr +\& ck_svconst +\& ck_tell +\& ck_trunc +\& ck_trycatch +\& ckwarn +\& ckwarn_d +\& class_add_ADJUST +\& class_add_field +\& class_apply_attributes +\& class_apply_field_attributes +\& class_prepare_initfield_parse +\& class_prepare_method_parse +\& class_seal_stash +\& class_set_field_defop +\& class_setup_stash +\& class_wrap_method_body +\& clear_defarray +\& closest_cop +\& cmpchain_extend +\& cmpchain_finish +\& cmpchain_start +\& cmp_desc +\& cmp_locale_desc +\& cntrl_to_mnemonic +\& construct_ahocorasick_from_trie +\& cop_file_avn +\& coresub_op +\& croak_caller +\& croak_kw_unless_class +\& croak_memory_wrap +\& croak_no_mem +\& croak_popstack +\& csighandler +\& csighandler1 +\& csighandler3 +\& current_re_engine +\& custom_op_get_field +\& cv_clone_into +\& cv_const_sv_or_av +\& cvgv_from_hek +\& cvgv_set +\& cvstash_set +\& cv_undef_flags +\& cx_dump +\& cx_dup +\& cxinc +\& deb_stack_all +\& debstackptrs +\& debug_hash_seed +\& debug_peep +\& debug_show_study_flags +\& debug_studydata +\& defelem_target +\& despatch_signals +\& die_unwind +\& do_aexec +\& do_aexec5 +\& do_aspawn +\& do_eof +\& does_utf8_overflow +\& do_exec +\& do_exec3 +\& dofile +\& do_gv_dump +\& do_gvgv_dump +\& do_hv_dump +\& doing_taint +\& do_ipcctl +\& do_ipcget +\& do_magic_dump +\& do_msgrcv +\& do_msgsnd +\& do_ncmp +\& do_op_dump +\& do_pmop_dump +\& do_print +\& do_readline +\& doref +\& do_seek +\& do_semop +\& do_shmio +\& do_spawn +\& do_spawn_nowait +\& do_sv_dump +\& do_sysseek +\& do_tell +\& do_trans +\& do_uniprop_match +\& do_vecget +\& do_vecset +\& do_vop +\& drand48_init_r +\& drand48_r +\& dtrace_probe_call +\& dtrace_probe_load +\& dtrace_probe_op +\& dtrace_probe_phase +\& dump_all_perl +\& dump_indent +\& dump_packsubs_perl +\& dump_sub_perl +\& dump_sv_child +\& dumpuntil +\& dump_vindent +\& dup_warnings +\& find_first_differing_byte_pos +\& find_lexical_cv +\& find_runcv_where +\& find_script +\& foldEQ_latin1_s2_folded +\& foldEQ_latin1 +\& foldEQ_utf8_flags +\& force_locale_unlock +\& _force_out_malformed_utf8_message +\& form_alien_digit_msg +\& form_cp_too_large_msg +\& free_tied_hv_pool +\& free_tmps +\& get_and_check_backslash_N_name +\& get_ANYOFHbbm_contents +\& get_ANYOFM_contents +\& get_db_sub +\& get_debug_opts +\& get_deprecated_property_msg +\& getenv_len +\& get_extended_os_errno +\& get_hash_seed +\& get_invlist_iter_addr +\& get_invlist_offset_addr +\& get_invlist_previous_index_addr +\& get_mstats +\& get_prop_definition +\& get_prop_values +\& get_regclass_aux_data +\& get_re_gclass_aux_data +\& get_regex_charset_name +\& get_win32_message_utf8ness +\& gp_free +\& gp_ref +\& grok_bin_oct_hex +\& grok_bslash_c +\& grok_bslash_o +\& grok_bslash_x +\& gv_check +\& gv_fetchmeth_internal +\& gv_override +\& gv_setref +\& gv_stashpvn_internal +\& he_dup +\& hek_dup +\& hfree_next_entry +\& hv_auxalloc +\& hv_common +\& hv_common_key_len +\& hv_delayfree_ent +\& hv_free_ent +\& hv_placeholders_p +\& hv_pushkv +\& hv_rand_set +\& hv_undef_flags +\& infix_plugin_standard +\& init_argv_symbols +\& init_constants +\& init_dbargs +\& init_debugger +\& init_i18nl10n +\& init_named_cv +\& init_stacks +\& init_tm +\& init_uniprops +\& _inverse_folds +\& invert +\& invlist_array +\& _invlist_array_init +\& invlist_clear +\& invlist_clone +\& _invlist_contains_cp +\& invlist_contents +\& _invlist_dump +\& _invlistEQ +\& invlist_extend +\& invlist_highest +\& _invlist_intersection +\& _invlist_intersection_maybe_complement_2nd +\& _invlist_invert +\& invlist_is_iterating +\& invlist_iterfinish +\& invlist_iterinit +\& invlist_iternext +\& _invlist_len +\& invlist_max +\& invlist_previous_index +\& _invlist_search +\& invlist_set_len +\& invlist_set_previous_index +\& _invlist_subtract +\& invlist_trim +\& _invlist_union +\& _invlist_union_maybe_complement_2nd +\& invmap_dump +\& invoke_exception_hook +\& io_close +\& isFF_overlong +\& is_grapheme +\& _is_in_locale_category +\& is_invlist +\& is_ssc_worth_it +\& _is_uni_FOO +\& _is_uni_perl_idcont +\& _is_uni_perl_idstart +\& is_utf8_char_helper_ +\& is_utf8_common +\& is_utf8_FF_helper_ +\& _is_utf8_FOO +\& is_utf8_overlong +\& _is_utf8_perl_idcont +\& _is_utf8_perl_idstart +\& jmaybe +\& join_exact +\& keyword +\& keyword_plugin_standard +\& list +\& load_charnames +\& locale_panic +\& localize +\& lossless_NV_to_IV +\& lsbit_pos32 +\& lsbit_pos64 +\& magic_clear_all_env +\& magic_cleararylen_p +\& magic_clearenv +\& magic_clearhook +\& magic_clearhookall +\& magic_clearisa +\& magic_clearpack +\& magic_clearsig +\& magic_copycallchecker +\& magic_existspack +\& magic_freearylen_p +\& magic_freecollxfrm +\& magic_freemglob +\& magic_freeovrld +\& magic_freeutf8 +\& magic_get +\& magic_getarylen +\& magic_getdebugvar +\& magic_getdefelem +\& magic_getnkeys +\& magic_getpack +\& magic_getpos +\& magic_getsig +\& magic_getsubstr +\& magic_gettaint +\& magic_getuvar +\& magic_getvec +\& magic_killbackrefs +\& magic_nextpack +\& magic_regdata_cnt +\& magic_regdatum_get +\& magic_regdatum_set +\& magic_scalarpack +\& magic_set +\& magic_set_all_env +\& magic_setarylen +\& magic_setcollxfrm +\& magic_setdbline +\& magic_setdebugvar +\& magic_setdefelem +\& magic_setenv +\& magic_sethook +\& magic_sethookall +\& magic_setisa +\& magic_setlvref +\& magic_setmglob +\& magic_setnkeys +\& magic_setnonelem +\& magic_setpack +\& magic_setpos +\& magic_setregexp +\& magic_setsig +\& magic_setsigall +\& magic_setsubstr +\& magic_settaint +\& magic_setutf8 +\& magic_setuvar +\& magic_setvec +\& magic_sizepack +\& magic_wipepack +\& make_trie +\& malloced_size +\& malloc_good_size +\& markstack_grow +\& mbtowc_ +\& mem_collxfrm_ +\& mem_log_alloc +\& mem_log_del_sv +\& mem_log_free +\& mem_log_new_sv +\& mem_log_realloc +\& mg_find_mglob +\& mg_size +\& mode_from_discipline +\& more_bodies +\& more_sv +\& moreswitches +\& mortal_getenv +\& mortalized_pv_copy +\& mro_get_private_data +\& mro_meta_dup +\& mro_meta_init +\& msbit_pos32 +\& msbit_pos64 +\& multiconcat_stringify +\& multideref_stringify +\& my_atof2 +\& my_atof3 +\& my_attrs +\& my_clearenv +\& my_lstat +\& my_lstat_flags +\& my_memrchr +\& my_mkostemp_cloexec +\& my_mkstemp_cloexec +\& my_stat +\& my_stat_flags +\& my_strerror +\& my_strftime8_temp +\& my_unexec +\& newFORM +\& _new_invlist +\& _new_invlist_C_array +\& newMETHOP_internal +\& newMYSUB +\& newPROG +\& new_stackinfo +\& newSTUB +\& newSVavdefelem +\& newXS_deffile +\& nextargv +\& no_bareword_allowed +\& no_bareword_filehandle +\& noperl_die +\& notify_parser_that_changed_to_utf8 +\& oopsAV +\& oopsHV +\& op_clear +\& op_integerize +\& op_lvalue_flags +\& opmethod_stash +\& op_prune_chain_head +\& op_relocate_sv +\& opslab_force_free +\& opslab_free +\& opslab_free_nopad +\& op_std_init +\& op_varname +\& package +\& package_version +\& pad_add_weakref +\& padlist_store +\& padname_free +\& PadnameIN_SCOPE +\& padnamelist_free +\& parser_dup +\& parser_free +\& parser_free_nexttoke_ops +\& parse_unicode_opts +\& path_is_searchable +\& peep +\& perl_alloc_using +\& perl_clone_using +\& PerlEnv_putenv +\& PerlIO_context_layers +\& PerlIO_restore_errno +\& PerlIO_save_errno +\& PerlLIO_dup_cloexec +\& PerlLIO_dup2_cloexec +\& PerlLIO_open_cloexec +\& PerlLIO_open3_cloexec +\& PerlProc_pipe_cloexec +\& PerlSock_accept_cloexec +\& PerlSock_socket_cloexec +\& PerlSock_socketpair_cloexec +\& perly_sighandler +\& pmruntime +\& POPMARK +\& populate_anyof_bitmap_from_invlist +\& populate_bitmap_from_invlist +\& populate_invlist_from_bitmap +\& populate_isa +\& pregfree +\& pregfree2 +\& ptr_hash +\& qerror +\& ReANY +\& reentrant_free +\& reentrant_init +\& reentrant_retry +\& reentrant_size +\& re_exec_indentf +\& ref +\& reg_add_data +\& regcurly +\& regdump +\& regdupe_internal +\& regexec_flags +\& regfree_internal +\& reginitcolors +\& reg_named_buff +\& reg_named_buff_all +\& reg_named_buff_exists +\& reg_named_buff_fetch +\& reg_named_buff_firstkey +\& reg_named_buff_iter +\& reg_named_buff_nextkey +\& reg_named_buff_scalar +\& regnext +\& regnode_after +\& reg_numbered_buff_fetch +\& reg_numbered_buff_fetch_flags +\& reg_numbered_buff_length +\& reg_numbered_buff_store +\& regprop +\& reg_qr_package +\& reg_skipcomment +\& reg_temp_copy +\& re_indentf +\& re_intuit_start +\& re_intuit_string +\& re_op_compile +\& report_evil_fh +\& report_redefined_cv +\& report_wrongway_fh +\& re_printf +\& rpeep +\& rsignal_restore +\& rsignal_save +\& rvpv_dup +\& rxres_save +\& same_dirent +\& save_bool +\& save_clearsv +\& save_delete +\& save_destructor +\& save_destructor_x +\& save_freeop +\& save_freepv +\& save_freesv +\& save_int +\& save_iv +\& save_I8 +\& save_I16 +\& save_I32 +\& save_mortalizesv +\& save_pptr +\& save_pushi32ptr +\& save_pushptrptr +\& save_re_context +\& save_sptr +\& savestack_grow +\& savestack_grow_cnt +\& save_strlen +\& sawparens +\& scalar +\& scalarvoid +\& scan_commit +\& scan_num +\& seed +\& set_ANYOF_arg +\& set_caret_X +\& setfd_cloexec +\& setfd_cloexec_for_nonsysfd +\& setfd_cloexec_or_inhexec_by_sysfdness +\& setfd_inhexec +\& setfd_inhexec_for_sysfd +\& set_numeric_standard +\& set_numeric_underlying +\& set_padlist +\& _setup_canned_invlist +\& share_hek +\& should_warn_nl +\& should_we_output_Debug_r +\& sighandler +\& sighandler1 +\& sighandler3 +\& single_1bit_pos32 +\& single_1bit_pos64 +\& Slab_Alloc +\& Slab_Free +\& Slab_to_ro +\& Slab_to_rw +\& softref2xv +\& sortsv_flags_impl +\& ssc_finalize +\& ssc_init +\& stack_grow +\& str_to_version +\& strxfrm +\& study_chunk +\& sub_crush_depth +\& sv_add_backref +\& sv_buf_to_ro +\& sv_del_backref +\& sv_i_ncmp +\& sv_i_ncmp_desc +\& sv_2iv +\& sv_magicext_mglob +\& sv_ncmp +\& sv_ncmp_desc +\& sv_only_taint_gmagic +\& sv_or_pv_pos_u2b +\& sv_pvbyten_force_wrapper +\& sv_pvutf8n_force_wrapper +\& sv_resetpvn +\& sv_sethek +\& SvTRUE_common +\& sv_unglob +\& sv_2uv +\& switch_locale_context +\& sys_init +\& sys_init3 +\& sys_intern_clear +\& sys_intern_dup +\& sys_intern_init +\& sys_term +\& tied_method +\& tmps_grow_p +\& _to_fold_latin1 +\& TOPMARK +\& to_uni_fold +\& _to_uni_fold_flags +\& to_uni_lower +\& to_uni_title +\& to_uni_upper +\& _to_upper_title_latin1 +\& _to_utf8_fold_flags +\& _to_utf8_lower_flags +\& _to_utf8_title_flags +\& _to_utf8_upper_flags +\& translate_substr_offsets +\& try_amagic_bin +\& try_amagic_un +\& uiv_2buf +\& unlnk +\& unshare_hek +\& unwind_paren +\& _utf8n_to_uvchr_msgs_helper +\& utf16_to_utf8_base +\& utf16_to_utf8_reversed +\& utf16_to_utf8 +\& utf8_to_uvchr_buf_helper +\& utilize +\& uvoffuni_to_utf8_flags_msgs +\& uvuni_to_utf8 +\& variant_byte_number +\& varname +\& vivify_defelem +\& vivify_ref +\& wait4pid +\& warn_elem_scalar_context +\& _warn_problematic_locale +\& was_lvalue_sub +\& watch +\& win32_croak_not_implemented +\& write_to_stderr +\& xs_boot_epilog +\& xs_handshake +\& yyerror +\& yyerror_pv +\& yyerror_pvn +\& yylex +\& yyparse +\& yyquit +\& yyunlex +.Ve +.PP +Next are the experimental undocumented elements +.PP + +.IX Xref "alloc_LOGOP create_eval_scope cv_ckproto_len_flags cx_popblock cx_popeval cx_popformat cx_popgiven cx_poploop cx_popsub cx_popsub_args cx_popsub_common cx_popwhen cx_pushblock cx_pusheval cx_pushformat cx_pushgiven cx_pushloop_for cx_pushloop_plain cx_pushsub cx_pushtry cx_pushwhen cx_topblock delete_eval_scope do_open_raw do_open6 emulate_cop_io get_re_arg get_vtbl gimme_V hv_backreferences_p hv_kill_backrefs invlist_highest_range_start invlist_lowest newGP new_warnings_bitfield op_refcnt_dec op_refcnt_inc op_unscope scan_str scan_word scan_word6 skipspace_flags sv_free2 sv_kill_backrefs sv_setpv_freshbuf sv_setsv_cow utf8_to_utf16_base" +.PP +.Vb 10 +\& alloc_LOGOP cx_pushloop_for invlist_lowest +\& create_eval_scope cx_pushloop_plain newGP +\& cv_ckproto_len_flags cx_pushsub new_warnings_bitfield +\& cx_popblock cx_pushtry op_refcnt_dec +\& cx_popeval cx_pushwhen op_refcnt_inc +\& cx_popformat cx_topblock op_unscope +\& cx_popgiven delete_eval_scope scan_str +\& cx_poploop do_open_raw scan_word +\& cx_popsub do_open6 scan_word6 +\& cx_popsub_args emulate_cop_io skipspace_flags +\& cx_popsub_common get_re_arg sv_free2 +\& cx_popwhen get_vtbl sv_kill_backrefs +\& cx_pushblock gimme_V sv_setpv_freshbuf +\& cx_pusheval hv_backreferences_p sv_setsv_cow +\& cx_pushformat hv_kill_backrefs utf8_to_utf16_base +\& cx_pushgiven invlist_highest_range_start +.Ve +.PP +Finally are the deprecated undocumented elements. +Do not use any for new code; remove all occurrences of all of these from +existing code. +.PP + +.IX Xref "get_no_modify get_opargs get_ppaddr" +.PP +.Vb 1 +\& get_no_modify get_opargs get_ppaddr +.Ve +.SH AUTHORS +.IX Header "AUTHORS" +The autodocumentation system was originally added to the Perl core by +Benjamin Stuhl. Documentation is by whoever was kind enough to +document their functions. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +\&\fIconfig.h\fR, perlapi, perlapio, perlcall, perlclib, perlembed, perlfilter, perlguts, perlhacktips, perlinterp, perliol, perlmroapi, perlreapi, perlreguts, perlxs |