3 * Copyright (C) 2022 by Larry Wall and others
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.
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
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.
23 /* This definition came from perl.h*/
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
31 /* All other pre-existing definitions and functions that were moved into this
32 * file originally came from sv.c. */
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
39 # define POISON_SV_HEAD(sv) PoisonNew(sv, 1, struct STRUCT_SV)
41 # define POISON_SV_HEAD(sv) PoisonNew(&SvANY(sv), 1, void *), \
42 PoisonNew(&SvREFCNT(sv), 1, U32)
44 # define SvARENA_CHAIN(sv) SvANY(sv)
45 # define SvARENA_CHAIN_SET(sv,val) SvANY(sv) = (void *)(val)
46 # define POISON_SV_HEAD(sv)
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)
55 # define MEM_LOG_NEW_SV(sv, file, line, func) NOOP
56 # define MEM_LOG_DEL_SV(sv, file, line, func) NOOP
59 #define uproot_SV(p) \
62 PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p)); \
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);
70 /* new_SV(): return a new, empty SV head */
72 #ifdef DEBUG_LEAKING_SCALARS
73 /* provide a real function for a debugger to play with */
75 S_new_SV(pTHX_ const char *file, int line, const char *func)
82 sv = Perl_more_sv(aTHX);
86 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
87 sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
93 sv->sv_debug_inpad = 0;
94 sv->sv_debug_parent = NULL;
95 sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
97 sv->sv_debug_serial = PL_sv_serial++;
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));
105 # define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
113 (p) = Perl_more_sv(aTHX); \
117 MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__); \
122 typedef struct xpvhv_with_aux XPVHV_WITH_AUX;
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 */
135 #define ALIGNED_TYPE_NAME(name) name##_aligned
136 #define ALIGNED_TYPE(name) \
141 } ALIGNED_TYPE_NAME(name)
143 ALIGNED_TYPE(regexp);
148 ALIGNED_TYPE(XPVHV_WITH_AUX);
152 ALIGNED_TYPE(XPVOBJ);
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
163 #define HASARENA TRUE
165 #define NOARENA FALSE
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
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) \
183 ? FIT_ARENAn (count, body_size) \
184 : FIT_ARENA0 (body_size))
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. */
190 #define copy_length(type, last_member) \
191 STRUCT_OFFSET(type, last_member) \
192 + sizeof (((type*)SvANY((const SV *)0))->last_member)
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 },
198 /* IVs are in the head, so the allocation size is 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
207 STRUCT_OFFSET(XPVNV, xnv_u),
208 SVt_NV, FALSE, HADNV, NOARENA, 0 },
210 { sizeof(NV), sizeof(NV),
211 STRUCT_OFFSET(XPVNV, xnv_u),
212 SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) },
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)) },
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)) },
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)) },
233 { sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur),
234 copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
235 + STRUCT_OFFSET(XPV, xpv_cur),
236 SVt_PVNV, FALSE, HADNV, HASARENA,
237 FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
239 { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,
240 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
242 { sizeof(ALIGNED_TYPE_NAME(regexp)),
245 SVt_REGEXP, TRUE, NONV, HASARENA,
246 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(regexp)))
249 { sizeof(ALIGNED_TYPE_NAME(XPVGV)), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
250 HASARENA, FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVGV))) },
252 { sizeof(ALIGNED_TYPE_NAME(XPVLV)), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
253 HASARENA, FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVLV))) },
255 { sizeof(ALIGNED_TYPE_NAME(XPVAV)),
256 copy_length(XPVAV, xav_alloc),
258 SVt_PVAV, TRUE, NONV, HASARENA,
259 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVAV))) },
261 { sizeof(ALIGNED_TYPE_NAME(XPVHV)),
262 copy_length(XPVHV, xhv_max),
264 SVt_PVHV, TRUE, NONV, HASARENA,
265 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVHV))) },
267 { sizeof(ALIGNED_TYPE_NAME(XPVCV)),
270 SVt_PVCV, TRUE, NONV, HASARENA,
271 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVCV))) },
273 { sizeof(ALIGNED_TYPE_NAME(XPVFM)),
276 SVt_PVFM, TRUE, NONV, NOARENA,
277 FIT_ARENA(20, sizeof(ALIGNED_TYPE_NAME(XPVFM))) },
279 { sizeof(ALIGNED_TYPE_NAME(XPVIO)),
282 SVt_PVIO, TRUE, NONV, HASARENA,
283 FIT_ARENA(24, sizeof(ALIGNED_TYPE_NAME(XPVIO))) },
285 { sizeof(ALIGNED_TYPE_NAME(XPVOBJ)),
286 copy_length(XPVOBJ, xobject_fields),
288 SVt_PVOBJ, TRUE, NONV, HASARENA,
289 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVOBJ))) },
292 #define new_body_allocated(sv_type) \
293 (void *)((char *)S_new_body(aTHX_ sv_type) \
294 - bodies_by_type[sv_type].offset)
297 #if !(NVSIZE <= IVSIZE)
298 # define new_XNV() safemalloc(sizeof(XPVNV))
300 #define new_XPVNV() safemalloc(sizeof(XPVNV))
301 #define new_XPVMG() safemalloc(sizeof(XPVMG))
303 #define del_body_by_type(p, type) safefree(p)
307 #if !(NVSIZE <= IVSIZE)
308 # define new_XNV() new_body_allocated(SVt_NV)
310 #define new_XPVNV() new_body_allocated(SVt_PVNV)
311 #define new_XPVMG() new_body_allocated(SVt_PVMG)
313 #define del_body_by_type(p, type) \
314 del_body(p + bodies_by_type[(type)].offset, \
315 &PL_body_roots[(type)])
319 /* no arena for you! */
321 #define new_NOARENA(details) \
322 safemalloc((details)->body_size + (details)->offset)
323 #define new_NOARENAZ(details) \
324 safecalloc((details)->body_size + (details)->offset, 1)
328 /* grab a new thing from the arena's free list, allocating more if necessary. */
329 #define new_body_from_arena(xpv, root_index, type_meta) \
331 void ** const r3wt = &PL_body_roots[root_index]; \
332 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
333 ? *((void **)(r3wt)) : Perl_more_bodies(aTHX_ root_index, \
334 type_meta.body_size,\
335 type_meta.arena_size)); \
336 *(r3wt) = *(void**)(xpv); \
339 PERL_STATIC_INLINE void *
340 S_new_body(pTHX_ const svtype sv_type)
343 new_body_from_arena(xpv, sv_type, bodies_by_type[sv_type]);
349 static const struct body_details fake_rv =
350 { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
352 static const struct body_details fake_hv_with_aux =
353 /* The SVt_IV arena is used for (larger) PVHV bodies. */
354 { sizeof(ALIGNED_TYPE_NAME(XPVHV_WITH_AUX)),
355 copy_length(XPVHV, xhv_max),
357 SVt_PVHV, TRUE, NONV, HASARENA,
358 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVHV_WITH_AUX))) };
361 =for apidoc newSV_type
363 Creates a new SV, of the type specified. The reference count for the new SV
369 PERL_STATIC_INLINE SV *
370 Perl_newSV_type(pTHX_ const svtype type)
374 const struct body_details *type_details;
378 type_details = bodies_by_type + type;
380 SvFLAGS(sv) &= ~SVTYPEMASK;
387 SET_SVANY_FOR_BODYLESS_IV(sv);
392 SET_SVANY_FOR_BODYLESS_NV(sv);
394 SvANY(sv) = new_XNV();
401 assert(type_details->body_size);
404 assert(type_details->arena);
405 assert(type_details->arena_size);
406 /* This points to the start of the allocated area. */
407 new_body = S_new_body(aTHX_ type);
408 /* xpvav and xpvhv have no offset, so no need to adjust new_body */
409 assert(!(type_details->offset));
411 /* We always allocated the full length item with PURIFY. To do this
412 we fake things so that arena is false for all 16 types.. */
413 new_body = new_NOARENAZ(type_details);
415 SvANY(sv) = new_body;
417 SvSTASH_set(sv, NULL);
418 SvMAGIC_set(sv, NULL);
430 /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
431 HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX;
435 #ifndef NODEFAULT_SHAREKEYS
436 HvSHAREKEYS_on(sv); /* key-sharing on by default */
438 /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
439 HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX;
442 ObjectMAXFIELD(sv) = -1;
443 ObjectFIELDS(sv) = NULL;
449 sv->sv_u.svu_array = NULL; /* or svu_hash */
462 /* For a type known at compile time, it should be possible for the
463 * compiler to deduce the value of (type_details->arena), resolve
464 * that branch below, and inline the relevant values from
465 * bodies_by_type. Except, at least for gcc, it seems not to do that.
466 * We help it out here with two deviations from sv_upgrade:
467 * (1) Minor rearrangement here, so that PVFM - the only type at this
468 * point not to be allocated from an array appears last, not PV.
469 * (2) The ASSUME() statement here for everything that isn't PVFM.
470 * Obviously this all only holds as long as it's a true reflection of
471 * the bodies_by_type lookup table. */
473 ASSUME(type_details->arena);
478 assert(type_details->body_size);
479 /* We always allocated the full length item with PURIFY. To do this
480 we fake things so that arena is false for all 16 types.. */
482 if(type_details->arena) {
483 /* This points to the start of the allocated area. */
484 new_body = S_new_body(aTHX_ type);
485 Zero(new_body, type_details->body_size, char);
486 new_body = ((char *)new_body) - type_details->offset;
490 new_body = new_NOARENAZ(type_details);
492 SvANY(sv) = new_body;
494 if (UNLIKELY(type == SVt_PVIO)) {
495 IO * const io = MUTABLE_IO(sv);
496 GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
499 /* Clear the stashcache because a new IO could overrule a package
501 DEBUG_o(Perl_deb(aTHX_ "sv_upgrade clearing PL_stashcache\n"));
502 hv_clear(PL_stashcache);
504 SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
508 sv->sv_u.svu_rv = NULL;
511 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
512 (unsigned long)type);
519 =for apidoc newSV_type_mortal
521 Creates a new mortal SV, of the type specified. The reference count for the
524 This is equivalent to
525 SV* sv = sv_2mortal(newSV_type(<some type>))
527 SV* sv = sv_newmortal();
528 sv_upgrade(sv, <some_type>)
529 but should be more efficient than both of them. (Unless sv_2mortal is inlined
530 at some point in the future.)
535 PERL_STATIC_INLINE SV *
536 Perl_newSV_type_mortal(pTHX_ const svtype type)
538 SV *sv = newSV_type(type);
539 SSize_t ix = ++PL_tmps_ix;
540 if (UNLIKELY(ix >= PL_tmps_max))
541 ix = Perl_tmps_grow_p(aTHX_ ix);
542 PL_tmps_stack[ix] = (sv);
547 /* The following functions started out in sv.h and then moved to inline.h. They
548 * moved again into this file during the 5.37.x development cycle. */
551 =for apidoc_section $SV
552 =for apidoc SvPVXtrue
554 Returns a boolean as to whether or not C<sv> contains a PV that is considered
555 TRUE. FALSE is returned if C<sv> doesn't contain a PV, or if the PV it does
556 contain is zero length, or consists of just the single character '0'. Every
557 other PV value is considered TRUE.
559 As of Perl v5.37.1, C<sv> is evaluated exactly once; in earlier releases, it
560 could be evaluated more than once.
565 PERL_STATIC_INLINE bool
566 Perl_SvPVXtrue(pTHX_ SV *sv)
568 PERL_ARGS_ASSERT_SVPVXTRUE;
572 if (! (XPV *) SvANY(sv)) {
576 if ( ((XPV *) SvANY(sv))->xpv_cur > 1) { /* length > 1 */
580 if (( (XPV *) SvANY(sv))->xpv_cur == 0) {
584 return *sv->sv_u.svu_pv != '0';
588 =for apidoc SvGETMAGIC
589 Invokes C<L</mg_get>> on an SV if it has 'get' magic. For example, this
590 will call C<FETCH> on a tied variable. As of 5.37.1, this function is
591 guaranteed to evaluate its argument exactly once.
596 PERL_STATIC_INLINE void
597 Perl_SvGETMAGIC(pTHX_ SV *sv)
599 PERL_ARGS_ASSERT_SVGETMAGIC;
601 if (UNLIKELY(SvGMAGICAL(sv))) {
606 PERL_STATIC_INLINE bool
607 Perl_SvTRUE(pTHX_ SV *sv)
609 PERL_ARGS_ASSERT_SVTRUE;
611 if (UNLIKELY(sv == NULL))
614 return SvTRUE_nomg_NN(sv);
617 PERL_STATIC_INLINE bool
618 Perl_SvTRUE_nomg(pTHX_ SV *sv)
620 PERL_ARGS_ASSERT_SVTRUE_NOMG;
622 if (UNLIKELY(sv == NULL))
624 return SvTRUE_nomg_NN(sv);
627 PERL_STATIC_INLINE bool
628 Perl_SvTRUE_NN(pTHX_ SV *sv)
630 PERL_ARGS_ASSERT_SVTRUE_NN;
633 return SvTRUE_nomg_NN(sv);
636 PERL_STATIC_INLINE bool
637 Perl_SvTRUE_common(pTHX_ SV * sv, const bool sv_2bool_is_fallback)
639 PERL_ARGS_ASSERT_SVTRUE_COMMON;
641 if (UNLIKELY(SvIMMORTAL_INTERP(sv)))
642 return SvIMMORTAL_TRUE(sv);
648 return SvPVXtrue(sv);
651 return SvIVX(sv) != 0; /* casts to bool */
653 if (SvROK(sv) && !(SvOBJECT(SvRV(sv)) && HvAMAGIC(SvSTASH(SvRV(sv)))))
656 if (sv_2bool_is_fallback)
657 return sv_2bool_nomg(sv);
659 return isGV_with_GP(sv);
662 PERL_STATIC_INLINE SV *
663 Perl_SvREFCNT_inc(SV *sv)
665 if (LIKELY(sv != NULL))
670 PERL_STATIC_INLINE SV *
671 Perl_SvREFCNT_inc_NN(SV *sv)
673 PERL_ARGS_ASSERT_SVREFCNT_INC_NN;
679 PERL_STATIC_INLINE void
680 Perl_SvREFCNT_inc_void(SV *sv)
682 if (LIKELY(sv != NULL))
686 PERL_STATIC_INLINE void
687 Perl_SvREFCNT_dec(pTHX_ SV *sv)
689 if (LIKELY(sv != NULL)) {
690 U32 rc = SvREFCNT(sv);
692 SvREFCNT(sv) = rc - 1;
694 Perl_sv_free2(aTHX_ sv, rc);
698 PERL_STATIC_INLINE SV *
699 Perl_SvREFCNT_dec_ret_NULL(pTHX_ SV *sv)
701 PERL_ARGS_ASSERT_SVREFCNT_DEC_RET_NULL;
702 Perl_SvREFCNT_dec(aTHX_ sv);
707 PERL_STATIC_INLINE void
708 Perl_SvREFCNT_dec_NN(pTHX_ SV *sv)
710 U32 rc = SvREFCNT(sv);
712 PERL_ARGS_ASSERT_SVREFCNT_DEC_NN;
715 SvREFCNT(sv) = rc - 1;
717 Perl_sv_free2(aTHX_ sv, rc);
721 =for apidoc SvAMAGIC_on
723 Indicate that C<sv> has overloading (active magic) enabled.
728 PERL_STATIC_INLINE void
729 Perl_SvAMAGIC_on(SV *sv)
731 PERL_ARGS_ASSERT_SVAMAGIC_ON;
734 if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
738 =for apidoc SvAMAGIC_off
740 Indicate that C<sv> has overloading (active magic) disabled.
745 PERL_STATIC_INLINE void
746 Perl_SvAMAGIC_off(SV *sv)
748 PERL_ARGS_ASSERT_SVAMAGIC_OFF;
750 if (SvROK(sv) && SvOBJECT(SvRV(sv)))
751 HvAMAGIC_off(SvSTASH(SvRV(sv)));
754 PERL_STATIC_INLINE U32
755 Perl_SvPADSTALE_on(SV *sv)
757 assert(!(SvFLAGS(sv) & SVs_PADTMP));
758 return SvFLAGS(sv) |= SVs_PADSTALE;
760 PERL_STATIC_INLINE U32
761 Perl_SvPADSTALE_off(SV *sv)
763 assert(!(SvFLAGS(sv) & SVs_PADTMP));
764 return SvFLAGS(sv) &= ~SVs_PADSTALE;
768 =for apidoc_section $SV
770 =for apidoc_item SvIV_nomg
771 =for apidoc_item SvIVx
773 These each coerce the given SV to IV and return it. The returned value in many
774 circumstances will get stored in C<sv>'s IV slot, but not in all cases. (Use
775 C<L</sv_setiv>> to make sure it does).
777 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
779 C<SvIVx> is now identical to C<SvIV>, but prior to 5.37.1, it was the only form
780 guaranteed to evaluate C<sv> only once.
782 C<SvIV_nomg> is the same as C<SvIV>, but does not perform 'get' magic.
785 =for apidoc_item SvNV_nomg
786 =for apidoc_item SvNVx
788 These each coerce the given SV to NV and return it. The returned value in many
789 circumstances will get stored in C<sv>'s NV slot, but not in all cases. (Use
790 C<L</sv_setnv>> to make sure it does).
792 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
794 C<SvNVx> is now identical to C<SvNV>, but prior to 5.37.1, it was the only form
795 guaranteed to evaluate C<sv> only once.
797 C<SvNV_nomg> is the same as C<SvNV>, but does not perform 'get' magic.
800 =for apidoc_item SvUV_nomg
801 =for apidoc_item SvUVx
803 These each coerce the given SV to UV and return it. The returned value in many
804 circumstances will get stored in C<sv>'s UV slot, but not in all cases. (Use
805 C<L</sv_setuv>> to make sure it does).
807 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
809 C<SvUVx> is now identical to C<SvUV>, but prior to 5.37.1, it was the only form
810 guaranteed to evaluate C<sv> only once.
815 PERL_STATIC_INLINE IV
816 Perl_SvIV(pTHX_ SV *sv) {
817 PERL_ARGS_ASSERT_SVIV;
824 PERL_STATIC_INLINE UV
825 Perl_SvUV(pTHX_ SV *sv) {
826 PERL_ARGS_ASSERT_SVUV;
833 PERL_STATIC_INLINE NV
834 Perl_SvNV(pTHX_ SV *sv) {
835 PERL_ARGS_ASSERT_SVNV;
842 PERL_STATIC_INLINE IV
843 Perl_SvIV_nomg(pTHX_ SV *sv) {
844 PERL_ARGS_ASSERT_SVIV_NOMG;
848 return sv_2iv_flags(sv, 0);
851 PERL_STATIC_INLINE UV
852 Perl_SvUV_nomg(pTHX_ SV *sv) {
853 PERL_ARGS_ASSERT_SVUV_NOMG;
857 return sv_2uv_flags(sv, 0);
860 PERL_STATIC_INLINE NV
861 Perl_SvNV_nomg(pTHX_ SV *sv) {
862 PERL_ARGS_ASSERT_SVNV_NOMG;
866 return sv_2nv_flags(sv, 0);
869 #if defined(PERL_CORE) || defined (PERL_EXT)
870 PERL_STATIC_INLINE STRLEN
871 S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
873 PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B;
875 U8 *hopped = utf8_hop((U8 *)pv, pos);
876 if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
877 return (STRLEN)(hopped - (U8 *)pv);
879 return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
883 PERL_STATIC_INLINE char *
884 Perl_sv_pvutf8n_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy)
886 /* This is just so can be passed to Perl_SvPV_helper() as a function
887 * pointer with the same signature as all the other such pointers, and
888 * having hence an unused parameter */
889 PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE_WRAPPER;
890 PERL_UNUSED_ARG(dummy);
892 return sv_pvutf8n_force(sv, lp);
895 PERL_STATIC_INLINE char *
896 Perl_sv_pvbyten_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy)
898 /* This is just so can be passed to Perl_SvPV_helper() as a function
899 * pointer with the same signature as all the other such pointers, and
900 * having hence an unused parameter */
901 PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE_WRAPPER;
902 PERL_UNUSED_ARG(dummy);
904 return sv_pvbyten_force(sv, lp);
907 PERL_STATIC_INLINE char *
908 Perl_SvPV_helper(pTHX_
912 const PL_SvPVtype type,
913 char * (*non_trivial)(pTHX_ SV *, STRLEN * const, const U32),
915 const U32 return_flags
918 /* 'type' should be known at compile time, so this is reduced to a single
919 * conditional at runtime */
920 if ( (type == SvPVbyte_type_ && SvPOK_byte_nog(sv))
921 || (type == SvPVforce_type_ && SvPOK_pure_nogthink(sv))
922 || (type == SvPVutf8_type_ && SvPOK_utf8_nog(sv))
923 || (type == SvPVnormal_type_ && SvPOK_nog(sv))
924 || (type == SvPVutf8_pure_type_ && SvPOK_utf8_pure_nogthink(sv))
925 || (type == SvPVbyte_pure_type_ && SvPOK_byte_pure_nogthink(sv))
931 /* Similarly 'return_flags is known at compile time, so this becomes
933 if (return_flags & SV_MUTABLE_RETURN) {
934 return SvPVX_mutable(sv);
936 else if(return_flags & SV_CONST_RETURN) {
937 return (char *) SvPVX_const(sv);
944 if (or_null) { /* This is also known at compile time */
945 if (flags & SV_GMAGIC) { /* As is this */
950 if (lp) { /* As is this */
958 /* Can't trivially handle this, call the function */
959 return non_trivial(aTHX_ sv, lp, (flags|return_flags));
963 =for apidoc newRV_noinc
965 Creates an RV wrapper for an SV. The reference count for the original
966 SV is B<not> incremented.
971 PERL_STATIC_INLINE SV *
972 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
974 SV *sv = newSV_type(SVt_IV);
976 PERL_ARGS_ASSERT_NEWRV_NOINC;
980 /* inlined, simplified sv_setrv_noinc(sv, tmpRef); */
981 SvRV_set(sv, tmpRef);
987 PERL_STATIC_INLINE char *
988 Perl_sv_setpv_freshbuf(pTHX_ SV *const sv)
990 PERL_ARGS_ASSERT_SV_SETPV_FRESHBUF;
991 assert(SvTYPE(sv) >= SVt_PV);
992 assert(SvTYPE(sv) <= SVt_PVMG);
993 assert(!SvTHINKFIRST(sv));
997 (void)SvPOK_only_UTF8(sv);
1003 * ex: set ts=8 sts=4 sw=4 et: