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 : 4; /* 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);
158 /* With -DPURFIY we allocate everything directly, and don't use arenas.
159 This seems a rather elegant way to simplify some of the code below. */
160 #define HASARENA FALSE
162 #define HASARENA TRUE
164 #define NOARENA FALSE
166 /* Size the arenas to exactly fit a given number of bodies. A count
167 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
168 simplifying the default. If count > 0, the arena is sized to fit
169 only that many bodies, allowing arenas to be used for large, rare
170 bodies (XPVFM, XPVIO) without undue waste. The arena size is
171 limited by PERL_ARENA_SIZE, so we can safely oversize the
174 #define FIT_ARENA0(body_size) \
175 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
176 #define FIT_ARENAn(count,body_size) \
177 ( count * body_size <= PERL_ARENA_SIZE) \
178 ? count * body_size \
179 : FIT_ARENA0 (body_size)
180 #define FIT_ARENA(count,body_size) \
182 ? FIT_ARENAn (count, body_size) \
183 : FIT_ARENA0 (body_size))
185 /* Calculate the length to copy. Specifically work out the length less any
186 final padding the compiler needed to add. See the comment in sv_upgrade
187 for why copying the padding proved to be a bug. */
189 #define copy_length(type, last_member) \
190 STRUCT_OFFSET(type, last_member) \
191 + sizeof (((type*)SvANY((const SV *)0))->last_member)
193 static const struct body_details bodies_by_type[] = {
194 /* HEs use this offset for their arena. */
195 { 0, 0, 0, SVt_NULL, FALSE, NONV, NOARENA, 0 },
197 /* IVs are in the head, so the allocation size is 0. */
199 sizeof(IV), /* This is used to copy out the IV body. */
200 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
201 NOARENA /* IVS don't need an arena */, 0
206 STRUCT_OFFSET(XPVNV, xnv_u),
207 SVt_NV, FALSE, HADNV, NOARENA, 0 },
209 { sizeof(NV), sizeof(NV),
210 STRUCT_OFFSET(XPVNV, xnv_u),
211 SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) },
214 { sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur),
215 copy_length(XPV, xpv_len) - STRUCT_OFFSET(XPV, xpv_cur),
216 + STRUCT_OFFSET(XPV, xpv_cur),
217 SVt_PV, FALSE, NONV, HASARENA,
218 FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
220 { sizeof(XINVLIST) - STRUCT_OFFSET(XPV, xpv_cur),
221 copy_length(XINVLIST, is_offset) - STRUCT_OFFSET(XPV, xpv_cur),
222 + STRUCT_OFFSET(XPV, xpv_cur),
223 SVt_INVLIST, TRUE, NONV, HASARENA,
224 FIT_ARENA(0, sizeof(XINVLIST) - STRUCT_OFFSET(XPV, xpv_cur)) },
226 { sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur),
227 copy_length(XPVIV, xiv_u) - STRUCT_OFFSET(XPV, xpv_cur),
228 + STRUCT_OFFSET(XPV, xpv_cur),
229 SVt_PVIV, FALSE, NONV, HASARENA,
230 FIT_ARENA(0, sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur)) },
232 { sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur),
233 copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
234 + STRUCT_OFFSET(XPV, xpv_cur),
235 SVt_PVNV, FALSE, HADNV, HASARENA,
236 FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
238 { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,
239 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
241 { sizeof(ALIGNED_TYPE_NAME(regexp)),
244 SVt_REGEXP, TRUE, NONV, HASARENA,
245 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(regexp)))
248 { sizeof(ALIGNED_TYPE_NAME(XPVGV)), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
249 HASARENA, FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVGV))) },
251 { sizeof(ALIGNED_TYPE_NAME(XPVLV)), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
252 HASARENA, FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVLV))) },
254 { sizeof(ALIGNED_TYPE_NAME(XPVAV)),
255 copy_length(XPVAV, xav_alloc),
257 SVt_PVAV, TRUE, NONV, HASARENA,
258 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVAV))) },
260 { sizeof(ALIGNED_TYPE_NAME(XPVHV)),
261 copy_length(XPVHV, xhv_max),
263 SVt_PVHV, TRUE, NONV, HASARENA,
264 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVHV))) },
266 { sizeof(ALIGNED_TYPE_NAME(XPVCV)),
269 SVt_PVCV, TRUE, NONV, HASARENA,
270 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVCV))) },
272 { sizeof(ALIGNED_TYPE_NAME(XPVFM)),
275 SVt_PVFM, TRUE, NONV, NOARENA,
276 FIT_ARENA(20, sizeof(ALIGNED_TYPE_NAME(XPVFM))) },
278 { sizeof(ALIGNED_TYPE_NAME(XPVIO)),
281 SVt_PVIO, TRUE, NONV, HASARENA,
282 FIT_ARENA(24, sizeof(ALIGNED_TYPE_NAME(XPVIO))) },
285 #define new_body_allocated(sv_type) \
286 (void *)((char *)S_new_body(aTHX_ sv_type) \
287 - bodies_by_type[sv_type].offset)
290 #if !(NVSIZE <= IVSIZE)
291 # define new_XNV() safemalloc(sizeof(XPVNV))
293 #define new_XPVNV() safemalloc(sizeof(XPVNV))
294 #define new_XPVMG() safemalloc(sizeof(XPVMG))
296 #define del_body_by_type(p, type) safefree(p)
300 #if !(NVSIZE <= IVSIZE)
301 # define new_XNV() new_body_allocated(SVt_NV)
303 #define new_XPVNV() new_body_allocated(SVt_PVNV)
304 #define new_XPVMG() new_body_allocated(SVt_PVMG)
306 #define del_body_by_type(p, type) \
307 del_body(p + bodies_by_type[(type)].offset, \
308 &PL_body_roots[(type)])
312 /* no arena for you! */
314 #define new_NOARENA(details) \
315 safemalloc((details)->body_size + (details)->offset)
316 #define new_NOARENAZ(details) \
317 safecalloc((details)->body_size + (details)->offset, 1)
321 /* grab a new thing from the arena's free list, allocating more if necessary. */
322 #define new_body_from_arena(xpv, root_index, type_meta) \
324 void ** const r3wt = &PL_body_roots[root_index]; \
325 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
326 ? *((void **)(r3wt)) : Perl_more_bodies(aTHX_ root_index, \
327 type_meta.body_size,\
328 type_meta.arena_size)); \
329 *(r3wt) = *(void**)(xpv); \
332 PERL_STATIC_INLINE void *
333 S_new_body(pTHX_ const svtype sv_type)
336 new_body_from_arena(xpv, sv_type, bodies_by_type[sv_type]);
342 static const struct body_details fake_rv =
343 { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
345 static const struct body_details fake_hv_with_aux =
346 /* The SVt_IV arena is used for (larger) PVHV bodies. */
347 { sizeof(ALIGNED_TYPE_NAME(XPVHV_WITH_AUX)),
348 copy_length(XPVHV, xhv_max),
350 SVt_PVHV, TRUE, NONV, HASARENA,
351 FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVHV_WITH_AUX))) };
354 =for apidoc newSV_type
356 Creates a new SV, of the type specified. The reference count for the new SV
362 PERL_STATIC_INLINE SV *
363 Perl_newSV_type(pTHX_ const svtype type)
367 const struct body_details *type_details;
371 type_details = bodies_by_type + type;
373 SvFLAGS(sv) &= ~SVTYPEMASK;
380 SET_SVANY_FOR_BODYLESS_IV(sv);
385 SET_SVANY_FOR_BODYLESS_NV(sv);
387 SvANY(sv) = new_XNV();
393 assert(type_details->body_size);
396 assert(type_details->arena);
397 assert(type_details->arena_size);
398 /* This points to the start of the allocated area. */
399 new_body = S_new_body(aTHX_ type);
400 /* xpvav and xpvhv have no offset, so no need to adjust new_body */
401 assert(!(type_details->offset));
403 /* We always allocated the full length item with PURIFY. To do this
404 we fake things so that arena is false for all 16 types.. */
405 new_body = new_NOARENAZ(type_details);
407 SvANY(sv) = new_body;
409 SvSTASH_set(sv, NULL);
410 SvMAGIC_set(sv, NULL);
412 if (type == SVt_PVAV) {
420 /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
421 HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX;
425 #ifndef NODEFAULT_SHAREKEYS
426 HvSHAREKEYS_on(sv); /* key-sharing on by default */
428 /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
429 HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX;
432 sv->sv_u.svu_array = NULL; /* or svu_hash */
445 /* For a type known at compile time, it should be possible for the
446 * compiler to deduce the value of (type_details->arena), resolve
447 * that branch below, and inline the relevant values from
448 * bodies_by_type. Except, at least for gcc, it seems not to do that.
449 * We help it out here with two deviations from sv_upgrade:
450 * (1) Minor rearrangement here, so that PVFM - the only type at this
451 * point not to be allocated from an array appears last, not PV.
452 * (2) The ASSUME() statement here for everything that isn't PVFM.
453 * Obviously this all only holds as long as it's a true reflection of
454 * the bodies_by_type lookup table. */
456 ASSUME(type_details->arena);
461 assert(type_details->body_size);
462 /* We always allocated the full length item with PURIFY. To do this
463 we fake things so that arena is false for all 16 types.. */
465 if(type_details->arena) {
466 /* This points to the start of the allocated area. */
467 new_body = S_new_body(aTHX_ type);
468 Zero(new_body, type_details->body_size, char);
469 new_body = ((char *)new_body) - type_details->offset;
473 new_body = new_NOARENAZ(type_details);
475 SvANY(sv) = new_body;
477 if (UNLIKELY(type == SVt_PVIO)) {
478 IO * const io = MUTABLE_IO(sv);
479 GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
482 /* Clear the stashcache because a new IO could overrule a package
484 DEBUG_o(Perl_deb(aTHX_ "sv_upgrade clearing PL_stashcache\n"));
485 hv_clear(PL_stashcache);
487 SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
491 sv->sv_u.svu_rv = NULL;
494 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
495 (unsigned long)type);
502 =for apidoc newSV_type_mortal
504 Creates a new mortal SV, of the type specified. The reference count for the
507 This is equivalent to
508 SV* sv = sv_2mortal(newSV_type(<some type>))
510 SV* sv = sv_newmortal();
511 sv_upgrade(sv, <some_type>)
512 but should be more efficient than both of them. (Unless sv_2mortal is inlined
513 at some point in the future.)
518 PERL_STATIC_INLINE SV *
519 Perl_newSV_type_mortal(pTHX_ const svtype type)
521 SV *sv = newSV_type(type);
522 SSize_t ix = ++PL_tmps_ix;
523 if (UNLIKELY(ix >= PL_tmps_max))
524 ix = Perl_tmps_grow_p(aTHX_ ix);
525 PL_tmps_stack[ix] = (sv);
530 /* The following functions started out in sv.h and then moved to inline.h. They
531 * moved again into this file during the 5.37.x development cycle. */
534 =for apidoc_section $SV
535 =for apidoc SvPVXtrue
537 Returns a boolean as to whether or not C<sv> contains a PV that is considered
538 TRUE. FALSE is returned if C<sv> doesn't contain a PV, or if the PV it does
539 contain is zero length, or consists of just the single character '0'. Every
540 other PV value is considered TRUE.
542 As of Perl v5.37.1, C<sv> is evaluated exactly once; in earlier releases, it
543 could be evaluated more than once.
548 PERL_STATIC_INLINE bool
549 Perl_SvPVXtrue(pTHX_ SV *sv)
551 PERL_ARGS_ASSERT_SVPVXTRUE;
553 if (! (XPV *) SvANY(sv)) {
557 if ( ((XPV *) SvANY(sv))->xpv_cur > 1) { /* length > 1 */
561 if (( (XPV *) SvANY(sv))->xpv_cur == 0) {
565 return *sv->sv_u.svu_pv != '0';
569 =for apidoc SvGETMAGIC
570 Invokes C<L</mg_get>> on an SV if it has 'get' magic. For example, this
571 will call C<FETCH> on a tied variable. As of 5.37.1, this function is
572 guaranteed to evaluate its argument exactly once.
577 PERL_STATIC_INLINE void
578 Perl_SvGETMAGIC(pTHX_ SV *sv)
580 PERL_ARGS_ASSERT_SVGETMAGIC;
582 if (UNLIKELY(SvGMAGICAL(sv))) {
587 PERL_STATIC_INLINE bool
588 Perl_SvTRUE(pTHX_ SV *sv)
590 PERL_ARGS_ASSERT_SVTRUE;
592 if (UNLIKELY(sv == NULL))
595 return SvTRUE_nomg_NN(sv);
598 PERL_STATIC_INLINE bool
599 Perl_SvTRUE_nomg(pTHX_ SV *sv)
601 PERL_ARGS_ASSERT_SVTRUE_NOMG;
603 if (UNLIKELY(sv == NULL))
605 return SvTRUE_nomg_NN(sv);
608 PERL_STATIC_INLINE bool
609 Perl_SvTRUE_NN(pTHX_ SV *sv)
611 PERL_ARGS_ASSERT_SVTRUE_NN;
614 return SvTRUE_nomg_NN(sv);
617 PERL_STATIC_INLINE bool
618 Perl_SvTRUE_common(pTHX_ SV * sv, const bool sv_2bool_is_fallback)
620 PERL_ARGS_ASSERT_SVTRUE_COMMON;
622 if (UNLIKELY(SvIMMORTAL_INTERP(sv)))
623 return SvIMMORTAL_TRUE(sv);
629 return SvPVXtrue(sv);
632 return SvIVX(sv) != 0; /* casts to bool */
634 if (SvROK(sv) && !(SvOBJECT(SvRV(sv)) && HvAMAGIC(SvSTASH(SvRV(sv)))))
637 if (sv_2bool_is_fallback)
638 return sv_2bool_nomg(sv);
640 return isGV_with_GP(sv);
643 PERL_STATIC_INLINE SV *
644 Perl_SvREFCNT_inc(SV *sv)
646 if (LIKELY(sv != NULL))
650 PERL_STATIC_INLINE SV *
651 Perl_SvREFCNT_inc_NN(SV *sv)
653 PERL_ARGS_ASSERT_SVREFCNT_INC_NN;
658 PERL_STATIC_INLINE void
659 Perl_SvREFCNT_inc_void(SV *sv)
661 if (LIKELY(sv != NULL))
664 PERL_STATIC_INLINE void
665 Perl_SvREFCNT_dec(pTHX_ SV *sv)
667 if (LIKELY(sv != NULL)) {
668 U32 rc = SvREFCNT(sv);
670 SvREFCNT(sv) = rc - 1;
672 Perl_sv_free2(aTHX_ sv, rc);
676 PERL_STATIC_INLINE void
677 Perl_SvREFCNT_dec_NN(pTHX_ SV *sv)
679 U32 rc = SvREFCNT(sv);
681 PERL_ARGS_ASSERT_SVREFCNT_DEC_NN;
684 SvREFCNT(sv) = rc - 1;
686 Perl_sv_free2(aTHX_ sv, rc);
690 =for apidoc SvAMAGIC_on
692 Indicate that C<sv> has overloading (active magic) enabled.
697 PERL_STATIC_INLINE void
698 Perl_SvAMAGIC_on(SV *sv)
700 PERL_ARGS_ASSERT_SVAMAGIC_ON;
703 if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
707 =for apidoc SvAMAGIC_off
709 Indicate that C<sv> has overloading (active magic) disabled.
714 PERL_STATIC_INLINE void
715 Perl_SvAMAGIC_off(SV *sv)
717 PERL_ARGS_ASSERT_SVAMAGIC_OFF;
719 if (SvROK(sv) && SvOBJECT(SvRV(sv)))
720 HvAMAGIC_off(SvSTASH(SvRV(sv)));
723 PERL_STATIC_INLINE U32
724 Perl_SvPADSTALE_on(SV *sv)
726 assert(!(SvFLAGS(sv) & SVs_PADTMP));
727 return SvFLAGS(sv) |= SVs_PADSTALE;
729 PERL_STATIC_INLINE U32
730 Perl_SvPADSTALE_off(SV *sv)
732 assert(!(SvFLAGS(sv) & SVs_PADTMP));
733 return SvFLAGS(sv) &= ~SVs_PADSTALE;
737 =for apidoc_section $SV
739 =for apidoc_item SvIV_nomg
740 =for apidoc_item SvIVx
742 These each coerce the given SV to IV and return it. The returned value in many
743 circumstances will get stored in C<sv>'s IV slot, but not in all cases. (Use
744 C<L</sv_setiv>> to make sure it does).
746 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
748 C<SvIVx> is now identical to C<SvIV>, but prior to 5.37.1, it was the only form
749 guaranteed to evaluate C<sv> only once.
751 C<SvIV_nomg> is the same as C<SvIV>, but does not perform 'get' magic.
754 =for apidoc_item SvNV_nomg
755 =for apidoc_item SvNVx
757 These each coerce the given SV to NV and return it. The returned value in many
758 circumstances will get stored in C<sv>'s NV slot, but not in all cases. (Use
759 C<L</sv_setnv>> to make sure it does).
761 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
763 C<SvNVx> is now identical to C<SvNV>, but prior to 5.37.1, it was the only form
764 guaranteed to evaluate C<sv> only once.
766 C<SvNV_nomg> is the same as C<SvNV>, but does not perform 'get' magic.
769 =for apidoc_item SvUV_nomg
770 =for apidoc_item SvUVx
772 These each coerce the given SV to UV and return it. The returned value in many
773 circumstances will get stored in C<sv>'s UV slot, but not in all cases. (Use
774 C<L</sv_setuv>> to make sure it does).
776 As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
778 C<SvUVx> is now identical to C<SvUV>, but prior to 5.37.1, it was the only form
779 guaranteed to evaluate C<sv> only once.
784 PERL_STATIC_INLINE IV
785 Perl_SvIV(pTHX_ SV *sv) {
786 PERL_ARGS_ASSERT_SVIV;
793 PERL_STATIC_INLINE UV
794 Perl_SvUV(pTHX_ SV *sv) {
795 PERL_ARGS_ASSERT_SVUV;
802 PERL_STATIC_INLINE NV
803 Perl_SvNV(pTHX_ SV *sv) {
804 PERL_ARGS_ASSERT_SVNV;
811 PERL_STATIC_INLINE IV
812 Perl_SvIV_nomg(pTHX_ SV *sv) {
813 PERL_ARGS_ASSERT_SVIV_NOMG;
817 return sv_2iv_flags(sv, 0);
820 PERL_STATIC_INLINE UV
821 Perl_SvUV_nomg(pTHX_ SV *sv) {
822 PERL_ARGS_ASSERT_SVUV_NOMG;
826 return sv_2uv_flags(sv, 0);
829 PERL_STATIC_INLINE NV
830 Perl_SvNV_nomg(pTHX_ SV *sv) {
831 PERL_ARGS_ASSERT_SVNV_NOMG;
835 return sv_2nv_flags(sv, 0);
838 #if defined(PERL_CORE) || defined (PERL_EXT)
839 PERL_STATIC_INLINE STRLEN
840 S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
842 PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B;
844 U8 *hopped = utf8_hop((U8 *)pv, pos);
845 if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
846 return (STRLEN)(hopped - (U8 *)pv);
848 return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
852 PERL_STATIC_INLINE char *
853 Perl_sv_pvutf8n_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy)
855 /* This is just so can be passed to Perl_SvPV_helper() as a function
856 * pointer with the same signature as all the other such pointers, and
857 * having hence an unused parameter */
858 PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE_WRAPPER;
859 PERL_UNUSED_ARG(dummy);
861 return sv_pvutf8n_force(sv, lp);
864 PERL_STATIC_INLINE char *
865 Perl_sv_pvbyten_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy)
867 /* This is just so can be passed to Perl_SvPV_helper() as a function
868 * pointer with the same signature as all the other such pointers, and
869 * having hence an unused parameter */
870 PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE_WRAPPER;
871 PERL_UNUSED_ARG(dummy);
873 return sv_pvbyten_force(sv, lp);
876 PERL_STATIC_INLINE char *
877 Perl_SvPV_helper(pTHX_
881 const PL_SvPVtype type,
882 char * (*non_trivial)(pTHX_ SV *, STRLEN * const, const U32),
884 const U32 return_flags
887 /* 'type' should be known at compile time, so this is reduced to a single
888 * conditional at runtime */
889 if ( (type == SvPVbyte_type_ && SvPOK_byte_nog(sv))
890 || (type == SvPVforce_type_ && SvPOK_pure_nogthink(sv))
891 || (type == SvPVutf8_type_ && SvPOK_utf8_nog(sv))
892 || (type == SvPVnormal_type_ && SvPOK_nog(sv))
893 || (type == SvPVutf8_pure_type_ && SvPOK_utf8_pure_nogthink(sv))
894 || (type == SvPVbyte_pure_type_ && SvPOK_byte_pure_nogthink(sv))
900 /* Similarly 'return_flags is known at compile time, so this becomes
902 if (return_flags & SV_MUTABLE_RETURN) {
903 return SvPVX_mutable(sv);
905 else if(return_flags & SV_CONST_RETURN) {
906 return (char *) SvPVX_const(sv);
913 if (or_null) { /* This is also known at compile time */
914 if (flags & SV_GMAGIC) { /* As is this */
919 if (lp) { /* As is this */
927 /* Can't trivially handle this, call the function */
928 return non_trivial(aTHX_ sv, lp, (flags|return_flags));
932 =for apidoc newRV_noinc
934 Creates an RV wrapper for an SV. The reference count for the original
935 SV is B<not> incremented.
940 PERL_STATIC_INLINE SV *
941 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
943 SV *sv = newSV_type(SVt_IV);
945 PERL_ARGS_ASSERT_NEWRV_NOINC;
949 /* inlined, simplified sv_setrv_noinc(sv, tmpRef); */
950 SvRV_set(sv, tmpRef);
957 * ex: set ts=8 sts=4 sw=4 et: