1 /* inline.h 2 * 3 * Copyright (C) 2012 by Larry Wall and others 4 * 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. 7 * 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. 11 * 12 * Each section names the header file that the functions "belong" to. 13 */ 14 15 /* ------------------------------- av.h ------------------------------- */ 16 17 PERL_STATIC_INLINE I32 18 S_av_top_index(pTHX_ AV *av) 19 { 20 PERL_ARGS_ASSERT_AV_TOP_INDEX; 21 assert(SvTYPE(av) == SVt_PVAV); 22 23 return AvFILL(av); 24 } 25 26 /* ------------------------------- cv.h ------------------------------- */ 27 28 PERL_STATIC_INLINE I32 * 29 S_CvDEPTHp(const CV * const sv) 30 { 31 assert(SvTYPE(sv) == SVt_PVCV || SvTYPE(sv) == SVt_PVFM); 32 return &((XPVCV*)SvANY(sv))->xcv_depth; 33 } 34 35 /* ----------------------------- regexp.h ----------------------------- */ 36 37 PERL_STATIC_INLINE struct regexp * 38 S_ReANY(const REGEXP * const re) 39 { 40 assert(isREGEXP(re)); 41 return re->sv_u.svu_rx; 42 } 43 44 /* ------------------------------- sv.h ------------------------------- */ 45 46 PERL_STATIC_INLINE SV * 47 S_SvREFCNT_inc(SV *sv) 48 { 49 if (LIKELY(sv != NULL)) 50 SvREFCNT(sv)++; 51 return sv; 52 } 53 PERL_STATIC_INLINE SV * 54 S_SvREFCNT_inc_NN(SV *sv) 55 { 56 SvREFCNT(sv)++; 57 return sv; 58 } 59 PERL_STATIC_INLINE void 60 S_SvREFCNT_inc_void(SV *sv) 61 { 62 if (LIKELY(sv != NULL)) 63 SvREFCNT(sv)++; 64 } 65 PERL_STATIC_INLINE void 66 S_SvREFCNT_dec(pTHX_ SV *sv) 67 { 68 if (LIKELY(sv != NULL)) { 69 U32 rc = SvREFCNT(sv); 70 if (rc > 1) 71 SvREFCNT(sv) = rc - 1; 72 else 73 Perl_sv_free2(aTHX_ sv, rc); 74 } 75 } 76 77 PERL_STATIC_INLINE void 78 S_SvREFCNT_dec_NN(pTHX_ SV *sv) 79 { 80 U32 rc = SvREFCNT(sv); 81 if (rc > 1) 82 SvREFCNT(sv) = rc - 1; 83 else 84 Perl_sv_free2(aTHX_ sv, rc); 85 } 86 87 PERL_STATIC_INLINE void 88 SvAMAGIC_on(SV *sv) 89 { 90 assert(SvROK(sv)); 91 if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv))); 92 } 93 PERL_STATIC_INLINE void 94 SvAMAGIC_off(SV *sv) 95 { 96 if (SvROK(sv) && SvOBJECT(SvRV(sv))) 97 HvAMAGIC_off(SvSTASH(SvRV(sv))); 98 } 99 100 PERL_STATIC_INLINE U32 101 S_SvPADTMP_on(SV *sv) 102 { 103 assert(!(SvFLAGS(sv) & SVs_PADMY)); 104 return SvFLAGS(sv) |= SVs_PADTMP; 105 } 106 PERL_STATIC_INLINE U32 107 S_SvPADTMP_off(SV *sv) 108 { 109 assert(!(SvFLAGS(sv) & SVs_PADMY)); 110 return SvFLAGS(sv) &= ~SVs_PADTMP; 111 } 112 PERL_STATIC_INLINE U32 113 S_SvPADSTALE_on(SV *sv) 114 { 115 assert(SvFLAGS(sv) & SVs_PADMY); 116 return SvFLAGS(sv) |= SVs_PADSTALE; 117 } 118 PERL_STATIC_INLINE U32 119 S_SvPADSTALE_off(SV *sv) 120 { 121 assert(SvFLAGS(sv) & SVs_PADMY); 122 return SvFLAGS(sv) &= ~SVs_PADSTALE; 123 } 124 #ifdef PERL_CORE 125 PERL_STATIC_INLINE STRLEN 126 S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp) 127 { 128 if (SvGAMAGIC(sv)) { 129 U8 *hopped = utf8_hop((U8 *)pv, pos); 130 if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped); 131 return (STRLEN)(hopped - (U8 *)pv); 132 } 133 return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN); 134 } 135 #endif 136 137 /* ------------------------------- utf8.h ------------------------------- */ 138 139 /* These exist only to replace the macros they formerly were so that their use 140 * can be deprecated */ 141 142 PERL_STATIC_INLINE bool 143 S_isIDFIRST_lazy(pTHX_ const char* p) 144 { 145 PERL_ARGS_ASSERT_ISIDFIRST_LAZY; 146 147 return isIDFIRST_lazy_if(p,1); 148 } 149 150 PERL_STATIC_INLINE bool 151 S_isALNUM_lazy(pTHX_ const char* p) 152 { 153 PERL_ARGS_ASSERT_ISALNUM_LAZY; 154 155 return isALNUM_lazy_if(p,1); 156 } 157