Avoid wraparound when casting unsigned size_t to signed ssize_t.
[perl.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 /* ----------------------------- regexp.h ----------------------------- */
25
26 PERL_STATIC_INLINE struct regexp *
27 S_ReANY(const REGEXP * const re)
28 {
29     assert(isREGEXP(re));
30     return re->sv_u.svu_rx;
31 }
32
33 /* ------------------------------- sv.h ------------------------------- */
34
35 PERL_STATIC_INLINE SV *
36 S_SvREFCNT_inc(SV *sv)
37 {
38     if (sv)
39         SvREFCNT(sv)++;
40     return sv;
41 }
42 PERL_STATIC_INLINE SV *
43 S_SvREFCNT_inc_NN(SV *sv)
44 {
45     SvREFCNT(sv)++;
46     return sv;
47 }
48 PERL_STATIC_INLINE void
49 S_SvREFCNT_inc_void(SV *sv)
50 {
51     if (sv)
52         SvREFCNT(sv)++;
53 }
54 PERL_STATIC_INLINE void
55 S_SvREFCNT_dec(pTHX_ SV *sv)
56 {
57     if (sv) {
58         U32 rc = SvREFCNT(sv);
59         if (rc > 1)
60             SvREFCNT(sv) = rc - 1;
61         else
62             Perl_sv_free2(aTHX_ sv, rc);
63     }
64 }
65
66 PERL_STATIC_INLINE void
67 S_SvREFCNT_dec_NN(pTHX_ SV *sv)
68 {
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 PERL_STATIC_INLINE void
77 SvAMAGIC_on(SV *sv)
78 {
79     assert(SvROK(sv));
80     if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
81 }
82 PERL_STATIC_INLINE void
83 SvAMAGIC_off(SV *sv)
84 {
85     if (SvROK(sv) && SvOBJECT(SvRV(sv)))
86         HvAMAGIC_off(SvSTASH(SvRV(sv)));
87 }
88
89 PERL_STATIC_INLINE U32
90 S_SvPADTMP_on(SV *sv)
91 {
92     assert(!(SvFLAGS(sv) & SVs_PADMY));
93     return SvFLAGS(sv) |= SVs_PADTMP;
94 }
95 PERL_STATIC_INLINE U32
96 S_SvPADTMP_off(SV *sv)
97 {
98     assert(!(SvFLAGS(sv) & SVs_PADMY));
99     return SvFLAGS(sv) &= ~SVs_PADTMP;
100 }
101 PERL_STATIC_INLINE U32
102 S_SvPADSTALE_on(SV *sv)
103 {
104     assert(SvFLAGS(sv) & SVs_PADMY);
105     return SvFLAGS(sv) |= SVs_PADSTALE;
106 }
107 PERL_STATIC_INLINE U32
108 S_SvPADSTALE_off(SV *sv)
109 {
110     assert(SvFLAGS(sv) & SVs_PADMY);
111     return SvFLAGS(sv) &= ~SVs_PADSTALE;
112 }
113 #ifdef PERL_CORE
114 PERL_STATIC_INLINE STRLEN
115 S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
116 {
117     if (SvGAMAGIC(sv)) {
118         U8 *hopped = utf8_hop((U8 *)pv, pos);
119         if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
120         return (STRLEN)(hopped - (U8 *)pv);
121     }
122     return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
123 }
124 #endif
125
126 /* ------------------------------- handy.h ------------------------------- */
127
128 /* saves machine code for a common noreturn idiom typically used in Newx*() */
129 #ifdef __clang__
130 #pragma clang diagnostic push
131 #pragma clang diagnostic ignored "-Wunused-function"
132 #endif
133 static void
134 S_croak_memory_wrap(void)
135 {
136     Perl_croak_nocontext("%s",PL_memory_wrap);
137 }
138 #ifdef __clang__
139 #pragma clang diagnostic pop
140 #endif
141
142 /* ------------------------------- utf8.h ------------------------------- */
143
144 /* These exist only to replace the macros they formerly were so that their use
145  * can be deprecated */
146
147 PERL_STATIC_INLINE bool
148 S_isIDFIRST_lazy(pTHX_ const char* p)
149 {
150     PERL_ARGS_ASSERT_ISIDFIRST_LAZY;
151
152     return isIDFIRST_lazy_if(p,1);
153 }
154
155 PERL_STATIC_INLINE bool
156 S_isALNUM_lazy(pTHX_ const char* p)
157 {
158     PERL_ARGS_ASSERT_ISALNUM_LAZY;
159
160     return isALNUM_lazy_if(p,1);
161 }