This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Clarify that in-place editing actually creates a new file.
[perl5.git] / inline.h
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 /* ------------------------------- cv.h ------------------------------- */
16
17 PERL_STATIC_INLINE I32 *
18 S_CvDEPTHp(const CV * const sv)
19 {
20     assert(SvTYPE(sv) == SVt_PVCV || SvTYPE(sv) == SVt_PVFM);
21     return &((XPVCV*)SvANY(sv))->xcv_depth;
22 }
23
24 /* ------------------------------- sv.h ------------------------------- */
25
26 PERL_STATIC_INLINE SV *
27 S_SvREFCNT_inc(SV *sv)
28 {
29     if (sv)
30         SvREFCNT(sv)++;
31     return sv;
32 }
33 PERL_STATIC_INLINE SV *
34 S_SvREFCNT_inc_NN(SV *sv)
35 {
36     SvREFCNT(sv)++;
37     return sv;
38 }
39 PERL_STATIC_INLINE void
40 S_SvREFCNT_inc_void(SV *sv)
41 {
42     if (sv)
43         SvREFCNT(sv)++;
44 }
45 PERL_STATIC_INLINE void
46 S_SvREFCNT_dec(pTHX_ SV *sv)
47 {
48     if (sv) {
49         if (SvREFCNT(sv)) {
50             if (--(SvREFCNT(sv)) == 0)
51                 Perl_sv_free2(aTHX_ sv);
52         } else {
53             sv_free(sv);
54         }
55     }
56 }
57
58 PERL_STATIC_INLINE void
59 SvAMAGIC_on(SV *sv)
60 {
61     assert(SvROK(sv));
62     if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
63 }
64 PERL_STATIC_INLINE void
65 SvAMAGIC_off(SV *sv)
66 {
67     if (SvROK(sv) && SvOBJECT(SvRV(sv)))
68         HvAMAGIC_off(SvSTASH(SvRV(sv)));
69 }
70
71 PERL_STATIC_INLINE U32
72 S_SvPADTMP_on(SV *sv)
73 {
74     assert(!(SvFLAGS(sv) & SVs_PADMY));
75     return SvFLAGS(sv) |= SVs_PADTMP;
76 }
77 PERL_STATIC_INLINE U32
78 S_SvPADTMP_off(SV *sv)
79 {
80     assert(!(SvFLAGS(sv) & SVs_PADMY));
81     return SvFLAGS(sv) &= ~SVs_PADTMP;
82 }
83 PERL_STATIC_INLINE U32
84 S_SvPADSTALE_on(SV *sv)
85 {
86     assert(SvFLAGS(sv) & SVs_PADMY);
87     return SvFLAGS(sv) |= SVs_PADSTALE;
88 }
89 PERL_STATIC_INLINE U32
90 S_SvPADSTALE_off(SV *sv)
91 {
92     assert(SvFLAGS(sv) & SVs_PADMY);
93     return SvFLAGS(sv) &= ~SVs_PADSTALE;
94 }
95 #ifdef PERL_CORE
96 PERL_STATIC_INLINE STRLEN
97 S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
98 {
99     if (SvGAMAGIC(sv)) {
100         U8 *hopped = utf8_hop((U8 *)pv, pos);
101         if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
102         return (STRLEN)(hopped - (U8 *)pv);
103     }
104     return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
105 }
106 #endif