1 /* sv_inline.h
2 *
3 * Copyright (C) 2022 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 */
9
10 /* This file contains the newSV_type and newSV_type_mortal functions, as well as
11 * the various struct and macro definitions they require. In the main, these
12 * definitions were moved from sv.c, where many of them continue to also be used.
13 * (In Perl_more_bodies, Perl_sv_upgrade and Perl_sv_clear, for example.) Code
14 * comments associated with definitions and functions were also copied across
15 * verbatim.
16 *
17 * The rationale for having these as inline functions, rather than in sv.c, is
18 * that the target type is very often known at compile time, and therefore
19 * optimum code can be emitted by the compiler, rather than having all calls
20 * traverse the many branches of Perl_sv_upgrade at runtime.
21 */
22
23 /* This definition came from perl.h*/
24
25 /* The old value was hard coded at 1008. (4096-16) seems to be a bit faster,
26 at least on FreeBSD. YMMV, so experiment. */
27 #ifndef PERL_ARENA_SIZE
28 #define PERL_ARENA_SIZE 4080
29 #endif
30
31 /* All other pre-existing definitions and functions that were moved into this
32 * file originally came from sv.c. */
33
34 #ifdef PERL_POISON
35 # define SvARENA_CHAIN(sv) ((sv)->sv_u.svu_rv)
36 # define SvARENA_CHAIN_SET(sv,val) (sv)->sv_u.svu_rv = MUTABLE_SV((val))
37 /* Whilst I'd love to do this, it seems that things like to check on
38 unreferenced scalars
39 # define POISON_SV_HEAD(sv) PoisonNew(sv, 1, struct STRUCT_SV)
40 */
41 # define POISON_SV_HEAD(sv) PoisonNew(&SvANY(sv), 1, void *), \
42 PoisonNew(&SvREFCNT(sv), 1, U32)
43 #else
44 # define SvARENA_CHAIN(sv) SvANY(sv)
45 # define SvARENA_CHAIN_SET(sv,val) SvANY(sv) = (void *)(val)
46 # define POISON_SV_HEAD(sv)
47 #endif
48
49 #ifdef PERL_MEM_LOG
50 # define MEM_LOG_NEW_SV(sv, file, line, func) \
51 Perl_mem_log_new_sv(sv, file, line, func)
52 # define MEM_LOG_DEL_SV(sv, file, line, func) \
53 Perl_mem_log_del_sv(sv, file, line, func)
54 #else
55 # define MEM_LOG_NEW_SV(sv, file, line, func) NOOP
56 # define MEM_LOG_DEL_SV(sv, file, line, func) NOOP
57 #endif
58
59 #define uproot_SV(p) \
60 STMT_START { \
61 (p) = PL_sv_root; \
62 PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p)); \
63 ++PL_sv_count; \
64 } STMT_END
65
66 /* Perl_more_sv lives in sv.c, we don't want to inline it.
67 * but the function declaration seems to be needed. */
68 SV* Perl_more_sv(pTHX);
69
70 /* new_SV(): return a new, empty SV head */
71
72 #ifdef DEBUG_LEAKING_SCALARS
73 /* provide a real function for a debugger to play with */
74 STATIC SV*
S_new_SV(pTHX_ const char * file,int line,const char * func)75 S_new_SV(pTHX_ const char *file, int line, const char *func)
76 {
77 SV* sv;
78
79 if (PL_sv_root)
80 uproot_SV(sv);
81 else
82 sv = Perl_more_sv(aTHX);
83 SvANY(sv) = 0;
84 SvREFCNT(sv) = 1;
85 SvFLAGS(sv) = 0;
86 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
87 sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
88 ? PL_parser->copline
89 : PL_curcop
90 ? CopLINE(PL_curcop)
91 : 0
92 );
93 sv->sv_debug_inpad = 0;
94 sv->sv_debug_parent = NULL;
95 sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
96
97 sv->sv_debug_serial = PL_sv_serial++;
98
99 MEM_LOG_NEW_SV(sv, file, line, func);
100 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) new_SV (from %s:%d [%s])\n",
101 PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
102
103 return sv;
104 }
105 # define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
106
107 #else
108 # define new_SV(p) \
109 STMT_START { \
110 if (PL_sv_root) \
111 uproot_SV(p); \
112 else \
113 (p) = Perl_more_sv(aTHX); \
114 SvANY(p) = 0; \
115 SvREFCNT(p) = 1; \
116 SvFLAGS(p) = 0; \
117 MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__); \
118 } STMT_END
119 #endif
120
121
122 typedef struct xpvhv_with_aux XPVHV_WITH_AUX;
123
124 struct body_details {
125 U8 body_size; /* Size to allocate */
126 U8 copy; /* Size of structure to copy (may be shorter) */
127 U8 offset; /* Size of unalloced ghost fields to first alloced field*/
128 PERL_BITFIELD8 type : 5; /* We have space for a sanity check. */
129 PERL_BITFIELD8 cant_upgrade : 1;/* Cannot upgrade this type */
130 PERL_BITFIELD8 zero_nv : 1; /* zero the NV when upgrading from this */
131 PERL_BITFIELD8 arena : 1; /* Allocated from an arena */
132 U32 arena_size; /* Size of arena to allocate */
133 };
134
135 #define ALIGNED_TYPE_NAME(name) name##_aligned
136 #define ALIGNED_TYPE(name) \
137 typedef union { \
138 name align_me; \
139 NV nv; \
140 IV iv; \
141 } ALIGNED_TYPE_NAME(name)
142
143 ALIGNED_TYPE(regexp);
144 ALIGNED_TYPE(XPVGV);
145 ALIGNED_TYPE(XPVLV);
146 ALIGNED_TYPE(XPVAV);
147 ALIGNED_TYPE(XPVHV);
148 ALIGNED_TYPE(XPVHV_WITH_AUX);
149 ALIGNED_TYPE(XPVCV);
150 ALIGNED_TYPE(XPVFM);
151 ALIGNED_TYPE(XPVIO);
152 ALIGNED_TYPE(XPVOBJ);
153
154 #define HADNV FALSE
155 #define NONV TRUE
156
157
158 #ifdef PURIFY
159 /* With -DPURFIY we allocate everything directly, and don't use arenas.
160 This seems a rather elegant way to simplify some of the code below. */
161 #define HASARENA FALSE
162 #else
163 #define HASARENA TRUE
164 #endif
165 #define NOARENA FALSE
166
167 /* Size the arenas to exactly fit a given number of bodies. A count
168 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
169 simplifying the default. If count > 0, the arena is sized to fit
170 only that many bodies, allowing arenas to be used for large, rare
171 bodies (XPVFM, XPVIO) without undue waste. The arena size is
172 limited by PERL_ARENA_SIZE, so we can safely oversize the
173 declarations.
174 */
175 #define FIT_ARENA0(body_size) \
176 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
177 #define FIT_ARENAn(count,body_size) \
178 ( count * body_size <= PERL_ARENA_SIZE) \
179 ? count * body_size \
180 : FIT_ARENA0 (body_size)
181 #define FIT_ARENA(count,body_size) \
182 (U32)(count \
183 ? FIT_ARENAn (count, body_size) \
184 : FIT_ARENA0 (body_size))
185
186 /* Calculate the length to copy. Specifically work out the length less any
187 final padding the compiler needed to add. See the comment in sv_upgrade
188 for why copying the padding proved to be a bug. */
189
190 #define copy_length(type, last_member) \
191 STRUCT_OFFSET(type, last_member) \
192 + sizeof (((type*)SvANY((const SV *)0))->last_member)
193
194 static const struct body_details bodies_by_type[] = {
195 /* HEs use this offset for their arena. */
196 { 0, 0, 0, SVt_NULL, FALSE, NONV, NOARENA, 0 },
197
198 /* IVs are in the head, so the allocation size is 0. */
199 { 0,
200 sizeof(IV), /* This is used to copy out the IV body. */
201 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
202 NOARENA /* IVS don't need an arena */, 0
203 },
204
205 #if NVSIZE <= IVSIZE
206 { 0, sizeof(NV),
207 STRUCT_OFFSET(XPVNV, xnv_u),
208 SVt_NV, FALSE, HADNV, NOARENA, 0 },
209 #else
210 { sizeof(NV), sizeof(NV),
211 STRUCT_OFFSET(XPVNV, xnv_u),
212 SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) },
213 #endif
214
215 { sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur),
216 copy_length(XPV, xpv_len) - STRUCT_OFFSET(XPV, xpv_cur),
217 + STRUCT_OFFSET(XPV, xpv_cur),
218 SVt_PV, FALSE, NONV, HASARENA,
219 FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
220
221 { sizeof(XINVLIST) - STRUCT_OFFSET(XPV, xpv_cur),
222 copy_length(XINVLIST, is_offset) - STRUCT_OFFSET(XPV, xpv_cur),
223 + STRUCT_OFFSET(XPV, xpv_cur),
224 SVt_INVLIST, TRUE, NONV, HASARENA,
225 FIT_ARENA(0, sizeof(XINVLIST) - STRUCT_OFFSET(XPV, xpv_cur)) },
226
227 { sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur),
228 copy_length(XPVIV, xiv_u) - STRUCT_OFFSET(XPV, xpv_cur),
229 + STRUCT_OFFSET(XPV, xpv_cur),
230 SVt_PVIV, FALSE, NONV, HASARENA,
231 FIT_ARENA(0, sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur)) },
232
233 #if NVSIZE > 8 && PTRSIZE < 8 && MEM_ALIGNBYTES > 8
234 /* NV may need strict 16 byte alignment.
235
236 On 64-bit systems the NV ends up aligned despite the hack
237 avoiding allocation of xmg_stash and xmg_u, so only do this
238 for 32-bit systems.
239 */
240 { sizeof(XPVNV),
241 sizeof(XPVNV),
242 0,
243 SVt_PVNV, FALSE, HADNV, HASARENA,
244 FIT_ARENA(0, sizeof(XPVNV)) },
245 #else
246 { sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur),
247 copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
248 + STRUCT_OFFSET(XPV, xpv_cur),
249 SVt_PVNV, FALSE, HADNV, HASARENA,
250 FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
251 #endif
252 { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,
253 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
254
255 { sizeof(ALIGNED_TYPE_NAME(regexp)),
256 sizeof(regexp),
257 0,
258 SVt_REGEXP, TRUE, NONV, HASARENA,
259 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(regexp)))
260 },
261
262 { sizeof(ALIGNED_TYPE_NAME(XPVGV)), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
263 HASARENA, FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVGV))) },
264
265 { sizeof(ALIGNED_TYPE_NAME(XPVLV)), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
266 HASARENA, FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVLV))) },
267
268 { sizeof(ALIGNED_TYPE_NAME(XPVAV)),
269 copy_length(XPVAV, xav_alloc),
270 0,
271 SVt_PVAV, TRUE, NONV, HASARENA,
272 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVAV))) },
273
274 { sizeof(ALIGNED_TYPE_NAME(XPVHV)),
275 copy_length(XPVHV, xhv_max),
276 0,
277 SVt_PVHV, TRUE, NONV, HASARENA,
278 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVHV))) },
279
280 { sizeof(ALIGNED_TYPE_NAME(XPVCV)),
281 sizeof(XPVCV),
282 0,
283 SVt_PVCV, TRUE, NONV, HASARENA,
284 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVCV))) },
285
286 { sizeof(ALIGNED_TYPE_NAME(XPVFM)),
287 sizeof(XPVFM),
288 0,
289 SVt_PVFM, TRUE, NONV, NOARENA,
290 FIT_ARENA(20, sizeof(ALIGNED_TYPE_NAME(XPVFM))) },
291
292 { sizeof(ALIGNED_TYPE_NAME(XPVIO)),
293 sizeof(XPVIO),
294 0,
295 SVt_PVIO, TRUE, NONV, HASARENA,
296 FIT_ARENA(24, sizeof(ALIGNED_TYPE_NAME(XPVIO))) },
297
298 { sizeof(ALIGNED_TYPE_NAME(XPVOBJ)),
299 copy_length(XPVOBJ, xobject_fields),
300 0,
301 SVt_PVOBJ, TRUE, NONV, HASARENA,
302 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVOBJ))) },
303 };
304
305 #define new_body_allocated(sv_type) \
306 (void *)((char *)S_new_body(aTHX_ sv_type) \
307 - bodies_by_type[sv_type].offset)
308
309 #ifdef PURIFY
310 #if !(NVSIZE <= IVSIZE)
311 # define new_XNV() safemalloc(sizeof(XPVNV))
312 #endif
313 #define new_XPVNV() safemalloc(sizeof(XPVNV))
314 #define new_XPVMG() safemalloc(sizeof(XPVMG))
315
316 #define del_body_by_type(p, type) safefree(p)
317
318 #else /* !PURIFY */
319
320 #if !(NVSIZE <= IVSIZE)
321 # define new_XNV() new_body_allocated(SVt_NV)
322 #endif
323 #define new_XPVNV() new_body_allocated(SVt_PVNV)
324 #define new_XPVMG() new_body_allocated(SVt_PVMG)
325
326 #define del_body_by_type(p, type) \
327 del_body(p + bodies_by_type[(type)].offset, \
328 &PL_body_roots[(type)])
329
330 #endif /* PURIFY */
331
332 /* no arena for you! */
333
334 #define new_NOARENA(details) \
335 safemalloc((details)->body_size + (details)->offset)
336 #define new_NOARENAZ(details) \
337 safecalloc((details)->body_size + (details)->offset, 1)
338
339 #ifndef PURIFY
340
341 /* grab a new thing from the arena's free list, allocating more if necessary. */
342 #define new_body_from_arena(xpv, root_index, type_meta) \
343 STMT_START { \
344 void ** const r3wt = &PL_body_roots[root_index]; \
345 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
346 ? *((void **)(r3wt)) : Perl_more_bodies(aTHX_ root_index, \
347 type_meta.body_size,\
348 type_meta.arena_size)); \
349 *(r3wt) = *(void**)(xpv); \
350 } STMT_END
351
352 PERL_STATIC_INLINE void *
S_new_body(pTHX_ const svtype sv_type)353 S_new_body(pTHX_ const svtype sv_type)
354 {
355 void *xpv;
356 new_body_from_arena(xpv, sv_type, bodies_by_type[sv_type]);
357 return xpv;
358 }
359
360 #endif
361
362 static const struct body_details fake_rv =
363 { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
364
365 static const struct body_details fake_hv_with_aux =
366 /* The SVt_IV arena is used for (larger) PVHV bodies. */
367 { sizeof(ALIGNED_TYPE_NAME(XPVHV_WITH_AUX)),
368 copy_length(XPVHV, xhv_max),
369 0,
370 SVt_PVHV, TRUE, NONV, HASARENA,
371 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVHV_WITH_AUX))) };
372
373 /*
374 =for apidoc newSV_type
375
376 Creates a new SV, of the type specified. The reference count for the new SV
377 is set to 1.
378
379 =cut
380 */
381
382 PERL_STATIC_INLINE SV *
Perl_newSV_type(pTHX_ const svtype type)383 Perl_newSV_type(pTHX_ const svtype type)
384 {
385 SV *sv;
386 void* new_body;
387 const struct body_details *type_details;
388
389 new_SV(sv);
390
391 type_details = bodies_by_type + type;
392
393 SvFLAGS(sv) &= ~SVTYPEMASK;
394 SvFLAGS(sv) |= type;
395
396 switch (type) {
397 case SVt_NULL:
398 break;
399 case SVt_IV:
400 SET_SVANY_FOR_BODYLESS_IV(sv);
401 SvIV_set(sv, 0);
402 break;
403 case SVt_NV:
404 #if NVSIZE <= IVSIZE
405 SET_SVANY_FOR_BODYLESS_NV(sv);
406 #else
407 SvANY(sv) = new_XNV();
408 #endif
409 SvNV_set(sv, 0);
410 break;
411 case SVt_PVHV:
412 case SVt_PVAV:
413 case SVt_PVOBJ:
414 assert(type_details->body_size);
415
416 #ifndef PURIFY
417 assert(type_details->arena);
418 assert(type_details->arena_size);
419 /* This points to the start of the allocated area. */
420 new_body = S_new_body(aTHX_ type);
421 /* xpvav and xpvhv have no offset, so no need to adjust new_body */
422 assert(!(type_details->offset));
423 #else
424 /* We always allocated the full length item with PURIFY. To do this
425 we fake things so that arena is false for all 16 types.. */
426 new_body = new_NOARENAZ(type_details);
427 #endif
428 SvANY(sv) = new_body;
429
430 SvSTASH_set(sv, NULL);
431 SvMAGIC_set(sv, NULL);
432
433 switch(type) {
434 case SVt_PVAV:
435 AvFILLp(sv) = -1;
436 AvMAX(sv) = -1;
437 AvALLOC(sv) = NULL;
438
439 AvREAL_only(sv);
440 break;
441 case SVt_PVHV:
442 HvTOTALKEYS(sv) = 0;
443 /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
444 HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX;
445
446 assert(!SvOK(sv));
447 SvOK_off(sv);
448 #ifndef NODEFAULT_SHAREKEYS
449 HvSHAREKEYS_on(sv); /* key-sharing on by default */
450 #endif
451 /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
452 HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX;
453 break;
454 case SVt_PVOBJ:
455 ObjectMAXFIELD(sv) = -1;
456 ObjectFIELDS(sv) = NULL;
457 break;
458 default:
459 NOT_REACHED;
460 }
461
462 sv->sv_u.svu_array = NULL; /* or svu_hash */
463 break;
464
465 case SVt_PVIV:
466 case SVt_PVIO:
467 case SVt_PVGV:
468 case SVt_PVCV:
469 case SVt_PVLV:
470 case SVt_INVLIST:
471 case SVt_REGEXP:
472 case SVt_PVMG:
473 case SVt_PVNV:
474 case SVt_PV:
475 /* For a type known at compile time, it should be possible for the
476 * compiler to deduce the value of (type_details->arena), resolve
477 * that branch below, and inline the relevant values from
478 * bodies_by_type. Except, at least for gcc, it seems not to do that.
479 * We help it out here with two deviations from sv_upgrade:
480 * (1) Minor rearrangement here, so that PVFM - the only type at this
481 * point not to be allocated from an array appears last, not PV.
482 * (2) The ASSUME() statement here for everything that isn't PVFM.
483 * Obviously this all only holds as long as it's a true reflection of
484 * the bodies_by_type lookup table. */
485 #ifndef PURIFY
486 ASSUME(type_details->arena);
487 #endif
488 /* FALLTHROUGH */
489 case SVt_PVFM:
490
491 assert(type_details->body_size);
492 /* We always allocated the full length item with PURIFY. To do this
493 we fake things so that arena is false for all 16 types.. */
494 #ifndef PURIFY
495 if(type_details->arena) {
496 /* This points to the start of the allocated area. */
497 new_body = S_new_body(aTHX_ type);
498 Zero(new_body, type_details->body_size, char);
499 new_body = ((char *)new_body) - type_details->offset;
500 } else
501 #endif
502 {
503 new_body = new_NOARENAZ(type_details);
504 }
505 SvANY(sv) = new_body;
506
507 if (UNLIKELY(type == SVt_PVIO)) {
508 IO * const io = MUTABLE_IO(sv);
509 GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
510
511 SvOBJECT_on(io);
512 /* Clear the stashcache because a new IO could overrule a package
513 name */
514 DEBUG_o(Perl_deb(aTHX_ "sv_upgrade clearing PL_stashcache\n"));
515 hv_clear(PL_stashcache);
516
517 SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
518 IoPAGE_LEN(sv) = 60;
519 }
520
521 sv->sv_u.svu_rv = NULL;
522 break;
523 default:
524 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
525 (unsigned long)type);
526 }
527
528 return sv;
529 }
530
531 /*
532 =for apidoc newSV_type_mortal
533
534 Creates a new mortal SV, of the type specified. The reference count for the
535 new SV is set to 1.
536
537 This is equivalent to
538 SV* sv = sv_2mortal(newSV_type(<some type>))
539 and
540 SV* sv = sv_newmortal();
541 sv_upgrade(sv, <some_type>)
542 but should be more efficient than both of them. (Unless sv_2mortal is inlined
543 at some point in the future.)
544
545 =cut
546 */
547
548 PERL_STATIC_INLINE SV *
Perl_newSV_type_mortal(pTHX_ const svtype type)549 Perl_newSV_type_mortal(pTHX_ const svtype type)
550 {
551 SV *sv = newSV_type(type);
552 SSize_t ix = ++PL_tmps_ix;
553 if (UNLIKELY(ix >= PL_tmps_max))
554 ix = Perl_tmps_grow_p(aTHX_ ix);
555 PL_tmps_stack[ix] = (sv);
556 SvTEMP_on(sv);
557 return sv;
558 }
559
560 /* The following functions started out in sv.h and then moved to inline.h. They
561 * moved again into this file during the 5.37.x development cycle. */
562
563 /*
564 =for apidoc_section $SV
565 =for apidoc SvPVXtrue
566
567 Returns a boolean as to whether or not C<sv> contains a PV that is considered
568 TRUE. FALSE is returned if C<sv> doesn't contain a PV, or if the PV it does
569 contain is zero length, or consists of just the single character '0'. Every
570 other PV value is considered TRUE.
571
572 As of Perl v5.37.1, C<sv> is evaluated exactly once; in earlier releases, it
573 could be evaluated more than once.
574
575 =cut
576 */
577
578 PERL_STATIC_INLINE bool
Perl_SvPVXtrue(pTHX_ SV * sv)579 Perl_SvPVXtrue(pTHX_ SV *sv)
580 {
581 PERL_ARGS_ASSERT_SVPVXTRUE;
582
583 PERL_UNUSED_CONTEXT;
584
585 if (! (XPV *) SvANY(sv)) {
586 return false;
587 }
588
589 if ( ((XPV *) SvANY(sv))->xpv_cur > 1) { /* length > 1 */
590 return true;
591 }
592
593 if (( (XPV *) SvANY(sv))->xpv_cur == 0) {
594 return false;
595 }
596
597 return *sv->sv_u.svu_pv != '0';
598 }
599
600 /*
601 =for apidoc SvGETMAGIC
602 Invokes C<L</mg_get>> on an SV if it has 'get' magic. For example, this
603 will call C<FETCH> on a tied variable. As of 5.37.1, this function is
604 guaranteed to evaluate its argument exactly once.
605
606 =cut
607 */
608
609 PERL_STATIC_INLINE void
Perl_SvGETMAGIC(pTHX_ SV * sv)610 Perl_SvGETMAGIC(pTHX_ SV *sv)
611 {
612 PERL_ARGS_ASSERT_SVGETMAGIC;
613
614 if (UNLIKELY(SvGMAGICAL(sv))) {
615 mg_get(sv);
616 }
617 }
618
619 PERL_STATIC_INLINE bool
Perl_SvTRUE(pTHX_ SV * sv)620 Perl_SvTRUE(pTHX_ SV *sv)
621 {
622 PERL_ARGS_ASSERT_SVTRUE;
623
624 if (UNLIKELY(sv == NULL))
625 return FALSE;
626 SvGETMAGIC(sv);
627 return SvTRUE_nomg_NN(sv);
628 }
629
630 PERL_STATIC_INLINE bool
Perl_SvTRUE_nomg(pTHX_ SV * sv)631 Perl_SvTRUE_nomg(pTHX_ SV *sv)
632 {
633 PERL_ARGS_ASSERT_SVTRUE_NOMG;
634
635 if (UNLIKELY(sv == NULL))
636 return FALSE;
637 return SvTRUE_nomg_NN(sv);
638 }
639
640 PERL_STATIC_INLINE bool
Perl_SvTRUE_NN(pTHX_ SV * sv)641 Perl_SvTRUE_NN(pTHX_ SV *sv)
642 {
643 PERL_ARGS_ASSERT_SVTRUE_NN;
644
645 SvGETMAGIC(sv);
646 return SvTRUE_nomg_NN(sv);
647 }
648
649 PERL_STATIC_INLINE bool
Perl_SvTRUE_common(pTHX_ SV * sv,const bool sv_2bool_is_fallback)650 Perl_SvTRUE_common(pTHX_ SV * sv, const bool sv_2bool_is_fallback)
651 {
652 PERL_ARGS_ASSERT_SVTRUE_COMMON;
653
654 if (UNLIKELY(SvIMMORTAL_INTERP(sv)))
655 return SvIMMORTAL_TRUE(sv);
656
657 if (! SvOK(sv))
658 return FALSE;
659
660 if (SvPOK(sv))
661 return SvPVXtrue(sv);
662
663 if (SvIOK(sv))
664 return SvIVX(sv) != 0; /* casts to bool */
665
666 if (SvROK(sv) && !(SvOBJECT(SvRV(sv)) && HvAMAGIC(SvSTASH(SvRV(sv)))))
667 return TRUE;
668
669 if (sv_2bool_is_fallback)
670 return sv_2bool_nomg(sv);
671
672 return isGV_with_GP(sv);
673 }
674
675 PERL_STATIC_INLINE SV *
Perl_SvREFCNT_inc(SV * sv)676 Perl_SvREFCNT_inc(SV *sv)
677 {
678 if (LIKELY(sv != NULL))
679 SvREFCNT(sv)++;
680 return sv;
681 }
682
683 PERL_STATIC_INLINE SV *
Perl_SvREFCNT_inc_NN(SV * sv)684 Perl_SvREFCNT_inc_NN(SV *sv)
685 {
686 PERL_ARGS_ASSERT_SVREFCNT_INC_NN;
687
688 SvREFCNT(sv)++;
689 return sv;
690 }
691
692 PERL_STATIC_INLINE void
Perl_SvREFCNT_inc_void(SV * sv)693 Perl_SvREFCNT_inc_void(SV *sv)
694 {
695 if (LIKELY(sv != NULL))
696 SvREFCNT(sv)++;
697 }
698
699 PERL_STATIC_INLINE void
Perl_SvREFCNT_dec(pTHX_ SV * sv)700 Perl_SvREFCNT_dec(pTHX_ SV *sv)
701 {
702 if (LIKELY(sv != NULL)) {
703 U32 rc = SvREFCNT(sv);
704 if (LIKELY(rc > 1))
705 SvREFCNT(sv) = rc - 1;
706 else
707 Perl_sv_free2(aTHX_ sv, rc);
708 }
709 }
710
711 PERL_STATIC_INLINE SV *
Perl_SvREFCNT_dec_ret_NULL(pTHX_ SV * sv)712 Perl_SvREFCNT_dec_ret_NULL(pTHX_ SV *sv)
713 {
714 PERL_ARGS_ASSERT_SVREFCNT_DEC_RET_NULL;
715 Perl_SvREFCNT_dec(aTHX_ sv);
716 return NULL;
717 }
718
719
720 PERL_STATIC_INLINE void
Perl_SvREFCNT_dec_NN(pTHX_ SV * sv)721 Perl_SvREFCNT_dec_NN(pTHX_ SV *sv)
722 {
723 U32 rc = SvREFCNT(sv);
724
725 PERL_ARGS_ASSERT_SVREFCNT_DEC_NN;
726
727 if (LIKELY(rc > 1))
728 SvREFCNT(sv) = rc - 1;
729 else
730 Perl_sv_free2(aTHX_ sv, rc);
731 }
732
733 /*
734 =for apidoc SvAMAGIC_on
735
736 Indicate that C<sv> has overloading (active magic) enabled.
737
738 =cut
739 */
740
741 PERL_STATIC_INLINE void
Perl_SvAMAGIC_on(SV * sv)742 Perl_SvAMAGIC_on(SV *sv)
743 {
744 PERL_ARGS_ASSERT_SVAMAGIC_ON;
745 assert(SvROK(sv));
746
747 if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
748 }
749
750 /*
751 =for apidoc SvAMAGIC_off
752
753 Indicate that C<sv> has overloading (active magic) disabled.
754
755 =cut
756 */
757
758 PERL_STATIC_INLINE void
Perl_SvAMAGIC_off(SV * sv)759 Perl_SvAMAGIC_off(SV *sv)
760 {
761 PERL_ARGS_ASSERT_SVAMAGIC_OFF;
762
763 if (SvROK(sv) && SvOBJECT(SvRV(sv)))
764 HvAMAGIC_off(SvSTASH(SvRV(sv)));
765 }
766
767 PERL_STATIC_INLINE U32
Perl_SvPADSTALE_on(SV * sv)768 Perl_SvPADSTALE_on(SV *sv)
769 {
770 assert(!(SvFLAGS(sv) & SVs_PADTMP));
771 return SvFLAGS(sv) |= SVs_PADSTALE;
772 }
773 PERL_STATIC_INLINE U32
Perl_SvPADSTALE_off(SV * sv)774 Perl_SvPADSTALE_off(SV *sv)
775 {
776 assert(!(SvFLAGS(sv) & SVs_PADTMP));
777 return SvFLAGS(sv) &= ~SVs_PADSTALE;
778 }
779
780 /*
781 =for apidoc_section $SV
782 =for apidoc SvIV
783 =for apidoc_item SvIV_nomg
784 =for apidoc_item SvIVx
785
786 These each coerce the given SV to IV and return it. The returned value in many
787 circumstances will get stored in C<sv>'s IV slot, but not in all cases. (Use
788 C<L</sv_setiv>> to make sure it does).
789
790 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
791
792 C<SvIVx> is now identical to C<SvIV>, but prior to 5.37.1, it was the only form
793 guaranteed to evaluate C<sv> only once.
794
795 C<SvIV_nomg> is the same as C<SvIV>, but does not perform 'get' magic.
796
797 =for apidoc SvNV
798 =for apidoc_item SvNV_nomg
799 =for apidoc_item SvNVx
800
801 These each coerce the given SV to NV and return it. The returned value in many
802 circumstances will get stored in C<sv>'s NV slot, but not in all cases. (Use
803 C<L</sv_setnv>> to make sure it does).
804
805 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
806
807 C<SvNVx> is now identical to C<SvNV>, but prior to 5.37.1, it was the only form
808 guaranteed to evaluate C<sv> only once.
809
810 C<SvNV_nomg> is the same as C<SvNV>, but does not perform 'get' magic.
811
812 =for apidoc SvUV
813 =for apidoc_item SvUV_nomg
814 =for apidoc_item SvUVx
815
816 These each coerce the given SV to UV and return it. The returned value in many
817 circumstances will get stored in C<sv>'s UV slot, but not in all cases. (Use
818 C<L</sv_setuv>> to make sure it does).
819
820 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
821
822 C<SvUVx> is now identical to C<SvUV>, but prior to 5.37.1, it was the only form
823 guaranteed to evaluate C<sv> only once.
824
825 =cut
826 */
827
828 PERL_STATIC_INLINE IV
Perl_SvIV(pTHX_ SV * sv)829 Perl_SvIV(pTHX_ SV *sv) {
830 PERL_ARGS_ASSERT_SVIV;
831
832 if (SvIOK_nog(sv))
833 return SvIVX(sv);
834 return sv_2iv(sv);
835 }
836
837 PERL_STATIC_INLINE UV
Perl_SvUV(pTHX_ SV * sv)838 Perl_SvUV(pTHX_ SV *sv) {
839 PERL_ARGS_ASSERT_SVUV;
840
841 if (SvUOK_nog(sv))
842 return SvUVX(sv);
843 return sv_2uv(sv);
844 }
845
846 PERL_STATIC_INLINE NV
Perl_SvNV(pTHX_ SV * sv)847 Perl_SvNV(pTHX_ SV *sv) {
848 PERL_ARGS_ASSERT_SVNV;
849
850 if (SvNOK_nog(sv))
851 return SvNVX(sv);
852 return sv_2nv(sv);
853 }
854
855 PERL_STATIC_INLINE IV
Perl_SvIV_nomg(pTHX_ SV * sv)856 Perl_SvIV_nomg(pTHX_ SV *sv) {
857 PERL_ARGS_ASSERT_SVIV_NOMG;
858
859 if (SvIOK(sv))
860 return SvIVX(sv);
861 return sv_2iv_flags(sv, 0);
862 }
863
864 PERL_STATIC_INLINE UV
Perl_SvUV_nomg(pTHX_ SV * sv)865 Perl_SvUV_nomg(pTHX_ SV *sv) {
866 PERL_ARGS_ASSERT_SVUV_NOMG;
867
868 if (SvUOK(sv))
869 return SvUVX(sv);
870 return sv_2uv_flags(sv, 0);
871 }
872
873 PERL_STATIC_INLINE NV
Perl_SvNV_nomg(pTHX_ SV * sv)874 Perl_SvNV_nomg(pTHX_ SV *sv) {
875 PERL_ARGS_ASSERT_SVNV_NOMG;
876
877 if (SvNOK(sv))
878 return SvNVX(sv);
879 return sv_2nv_flags(sv, 0);
880 }
881
882 #if defined(PERL_CORE) || defined (PERL_EXT)
883 PERL_STATIC_INLINE STRLEN
S_sv_or_pv_pos_u2b(pTHX_ SV * sv,const char * pv,STRLEN pos,STRLEN * lenp)884 S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
885 {
886 PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B;
887 if (SvGAMAGIC(sv)) {
888 U8 *hopped = utf8_hop((U8 *)pv, pos);
889 if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
890 return (STRLEN)(hopped - (U8 *)pv);
891 }
892 return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
893 }
894 #endif
895
896 PERL_STATIC_INLINE char *
Perl_sv_pvutf8n_force_wrapper(pTHX_ SV * const sv,STRLEN * const lp,const U32 dummy)897 Perl_sv_pvutf8n_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy)
898 {
899 /* This is just so can be passed to Perl_SvPV_helper() as a function
900 * pointer with the same signature as all the other such pointers, and
901 * having hence an unused parameter */
902 PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE_WRAPPER;
903 PERL_UNUSED_ARG(dummy);
904
905 return sv_pvutf8n_force(sv, lp);
906 }
907
908 PERL_STATIC_INLINE char *
Perl_sv_pvbyten_force_wrapper(pTHX_ SV * const sv,STRLEN * const lp,const U32 dummy)909 Perl_sv_pvbyten_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy)
910 {
911 /* This is just so can be passed to Perl_SvPV_helper() as a function
912 * pointer with the same signature as all the other such pointers, and
913 * having hence an unused parameter */
914 PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE_WRAPPER;
915 PERL_UNUSED_ARG(dummy);
916
917 return sv_pvbyten_force(sv, lp);
918 }
919
920 PERL_STATIC_INLINE char *
Perl_SvPV_helper(pTHX_ SV * const sv,STRLEN * const lp,const U32 flags,const PL_SvPVtype type,char * (* non_trivial)(pTHX_ SV *,STRLEN * const,const U32),const bool or_null,const U32 return_flags)921 Perl_SvPV_helper(pTHX_
922 SV * const sv,
923 STRLEN * const lp,
924 const U32 flags,
925 const PL_SvPVtype type,
926 char * (*non_trivial)(pTHX_ SV *, STRLEN * const, const U32),
927 const bool or_null,
928 const U32 return_flags
929 )
930 {
931 /* 'type' should be known at compile time, so this is reduced to a single
932 * conditional at runtime */
933 if ( (type == SvPVbyte_type_ && SvPOK_byte_nog(sv))
934 || (type == SvPVforce_type_ && SvPOK_pure_nogthink(sv))
935 || (type == SvPVutf8_type_ && SvPOK_utf8_nog(sv))
936 || (type == SvPVnormal_type_ && SvPOK_nog(sv))
937 || (type == SvPVutf8_pure_type_ && SvPOK_utf8_pure_nogthink(sv))
938 || (type == SvPVbyte_pure_type_ && SvPOK_byte_pure_nogthink(sv))
939 ) {
940 if (lp) {
941 *lp = SvCUR(sv);
942 }
943
944 /* Similarly 'return_flags is known at compile time, so this becomes
945 * branchless */
946 if (return_flags & SV_MUTABLE_RETURN) {
947 return SvPVX_mutable(sv);
948 }
949 else if(return_flags & SV_CONST_RETURN) {
950 return (char *) SvPVX_const(sv);
951 }
952 else {
953 return SvPVX(sv);
954 }
955 }
956
957 if (or_null) { /* This is also known at compile time */
958 if (flags & SV_GMAGIC) { /* As is this */
959 SvGETMAGIC(sv);
960 }
961
962 if (! SvOK(sv)) {
963 if (lp) { /* As is this */
964 *lp = 0;
965 }
966
967 return NULL;
968 }
969 }
970
971 /* Can't trivially handle this, call the function */
972 return non_trivial(aTHX_ sv, lp, (flags|return_flags));
973 }
974
975 /*
976 =for apidoc newRV_noinc
977
978 Creates an RV wrapper for an SV. The reference count for the original
979 SV is B<not> incremented.
980
981 =cut
982 */
983
984 PERL_STATIC_INLINE SV *
Perl_newRV_noinc(pTHX_ SV * const tmpRef)985 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
986 {
987 SV *sv = newSV_type(SVt_IV);
988
989 PERL_ARGS_ASSERT_NEWRV_NOINC;
990
991 SvTEMP_off(tmpRef);
992
993 /* inlined, simplified sv_setrv_noinc(sv, tmpRef); */
994 SvRV_set(sv, tmpRef);
995 SvROK_on(sv);
996
997 return sv;
998 }
999
1000 PERL_STATIC_INLINE char *
Perl_sv_setpv_freshbuf(pTHX_ SV * const sv)1001 Perl_sv_setpv_freshbuf(pTHX_ SV *const sv)
1002 {
1003 PERL_ARGS_ASSERT_SV_SETPV_FRESHBUF;
1004 assert(SvTYPE(sv) >= SVt_PV);
1005 assert(SvTYPE(sv) <= SVt_PVMG);
1006 assert(!SvTHINKFIRST(sv));
1007 assert(SvPVX(sv));
1008 SvCUR_set(sv, 0);
1009 *(SvEND(sv))= '\0';
1010 (void)SvPOK_only_UTF8(sv); /* UTF-8 flag will be 0; This is used instead
1011 of 'SvPOK_only' because the other sv_setpv
1012 functions use it */
1013 SvTAINT(sv);
1014 return SvPVX(sv);
1015 }
1016
1017 /*
1018 * ex: set ts=8 sts=4 sw=4 et:
1019 */
1020