X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/27669aa412f62d9967b069ba672cd20239c354c1..4a9a56a75c57646b348598f90875415e994d2f65:/inline.h diff --git a/inline.h b/inline.h index cdcaf04..776a304 100644 --- a/inline.h +++ b/inline.h @@ -12,6 +12,24 @@ * Each section names the header file that the functions "belong" to. */ +/* ------------------------------- cv.h ------------------------------- */ + +PERL_STATIC_INLINE I32 * +S_CvDEPTHp(const CV * const sv) +{ + assert(SvTYPE(sv) == SVt_PVCV || SvTYPE(sv) == SVt_PVFM); + return &((XPVCV*)SvANY(sv))->xcv_depth; +} + +/* ----------------------------- regexp.h ----------------------------- */ + +PERL_STATIC_INLINE struct regexp * +S_ReANY(const REGEXP * const re) +{ + assert(isREGEXP(re)); + return re->sv_u.svu_rx; +} + /* ------------------------------- sv.h ------------------------------- */ PERL_STATIC_INLINE SV * @@ -33,3 +51,83 @@ S_SvREFCNT_inc_void(SV *sv) if (sv) SvREFCNT(sv)++; } +PERL_STATIC_INLINE void +S_SvREFCNT_dec(pTHX_ SV *sv) +{ + if (sv) { + U32 rc = SvREFCNT(sv); + if (rc > 1) + SvREFCNT(sv) = rc - 1; + else + Perl_sv_free2(aTHX_ sv, rc); + } +} + +PERL_STATIC_INLINE void +S_SvREFCNT_dec_NN(pTHX_ SV *sv) +{ + U32 rc = SvREFCNT(sv); + if (rc > 1) + SvREFCNT(sv) = rc - 1; + else + Perl_sv_free2(aTHX_ sv, rc); +} + +PERL_STATIC_INLINE void +SvAMAGIC_on(SV *sv) +{ + assert(SvROK(sv)); + if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv))); +} +PERL_STATIC_INLINE void +SvAMAGIC_off(SV *sv) +{ + if (SvROK(sv) && SvOBJECT(SvRV(sv))) + HvAMAGIC_off(SvSTASH(SvRV(sv))); +} + +PERL_STATIC_INLINE U32 +S_SvPADTMP_on(SV *sv) +{ + assert(!(SvFLAGS(sv) & SVs_PADMY)); + return SvFLAGS(sv) |= SVs_PADTMP; +} +PERL_STATIC_INLINE U32 +S_SvPADTMP_off(SV *sv) +{ + assert(!(SvFLAGS(sv) & SVs_PADMY)); + return SvFLAGS(sv) &= ~SVs_PADTMP; +} +PERL_STATIC_INLINE U32 +S_SvPADSTALE_on(SV *sv) +{ + assert(SvFLAGS(sv) & SVs_PADMY); + return SvFLAGS(sv) |= SVs_PADSTALE; +} +PERL_STATIC_INLINE U32 +S_SvPADSTALE_off(SV *sv) +{ + assert(SvFLAGS(sv) & SVs_PADMY); + return SvFLAGS(sv) &= ~SVs_PADSTALE; +} +#ifdef PERL_CORE +PERL_STATIC_INLINE STRLEN +S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp) +{ + if (SvGAMAGIC(sv)) { + U8 *hopped = utf8_hop((U8 *)pv, pos); + if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped); + return (STRLEN)(hopped - (U8 *)pv); + } + return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN); +} +#endif + +/* ------------------------------- handy.h ------------------------------- */ + +/* saves machine code for a common noreturn idiom typically used in Newx*() */ +static void +S_croak_memory_wrap(void) +{ + Perl_croak_nocontext("%s",PL_memory_wrap); +}