This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Synchronise bignum with CPAN
[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 /* ------------------------------- 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 (sv)
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 (sv)
63         SvREFCNT(sv)++;
64 }
65 PERL_STATIC_INLINE void
66 S_SvREFCNT_dec(pTHX_ SV *sv)
67 {
68     if (sv) {
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 /* ------------------------------- handy.h ------------------------------- */
138
139 /* saves machine code for a common noreturn idiom typically used in Newx*() */
140 #ifdef __clang__
141 #pragma clang diagnostic push
142 #pragma clang diagnostic ignored "-Wunused-function"
143 #endif
144 static void
145 S_croak_memory_wrap(void)
146 {
147     Perl_croak_nocontext("%s",PL_memory_wrap);
148 }
149 #ifdef __clang__
150 #pragma clang diagnostic pop
151 #endif
152
153 /* ------------------------------- utf8.h ------------------------------- */
154
155 /* These exist only to replace the macros they formerly were so that their use
156  * can be deprecated */
157
158 PERL_STATIC_INLINE bool
159 S_isIDFIRST_lazy(pTHX_ const char* p)
160 {
161     PERL_ARGS_ASSERT_ISIDFIRST_LAZY;
162
163     return isIDFIRST_lazy_if(p,1);
164 }
165
166 PERL_STATIC_INLINE bool
167 S_isALNUM_lazy(pTHX_ const char* p)
168 {
169     PERL_ARGS_ASSERT_ISALNUM_LAZY;
170
171     return isALNUM_lazy_if(p,1);
172 }