This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
toke.c: Merge KEY_tr and KEY_y
[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 SvTYPE(sv) == SVt_PVCV
22         ? &((XPVCV*)SvANY(sv))->xcv_depth
23         : &((XPVCV*)SvANY(sv))->xpv_fmdepth;
24 }
25
26 /* ------------------------------- sv.h ------------------------------- */
27
28 PERL_STATIC_INLINE SV *
29 S_SvREFCNT_inc(SV *sv)
30 {
31     if (sv)
32         SvREFCNT(sv)++;
33     return sv;
34 }
35 PERL_STATIC_INLINE SV *
36 S_SvREFCNT_inc_NN(SV *sv)
37 {
38     SvREFCNT(sv)++;
39     return sv;
40 }
41 PERL_STATIC_INLINE void
42 S_SvREFCNT_inc_void(SV *sv)
43 {
44     if (sv)
45         SvREFCNT(sv)++;
46 }
47 PERL_STATIC_INLINE void
48 S_SvREFCNT_dec(pTHX_ SV *sv)
49 {
50     if (sv) {
51         if (SvREFCNT(sv)) {
52             if (--(SvREFCNT(sv)) == 0)
53                 Perl_sv_free2(aTHX_ sv);
54         } else {
55             sv_free(sv);
56         }
57     }
58 }
59
60 PERL_STATIC_INLINE void
61 SvAMAGIC_on(SV *sv)
62 {
63     assert(SvROK(sv));
64     if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
65 }
66 PERL_STATIC_INLINE void
67 SvAMAGIC_off(SV *sv)
68 {
69     if (SvROK(sv) && SvOBJECT(SvRV(sv)))
70         HvAMAGIC_off(SvSTASH(SvRV(sv)));
71 }
72
73 PERL_STATIC_INLINE U32
74 S_SvPADTMP_on(SV *sv)
75 {
76     assert(!(SvFLAGS(sv) & SVs_PADMY));
77     return SvFLAGS(sv) |= SVs_PADTMP;
78 }
79 PERL_STATIC_INLINE U32
80 S_SvPADTMP_off(SV *sv)
81 {
82     assert(!(SvFLAGS(sv) & SVs_PADMY));
83     return SvFLAGS(sv) &= ~SVs_PADTMP;
84 }
85 PERL_STATIC_INLINE U32
86 S_SvPADSTALE_on(SV *sv)
87 {
88     assert(SvFLAGS(sv) & SVs_PADMY);
89     return SvFLAGS(sv) |= SVs_PADSTALE;
90 }
91 PERL_STATIC_INLINE U32
92 S_SvPADSTALE_off(SV *sv)
93 {
94     assert(SvFLAGS(sv) & SVs_PADMY);
95     return SvFLAGS(sv) &= ~SVs_PADSTALE;
96 }