3 * Copyright (C) 2012 by Larry Wall and others
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
8 * This file is a home for static inline functions that cannot go in other
9 * headers files, because they depend on proto.h (included after most other
10 * headers) or struct definitions.
12 * Each section names the header file that the functions "belong" to.
15 /* ------------------------------- av.h ------------------------------- */
17 PERL_STATIC_INLINE I32
18 S_av_top_index(pTHX_ AV *av)
20 PERL_ARGS_ASSERT_AV_TOP_INDEX;
21 assert(SvTYPE(av) == SVt_PVAV);
26 /* ------------------------------- cv.h ------------------------------- */
28 PERL_STATIC_INLINE I32 *
29 S_CvDEPTHp(const CV * const sv)
31 assert(SvTYPE(sv) == SVt_PVCV || SvTYPE(sv) == SVt_PVFM);
32 return &((XPVCV*)SvANY(sv))->xcv_depth;
35 /* ----------------------------- regexp.h ----------------------------- */
37 PERL_STATIC_INLINE struct regexp *
38 S_ReANY(const REGEXP * const re)
41 return re->sv_u.svu_rx;
44 /* ------------------------------- sv.h ------------------------------- */
46 PERL_STATIC_INLINE SV *
47 S_SvREFCNT_inc(SV *sv)
49 if (LIKELY(sv != NULL))
53 PERL_STATIC_INLINE SV *
54 S_SvREFCNT_inc_NN(SV *sv)
59 PERL_STATIC_INLINE void
60 S_SvREFCNT_inc_void(SV *sv)
62 if (LIKELY(sv != NULL))
65 PERL_STATIC_INLINE void
66 S_SvREFCNT_dec(pTHX_ SV *sv)
68 if (LIKELY(sv != NULL)) {
69 U32 rc = SvREFCNT(sv);
71 SvREFCNT(sv) = rc - 1;
73 Perl_sv_free2(aTHX_ sv, rc);
77 PERL_STATIC_INLINE void
78 S_SvREFCNT_dec_NN(pTHX_ SV *sv)
80 U32 rc = SvREFCNT(sv);
82 SvREFCNT(sv) = rc - 1;
84 Perl_sv_free2(aTHX_ sv, rc);
87 PERL_STATIC_INLINE void
91 if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
93 PERL_STATIC_INLINE void
96 if (SvROK(sv) && SvOBJECT(SvRV(sv)))
97 HvAMAGIC_off(SvSTASH(SvRV(sv)));
100 PERL_STATIC_INLINE U32
101 S_SvPADTMP_on(SV *sv)
103 assert(!(SvFLAGS(sv) & SVs_PADMY));
104 return SvFLAGS(sv) |= SVs_PADTMP;
106 PERL_STATIC_INLINE U32
107 S_SvPADTMP_off(SV *sv)
109 assert(!(SvFLAGS(sv) & SVs_PADMY));
110 return SvFLAGS(sv) &= ~SVs_PADTMP;
112 PERL_STATIC_INLINE U32
113 S_SvPADSTALE_on(SV *sv)
115 assert(SvFLAGS(sv) & SVs_PADMY);
116 return SvFLAGS(sv) |= SVs_PADSTALE;
118 PERL_STATIC_INLINE U32
119 S_SvPADSTALE_off(SV *sv)
121 assert(SvFLAGS(sv) & SVs_PADMY);
122 return SvFLAGS(sv) &= ~SVs_PADSTALE;
125 PERL_STATIC_INLINE STRLEN
126 S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
129 U8 *hopped = utf8_hop((U8 *)pv, pos);
130 if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
131 return (STRLEN)(hopped - (U8 *)pv);
133 return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
137 /* ------------------------------- utf8.h ------------------------------- */
139 /* These exist only to replace the macros they formerly were so that their use
140 * can be deprecated */
142 PERL_STATIC_INLINE bool
143 S_isIDFIRST_lazy(pTHX_ const char* p)
145 PERL_ARGS_ASSERT_ISIDFIRST_LAZY;
147 return isIDFIRST_lazy_if(p,1);
150 PERL_STATIC_INLINE bool
151 S_isALNUM_lazy(pTHX_ const char* p)
153 PERL_ARGS_ASSERT_ISALNUM_LAZY;
155 return isALNUM_lazy_if(p,1);