This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #117793] remove dangerous functions and improve SvREFCNT()
[perl5.git] / inline.h
CommitLineData
25468daa
FC
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 */
27669aa4 14
be3a7a5d
KW
15/* ------------------------------- av.h ------------------------------- */
16
17PERL_STATIC_INLINE I32
18S_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
c82ecf34
FC
26/* ------------------------------- cop.h ------------------------------ */
27
28#ifdef USE_ITHREADS
29PERL_STATIC_INLINE void
30S_CopFILE_free(pTHX_ COP * const c)
31{
32 GV * const gv = CopFILEGV(c);
33 if (!gv) return;
34 if (SvREFCNT(gv) == 1) PL_filegvpad[c->cop_filegvoff] = NULL;
35 SvREFCNT_dec_NN(gv);
36 c->cop_filegvoff = 0;
37}
38#endif
39
1afe1db1
FC
40/* ------------------------------- cv.h ------------------------------- */
41
42PERL_STATIC_INLINE I32 *
43S_CvDEPTHp(const CV * const sv)
44{
45 assert(SvTYPE(sv) == SVt_PVCV || SvTYPE(sv) == SVt_PVFM);
8de47657 46 return &((XPVCV*)SvANY(sv))->xcv_depth;
1afe1db1
FC
47}
48
d16269d8
PM
49/*
50 CvPROTO returns the prototype as stored, which is not necessarily what
51 the interpreter should be using. Specifically, the interpreter assumes
52 that spaces have been stripped, which has been the case if the prototype
53 was added by toke.c, but is generally not the case if it was added elsewhere.
54 Since we can't enforce the spacelessness at assignment time, this routine
55 provides a temporary copy at parse time with spaces removed.
56 I<orig> is the start of the original buffer, I<len> is the length of the
57 prototype and will be updated when this returns.
58 */
59
5b67adb8 60#ifdef PERL_CORE
d16269d8
PM
61PERL_STATIC_INLINE char *
62S_strip_spaces(pTHX_ const char * orig, STRLEN * const len)
63{
64 SV * tmpsv;
65 char * tmps;
66 tmpsv = newSVpvn_flags(orig, *len, SVs_TEMP);
67 tmps = SvPVX(tmpsv);
68 while ((*len)--) {
69 if (!isSPACE(*orig))
70 *tmps++ = *orig;
71 orig++;
72 }
73 *tmps = '\0';
74 *len = tmps - SvPVX(tmpsv);
75 return SvPVX(tmpsv);
76}
5b67adb8 77#endif
d16269d8 78
8d919b0a
FC
79/* ----------------------------- regexp.h ----------------------------- */
80
81PERL_STATIC_INLINE struct regexp *
82S_ReANY(const REGEXP * const re)
83{
84 assert(isREGEXP(re));
85 return re->sv_u.svu_rx;
86}
87
27669aa4
FC
88/* ------------------------------- sv.h ------------------------------- */
89
90PERL_STATIC_INLINE SV *
91S_SvREFCNT_inc(SV *sv)
92{
2439e033 93 if (LIKELY(sv != NULL))
27669aa4
FC
94 SvREFCNT(sv)++;
95 return sv;
96}
97PERL_STATIC_INLINE SV *
98S_SvREFCNT_inc_NN(SV *sv)
99{
100 SvREFCNT(sv)++;
101 return sv;
102}
103PERL_STATIC_INLINE void
104S_SvREFCNT_inc_void(SV *sv)
105{
2439e033 106 if (LIKELY(sv != NULL))
27669aa4
FC
107 SvREFCNT(sv)++;
108}
75e16a44
FC
109PERL_STATIC_INLINE void
110S_SvREFCNT_dec(pTHX_ SV *sv)
111{
2439e033 112 if (LIKELY(sv != NULL)) {
75a9bf96 113 U32 rc = SvREFCNT(sv);
79e2a32a 114 if (LIKELY(rc > 1))
75a9bf96
DM
115 SvREFCNT(sv) = rc - 1;
116 else
117 Perl_sv_free2(aTHX_ sv, rc);
75e16a44
FC
118 }
119}
541377b1
FC
120
121PERL_STATIC_INLINE void
4a9a56a7
DM
122S_SvREFCNT_dec_NN(pTHX_ SV *sv)
123{
124 U32 rc = SvREFCNT(sv);
c82ecf34 125 PERL_ARGS_ASSERT_SVREFCNT_DEC_NN;
79e2a32a 126 if (LIKELY(rc > 1))
4a9a56a7
DM
127 SvREFCNT(sv) = rc - 1;
128 else
129 Perl_sv_free2(aTHX_ sv, rc);
130}
131
132PERL_STATIC_INLINE void
541377b1
FC
133SvAMAGIC_on(SV *sv)
134{
135 assert(SvROK(sv));
136 if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
137}
138PERL_STATIC_INLINE void
139SvAMAGIC_off(SV *sv)
140{
141 if (SvROK(sv) && SvOBJECT(SvRV(sv)))
142 HvAMAGIC_off(SvSTASH(SvRV(sv)));
143}
144
145PERL_STATIC_INLINE U32
146S_SvPADTMP_on(SV *sv)
147{
148 assert(!(SvFLAGS(sv) & SVs_PADMY));
149 return SvFLAGS(sv) |= SVs_PADTMP;
150}
151PERL_STATIC_INLINE U32
152S_SvPADTMP_off(SV *sv)
153{
154 assert(!(SvFLAGS(sv) & SVs_PADMY));
155 return SvFLAGS(sv) &= ~SVs_PADTMP;
156}
157PERL_STATIC_INLINE U32
158S_SvPADSTALE_on(SV *sv)
159{
160 assert(SvFLAGS(sv) & SVs_PADMY);
161 return SvFLAGS(sv) |= SVs_PADSTALE;
162}
163PERL_STATIC_INLINE U32
164S_SvPADSTALE_off(SV *sv)
165{
166 assert(SvFLAGS(sv) & SVs_PADMY);
167 return SvFLAGS(sv) &= ~SVs_PADSTALE;
168}
4ddea69a
FC
169#ifdef PERL_CORE
170PERL_STATIC_INLINE STRLEN
6964422a 171S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
4ddea69a
FC
172{
173 if (SvGAMAGIC(sv)) {
174 U8 *hopped = utf8_hop((U8 *)pv, pos);
175 if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
176 return (STRLEN)(hopped - (U8 *)pv);
177 }
178 return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
179}
180#endif
f019c49e 181
d1decf2b
TC
182/* ------------------------------- handy.h ------------------------------- */
183
184/* saves machine code for a common noreturn idiom typically used in Newx*() */
185#ifdef __clang__
186#pragma clang diagnostic push
187#pragma clang diagnostic ignored "-Wunused-function"
188#endif
189static void
190S_croak_memory_wrap(void)
191{
192 Perl_croak_nocontext("%s",PL_memory_wrap);
193}
194#ifdef __clang__
195#pragma clang diagnostic pop
196#endif
197
a8a2ceaa
KW
198/* ------------------------------- utf8.h ------------------------------- */
199
200/* These exist only to replace the macros they formerly were so that their use
201 * can be deprecated */
202
203PERL_STATIC_INLINE bool
204S_isIDFIRST_lazy(pTHX_ const char* p)
205{
206 PERL_ARGS_ASSERT_ISIDFIRST_LAZY;
207
208 return isIDFIRST_lazy_if(p,1);
209}
210
211PERL_STATIC_INLINE bool
212S_isALNUM_lazy(pTHX_ const char* p)
213{
214 PERL_ARGS_ASSERT_ISALNUM_LAZY;
215
216 return isALNUM_lazy_if(p,1);
217}