X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/3f2f854a8971dad2da7193c73a1a3d2bdc3085d4..47e6c6d93f57c4fc8d67fee6635d33d3bf768674:/sv.h diff --git a/sv.h b/sv.h index ffeac41..2ad0a5c 100644 --- a/sv.h +++ b/sv.h @@ -13,9 +13,9 @@ #endif /* -=head1 SV Flags +=for apidoc_section $SV_flags -=for apidoc AmnU||svtype +=for apidoc Ay||svtype An enum of flags for Perl types. These are found in the file F in the C enum. Test these flags with the C macro. @@ -149,6 +149,9 @@ typedef enum { SVt_PVCV, /* 13 */ SVt_PVFM, /* 14 */ SVt_PVIO, /* 15 */ + /* 16-31: Unused, though one should be reserved for a + * freed sv, if the other 3 bits below the flags ones + * get allocated */ SVt_LAST /* keep last in enum. used to size arrays */ } svtype; @@ -157,10 +160,10 @@ typedef enum { * tables are in perl.h. There are also two affected names tables in dump.c, * one in B.xs, and 'bodies_by_type[]' in sv.c. * - * The bits that match 0xf0 are CURRENTLY UNUSED, except that 0xFF means a - * freed SV. The bits above that are for flags, like SVf_IOK */ + * The bits that match 0xe0 are CURRENTLY UNUSED + * The bits above that are for flags, like SVf_IOK */ -#define SVt_MASK 0xf /* smallest bitmask that covers all types */ +#define SVt_MASK 0x1f /* smallest bitmask that covers all types */ #ifndef PERL_CORE /* Fast Boyer Moore tables are now stored in magic attached to PVMGs */ @@ -262,11 +265,16 @@ struct p5rx { _SV_HEAD_UNION; }; +struct invlist { + _SV_HEAD(XINVLIST*); /* pointer to xpvinvlist body */ + _SV_HEAD_UNION; +}; + #undef _SV_HEAD #undef _SV_HEAD_UNION /* ensure no pollution */ /* -=head1 SV Manipulation Functions +=for apidoc_section $SV =for apidoc Am|U32|SvREFCNT|SV* sv Returns the value of the object's reference count. Exposed @@ -429,7 +437,7 @@ perform the upgrade if necessary. See C>. #define PRIVSHIFT 4 /* (SVp_?OK >> PRIVSHIFT) == SVf_?OK */ -/* SVf_AMAGIC means that the stash *may* have have overload methods. It's +/* SVf_AMAGIC means that the stash *may* have overload methods. It's * set each time a function is compiled into a stash, and is reset by the * overload code when called for the first time and finds that there are * no overload methods. Note that this used to be set on the object; but @@ -699,12 +707,12 @@ Tells an SV that it is an unsigned integer and disables all other C bits. =for apidoc Am|bool|SvIOK_UV|SV* sv Returns a boolean indicating whether the SV contains an integer that must be interpreted as unsigned. A non-negative integer whose value is within the -range of both an IV and a UV may be be flagged as either C or C. +range of both an IV and a UV may be flagged as either C or C. =for apidoc Am|bool|SvUOK|SV* sv Returns a boolean indicating whether the SV contains an integer that must be interpreted as unsigned. A non-negative integer whose value is within the -range of both an IV and a UV may be be flagged as either C or C. +range of both an IV and a UV may be flagged as either C or C. =for apidoc Am|bool|SvIOK_notUV|SV* sv Returns a boolean indicating whether the SV contains a signed integer. @@ -821,8 +829,8 @@ Remember to free the previous PV buffer. There are many things to check. Beware that the existing pointer may be involved in copy-on-write or other mischief, so do C and use C or C (or check the C flag) first to make sure this -modification is safe. Then finally, if it is not a COW, call C to -free the previous PV buffer. +modification is safe. Then finally, if it is not a COW, call +C> to free the previous PV buffer. =for apidoc Am|void|SvUV_set|SV* sv|UV val Set the value of the UV pointer in C to val. See C>. @@ -946,12 +954,28 @@ in gv.h: */ #define SvVOK(sv) (SvMAGICAL(sv) \ && mg_find(sv,PERL_MAGIC_vstring)) -/* returns the vstring magic, if any */ +/* +=for apidoc Am|MAGIC*|SvVSTRING_mg|SV * sv + +Returns the vstring magic, or NULL if none + +=cut +*/ #define SvVSTRING_mg(sv) (SvMAGICAL(sv) \ ? mg_find(sv,PERL_MAGIC_vstring) : NULL) #define SvOOK(sv) (SvFLAGS(sv) & SVf_OOK) #define SvOOK_on(sv) (SvFLAGS(sv) |= SVf_OOK) + + +/* +=for apidoc Am|void|SvOOK_off|SV * sv + +Remove any string offset. + +=cut +*/ + #define SvOOK_off(sv) ((void)(SvOOK(sv) && (sv_backoff(sv),0))) #define SvFAKE(sv) (SvFLAGS(sv) & SVf_FAKE) @@ -1095,7 +1119,7 @@ C does nothing. /* =for apidoc Am|U32|SvREADONLY|SV* sv Returns true if the argument is readonly, otherwise returns false. -Exposed to to perl code via Internals::SvREADONLY(). +Exposed to perl code via Internals::SvREADONLY(). =for apidoc Am|U32|SvREADONLY_on|SV* sv Mark an object as readonly. Exactly what this means depends on the object @@ -1128,7 +1152,7 @@ object type. Exposed to perl code via Internals::SvREADONLY(). #endif -#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +#if defined (DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS) # define SvTAIL(sv) ({ const SV *const _svtail = (const SV *)(sv); \ assert(SvTYPE(_svtail) != SVt_PVAV); \ assert(SvTYPE(_svtail) != SVt_PVHV); \ @@ -1180,7 +1204,7 @@ object type. Exposed to perl code via Internals::SvREADONLY(). # endif # define SvEND(sv) ((sv)->sv_u.svu_pv + ((XPV*)SvANY(sv))->xpv_cur) -# if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +# if defined (DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS) /* These get expanded inside other macros that already use a variable _sv */ # define SvPVX(sv) \ (*({ SV *const _svpvx = MUTABLE_SV(sv); \ @@ -1268,7 +1292,7 @@ object type. Exposed to perl code via Internals::SvREADONLY(). #ifndef PERL_POISON /* Given that these two are new, there can't be any existing code using them - * as LVALUEs */ + * as LVALUEs, so prevent that from happening */ # define SvPVX_mutable(sv) (0 + (sv)->sv_u.svu_pv) # define SvPVX_const(sv) ((const char*)(0 + (sv)->sv_u.svu_pv)) #else @@ -1361,6 +1385,14 @@ object type. Exposed to perl code via Internals::SvREADONLY(). SvPV_renew(sv, _lEnGtH); \ } STMT_END +/* +=for apidoc Am|void|SvPV_free|SV * sv + +Frees the PV buffer in C, leaving things in a precarious state, so should +only be used as part of a larger operation + +=cut +*/ #define SvPV_free(sv) \ STMT_START { \ assert(SvTYPE(sv) >= SVt_PV); \ @@ -1395,7 +1427,7 @@ object type. Exposed to perl code via Internals::SvREADONLY(). # define BmFLAGS(sv) (SvTAIL(sv) ? FBMcf_TAIL : 0) #endif -#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +#if defined (DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS) # define BmUSEFUL(sv) \ (*({ SV *const _bmuseful = MUTABLE_SV(sv); \ assert(SvTYPE(_bmuseful) >= SVt_PVIV); \ @@ -1604,20 +1636,18 @@ false. See C> for a defined/undefined test. Handles 'get' magic unless the scalar is already C, C or C (the public, not the private flags). -See C> for a version which guarantees to evaluate C only once. +As of Perl 5.32, this is guaranteed to evaluate C only once. Prior to that +release, use C> for single evaluation. =for apidoc Am|bool|SvTRUE_nomg|SV* sv Returns a boolean indicating whether Perl would evaluate the SV as true or false. See C> for a defined/undefined test. Does not handle 'get' magic. =for apidoc Am|bool|SvTRUEx|SV* sv -Returns a boolean indicating whether Perl would evaluate the SV as true or -false. See C> for a defined/undefined test. Handles 'get' magic -unless the scalar is already C, C or C (the public, not the -private flags). - -This form guarantees to evaluate C only once. Only use this if C is an -expression with side effects, otherwise use the more efficient C. +Identical to C>. Prior to 5.32, they differed in that only this one +was guaranteed to evaluate C only once; in 5.32 they both evaluated it +once, but C was slightly slower on some platforms; now they are +identical. =for apidoc Am|char*|SvPVutf8_force|SV* sv|STRLEN len Like C, but converts C to UTF-8 first if necessary. @@ -1638,10 +1668,12 @@ Like C, but does not process get magic. Like C, but converts C to UTF-8 first if necessary. =for apidoc Am|char*|SvPVbyte_force|SV* sv|STRLEN len -Like C, but converts C to byte representation first if necessary. +Like C, but converts C to byte representation first if +necessary. If the SV cannot be downgraded from UTF-8, this croaks. =for apidoc Am|char*|SvPVbyte|SV* sv|STRLEN len -Like C, but converts C to byte representation first if necessary. +Like C, but converts C to byte representation first if necessary. If +the SV cannot be downgraded from UTF-8, this croaks. =for apidoc Am|char*|SvPVbyte_nomg|SV* sv|STRLEN len Like C, but does not process get magic. @@ -1653,7 +1685,8 @@ Like C, but when C is undef, returns C. Like C, but does not process get magic. =for apidoc Am|char*|SvPVbyte_nolen|SV* sv -Like C, but converts C to byte representation first if necessary. +Like C, but converts C to byte representation first if +necessary. If the SV cannot be downgraded from UTF-8, this croaks. =for apidoc Am|char*|SvPVutf8x_force|SV* sv|STRLEN len Like C, but converts C to UTF-8 first if necessary. @@ -1668,12 +1701,12 @@ otherwise. =for apidoc Am|char*|SvPVbytex_force|SV* sv|STRLEN len Like C, but converts C to byte representation first if necessary. Guarantees to evaluate C only once; use the more efficient C -otherwise. +otherwise. If the SV cannot be downgraded from UTF-8, this croaks. =for apidoc Am|char*|SvPVbytex|SV* sv|STRLEN len Like C, but converts C to byte representation first if necessary. Guarantees to evaluate C only once; use the more efficient C -otherwise. +otherwise. If the SV cannot be downgraded from UTF-8, this croaks. =for apidoc Am|U32|SvIsCOW|SV* sv Returns a U32 value indicating whether the SV is Copy-On-Write (either shared @@ -1690,9 +1723,6 @@ Like C but doesn't process magic. =for apidoc Am|void|sv_catpv_nomg|SV* sv|const char* ptr Like C but doesn't process magic. -=for apidoc Am|void|sv_setsv_nomg|SV* dsv|SV* ssv -Like C but doesn't process magic. - =for apidoc Am|void|sv_catsv_nomg|SV* dsv|SV* ssv Like C but doesn't process magic. @@ -1705,50 +1735,50 @@ Like C but doesn't process magic. #define SvNV(sv) (SvNOK_nog(sv) ? SvNVX(sv) : sv_2nv(sv)) #define SvIV_nomg(sv) (SvIOK(sv) ? SvIVX(sv) : sv_2iv_flags(sv, 0)) -#define SvUV_nomg(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv_flags(sv, 0)) +#define SvUV_nomg(sv) (SvUOK(sv) ? SvUVX(sv) : sv_2uv_flags(sv, 0)) #define SvNV_nomg(sv) (SvNOK(sv) ? SvNVX(sv) : sv_2nv_flags(sv, 0)) /* ----*/ -#define SvPV(sv, lp) SvPV_flags(sv, lp, SV_GMAGIC) -#define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) -#define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) +#define SvPV(sv, len) SvPV_flags(sv, len, SV_GMAGIC) +#define SvPV_const(sv, len) SvPV_flags_const(sv, len, SV_GMAGIC) +#define SvPV_mutable(sv, len) SvPV_flags_mutable(sv, len, SV_GMAGIC) -#define SvPV_flags(sv, lp, flags) \ +#define SvPV_flags(sv, len, flags) \ (SvPOK_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) -#define SvPV_flags_const(sv, lp, flags) \ + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &len, flags)) +#define SvPV_flags_const(sv, len, flags) \ (SvPOK_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ - (const char*) sv_2pv_flags(sv, &lp, (flags|SV_CONST_RETURN))) + ? ((len = SvCUR(sv)), SvPVX_const(sv)) : \ + (const char*) sv_2pv_flags(sv, &len, (flags|SV_CONST_RETURN))) #define SvPV_flags_const_nolen(sv, flags) \ (SvPOK_nog(sv) \ ? SvPVX_const(sv) : \ (const char*) sv_2pv_flags(sv, 0, (flags|SV_CONST_RETURN))) -#define SvPV_flags_mutable(sv, lp, flags) \ +#define SvPV_flags_mutable(sv, len, flags) \ (SvPOK_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ - sv_2pv_flags(sv, &lp, (flags|SV_MUTABLE_RETURN))) + ? ((len = SvCUR(sv)), SvPVX_mutable(sv)) : \ + sv_2pv_flags(sv, &len, (flags|SV_MUTABLE_RETURN))) -#define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) +#define SvPV_force(sv, len) SvPV_force_flags(sv, len, SV_GMAGIC) #define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) -#define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) +#define SvPV_force_mutable(sv, len) SvPV_force_flags_mutable(sv, len, SV_GMAGIC) -#define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) +#define SvPV_force_nomg(sv, len) SvPV_force_flags(sv, len, 0) #define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) -#define SvPV_force_flags(sv, lp, flags) \ +#define SvPV_force_flags(sv, len, flags) \ (SvPOK_pure_nogthink(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &len, flags)) #define SvPV_force_flags_nolen(sv, flags) \ (SvPOK_pure_nogthink(sv) \ ? SvPVX(sv) : sv_pvn_force_flags(sv, 0, flags)) -#define SvPV_force_flags_mutable(sv, lp, flags) \ +#define SvPV_force_flags_mutable(sv, len, flags) \ (SvPOK_pure_nogthink(sv) \ - ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ - : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) + ? ((len = SvCUR(sv)), SvPVX_mutable(sv)) \ + : sv_pvn_force_flags(sv, &len, flags|SV_MUTABLE_RETURN)) #define SvPV_nolen(sv) \ (SvPOK_nog(sv) \ @@ -1763,33 +1793,33 @@ Like C but doesn't process magic. (SvPOK_nog(sv) \ ? SvPVX_const(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC|SV_CONST_RETURN)) -#define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) -#define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) +#define SvPV_nomg(sv, len) SvPV_flags(sv, len, 0) +#define SvPV_nomg_const(sv, len) SvPV_flags_const(sv, len, 0) #define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) /* ----*/ -#define SvPVutf8(sv, lp) \ +#define SvPVutf8(sv, len) \ (SvPOK_utf8_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &lp)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &len)) -#define SvPVutf8_or_null(sv, lp) \ +#define SvPVutf8_or_null(sv, len) \ (SvPOK_utf8_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \ - ? sv_2pvutf8_flags(sv, &lp, 0) : ((lp = 0), NULL)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \ + ? sv_2pvutf8_flags(sv, &len, 0) : ((len = 0), NULL)) -#define SvPVutf8_nomg(sv, lp) \ +#define SvPVutf8_nomg(sv, len) \ (SvPOK_utf8_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8_flags(sv, &lp, 0)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8_flags(sv, &len, 0)) -#define SvPVutf8_or_null_nomg(sv, lp) \ +#define SvPVutf8_or_null_nomg(sv, len) \ (SvPOK_utf8_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \ - ? sv_2pvutf8_flags(sv, &lp, 0) : ((lp = 0), NULL)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \ + ? sv_2pvutf8_flags(sv, &len, 0) : ((len = 0), NULL)) -#define SvPVutf8_force(sv, lp) \ +#define SvPVutf8_force(sv, len) \ (SvPOK_utf8_pure_nogthink(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &lp)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &len)) #define SvPVutf8_nolen(sv) \ (SvPOK_utf8_nog(sv) \ @@ -1797,27 +1827,27 @@ Like C but doesn't process magic. /* ----*/ -#define SvPVbyte(sv, lp) \ +#define SvPVbyte(sv, len) \ (SvPOK_byte_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &len)) -#define SvPVbyte_or_null(sv, lp) \ +#define SvPVbyte_or_null(sv, len) \ (SvPOK_byte_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \ - ? sv_2pvbyte_flags(sv, &lp, 0) : ((lp = 0), NULL)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \ + ? sv_2pvbyte_flags(sv, &len, 0) : ((len = 0), NULL)) -#define SvPVbyte_nomg(sv, lp) \ +#define SvPVbyte_nomg(sv, len) \ (SvPOK_byte_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte_flags(sv, &lp, 0)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte_flags(sv, &len, 0)) -#define SvPVbyte_or_null_nomg(sv, lp) \ +#define SvPVbyte_or_null_nomg(sv, len) \ (SvPOK_utf8_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \ - ? sv_2pvbyte_flags(sv, &lp, 0) : ((lp = 0), NULL)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \ + ? sv_2pvbyte_flags(sv, &len, 0) : ((len = 0), NULL)) -#define SvPVbyte_force(sv, lp) \ +#define SvPVbyte_force(sv, len) \ (SvPOK_byte_pure_nogthink(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvbyten_force(sv, &lp)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvbyten_force(sv, &len)) #define SvPVbyte_nolen(sv) \ (SvPOK_byte_nog(sv) \ @@ -1829,11 +1859,12 @@ Like C but doesn't process magic. * failing that, call a function to do the work */ -#define SvPVx_force(sv, lp) sv_pvn_force(sv, &lp) -#define SvPVutf8x_force(sv, lp) sv_pvutf8n_force(sv, &lp) -#define SvPVbytex_force(sv, lp) sv_pvbyten_force(sv, &lp) +#define SvPVx_force(sv, len) sv_pvn_force(sv, &len) +#define SvPVutf8x_force(sv, len) sv_pvutf8n_force(sv, &len) +#define SvPVbytex_force(sv, len) sv_pvbyten_force(sv, &len) -#define SvTRUE(sv) (LIKELY(sv) && SvTRUE_NN(sv)) +#define SvTRUE(sv) Perl_SvTRUE(aTHX_ sv) +#define SvTRUEx(sv) SvTRUE(sv) #define SvTRUE_nomg(sv) (LIKELY(sv) && SvTRUE_nomg_NN(sv)) #define SvTRUE_NN(sv) (SvGETMAGIC(sv), SvTRUE_nomg_NN(sv)) #define SvTRUE_nomg_NN(sv) (SvTRUE_common(sv, sv_2bool_nomg(sv))) @@ -1852,19 +1883,18 @@ Like C but doesn't process magic. ? TRUE \ : (fallback)) -#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +#if defined(PERL_USE_GCC_BRACE_GROUPS) # define SvIVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvIV(_sv); }) # define SvUVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvUV(_sv); }) # define SvNVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvNV(_sv); }) -# define SvPVx(sv, lp) ({SV *_sv = (sv); SvPV(_sv, lp); }) -# define SvPVx_const(sv, lp) ({SV *_sv = (sv); SvPV_const(_sv, lp); }) +# define SvPVx(sv, len) ({SV *_sv = (sv); SvPV(_sv, len); }) +# define SvPVx_const(sv, len) ({SV *_sv = (sv); SvPV_const(_sv, len); }) # define SvPVx_nolen(sv) ({SV *_sv = (sv); SvPV_nolen(_sv); }) # define SvPVx_nolen_const(sv) ({SV *_sv = (sv); SvPV_nolen_const(_sv); }) -# define SvPVutf8x(sv, lp) ({SV *_sv = (sv); SvPVutf8(_sv, lp); }) -# define SvPVbytex(sv, lp) ({SV *_sv = (sv); SvPVbyte(_sv, lp); }) +# define SvPVutf8x(sv, len) ({SV *_sv = (sv); SvPVutf8(_sv, len); }) +# define SvPVbytex(sv, len) ({SV *_sv = (sv); SvPVbyte(_sv, len); }) # define SvPVbytex_nolen(sv) ({SV *_sv = (sv); SvPVbyte_nolen(_sv); }) -# define SvTRUEx(sv) ({SV *_sv = (sv); SvTRUE(_sv); }) # define SvTRUEx_nomg(sv) ({SV *_sv = (sv); SvTRUE_nomg(_sv); }) #else /* __GNUC__ */ @@ -1875,14 +1905,13 @@ Like C but doesn't process magic. # define SvIVx(sv) ((PL_Sv = (sv)), SvIV(PL_Sv)) # define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) # define SvNVx(sv) ((PL_Sv = (sv)), SvNV(PL_Sv)) -# define SvPVx(sv, lp) ((PL_Sv = (sv)), SvPV(PL_Sv, lp)) -# define SvPVx_const(sv, lp) ((PL_Sv = (sv)), SvPV_const(PL_Sv, lp)) +# define SvPVx(sv, len) ((PL_Sv = (sv)), SvPV(PL_Sv, len)) +# define SvPVx_const(sv, len) ((PL_Sv = (sv)), SvPV_const(PL_Sv, len)) # define SvPVx_nolen(sv) ((PL_Sv = (sv)), SvPV_nolen(PL_Sv)) # define SvPVx_nolen_const(sv) ((PL_Sv = (sv)), SvPV_nolen_const(PL_Sv)) -# define SvPVutf8x(sv, lp) ((PL_Sv = (sv)), SvPVutf8(PL_Sv, lp)) -# define SvPVbytex(sv, lp) ((PL_Sv = (sv)), SvPVbyte(PL_Sv, lp)) +# define SvPVutf8x(sv, len) ((PL_Sv = (sv)), SvPVutf8(PL_Sv, len)) +# define SvPVbytex(sv, len) ((PL_Sv = (sv)), SvPVbyte(PL_Sv, len)) # define SvPVbytex_nolen(sv) ((PL_Sv = (sv)), SvPVbyte_nolen(PL_Sv)) -# define SvTRUEx(sv) ((PL_Sv = (sv)), SvTRUE(PL_Sv)) # define SvTRUEx_nomg(sv) ((PL_Sv = (sv)), SvTRUE_nomg(PL_Sv)) #endif /* __GNU__ */ @@ -1908,6 +1937,13 @@ Like C but doesn't process magic. /* flag values for sv_*_flags functions */ #define SV_UTF8_NO_ENCODING 0 /* No longer used */ + +/* +=for apidoc AmnhD||SV_UTF8_NO_ENCODING + +=cut +*/ + #define SV_IMMEDIATE_UNREF 1 #define SV_GMAGIC 2 #define SV_COW_DROP_PV 4 @@ -1970,7 +2006,7 @@ Like C but doesn't process magic. && SvCUR(sv)+1 < SvLEN(sv)) /* Note: To allow 256 COW "copies", a refcnt of 0 means 1. */ # define CowREFCNT(sv) (*(U8 *)(SvPVX(sv)+SvLEN(sv)-1)) -# define SV_COW_REFCNT_MAX ((1 << sizeof(U8)*8) - 1) +# define SV_COW_REFCNT_MAX nBIT_UMAX(sizeof(U8) * CHARBITS) # define CAN_COW_MASK (SVf_POK|SVf_ROK|SVp_POK|SVf_FAKE| \ SVf_OOK|SVf_BREAK|SVf_READONLY|SVf_PROTECT) #endif @@ -2001,7 +2037,7 @@ Like C but doesn't process magic. #define sv_catsv_nomg(dsv, ssv) sv_catsv_flags(dsv, ssv, 0) #define sv_catsv_mg(dsv, ssv) sv_catsv_flags(dsv, ssv, SV_GMAGIC|SV_SMAGIC) #define sv_catpvn(dsv, sstr, slen) sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC) -#define sv_catpvn_mg(sv, sstr, slen) sv_catpvn_flags(sv, sstr, slen, SV_GMAGIC|SV_SMAGIC); +#define sv_catpvn_mg(dsv, sstr, slen) sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC|SV_SMAGIC); #define sv_copypv(dsv, ssv) sv_copypv_flags(dsv, ssv, SV_GMAGIC) #define sv_copypv_nomg(dsv, ssv) sv_copypv_flags(dsv, ssv, 0) #define sv_2pv(sv, lp) sv_2pv_flags(sv, lp, SV_GMAGIC) @@ -2019,7 +2055,7 @@ Like C but doesn't process magic. #define sv_eq(sv1, sv2) sv_eq_flags(sv1, sv2, SV_GMAGIC) #define sv_cmp(sv1, sv2) sv_cmp_flags(sv1, sv2, SV_GMAGIC) #define sv_cmp_locale(sv1, sv2) sv_cmp_locale_flags(sv1, sv2, SV_GMAGIC) -#define sv_collxfrm(sv, nxp) sv_cmp_flags(sv, nxp, SV_GMAGIC) +#define sv_collxfrm(sv, nxp) sv_collxfrm_flags(sv, nxp, SV_GMAGIC) #define sv_2bool(sv) sv_2bool_flags(sv, SV_GMAGIC) #define sv_2bool_nomg(sv) sv_2bool_flags(sv, 0) #define sv_insert(bigstr, offset, len, little, littlelen) \ @@ -2069,15 +2105,15 @@ incremented. /* the following macros update any magic values this C is associated with */ /* -=head1 Magical Functions +=for apidoc_section $magic =for apidoc Am|void|SvGETMAGIC|SV* sv -Invokes C on an SV if it has 'get' magic. For example, this +Invokes C> on an SV if it has 'get' magic. For example, this will call C on a tied variable. This macro evaluates its argument more than once. =for apidoc Am|void|SvSETMAGIC|SV* sv -Invokes C on an SV if it has 'set' magic. This is necessary +Invokes C> on an SV if it has 'set' magic. This is necessary after modifying a scalar, in case it is a magical variable like C<$|> or a tied variable (it calls C). This macro evaluates its argument more than once. @@ -2108,7 +2144,7 @@ has been loaded. Releases a mutual exclusion lock on C if a suitable module has been loaded. -=head1 SV Manipulation Functions +=for apidoc_section $SV =for apidoc Am|char *|SvGROW|SV* sv|STRLEN len Expands the character buffer in the SV so that it has room for the @@ -2299,7 +2335,7 @@ Evaluates C more than once. Sets C to 0 if C is false. 10:28 <+meta> Nicholas: crash */ # define SvOOK_offset(sv, offset) STMT_START { \ - assert(sizeof(offset) == sizeof(STRLEN)); \ + STATIC_ASSERT_STMT(sizeof(offset) == sizeof(STRLEN)); \ if (SvOOK(sv)) { \ const U8 *_crash = (U8*)SvPVX_const(sv); \ (offset) = *--_crash; \ @@ -2323,7 +2359,7 @@ Evaluates C more than once. Sets C to 0 if C is false. #else /* This is the same code, but avoids using any temporary variables: */ # define SvOOK_offset(sv, offset) STMT_START { \ - assert(sizeof(offset) == sizeof(STRLEN)); \ + STATIC_ASSERT_STMT(sizeof(offset) == sizeof(STRLEN)); \ if (SvOOK(sv)) { \ (offset) = ((U8*)SvPVX_const(sv))[-1]; \ if (!(offset)) { \