X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/72af0f205aa343252ed7cdba3f48ad1dad170ff6..c1d551e18b0505f4fadf5d7cd6b07de35589bd42:/sv.h diff --git a/sv.h b/sv.h index 6c77cce..6027f94 100644 --- a/sv.h +++ b/sv.h @@ -15,8 +15,8 @@ /* =head1 SV Flags -=for apidoc AmU||svtype -An enum of flags for Perl types. These are found in the file B +=for apidoc AmnU||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. The types are: @@ -41,8 +41,8 @@ The types are: These are most easily explained from the bottom up. -SVt_PVIO is for I/O objects, SVt_PVFM for formats, SVt_PVCV for -subroutines, SVt_PVHV for hashes and SVt_PVAV for arrays. +C is for I/O objects, C for formats, C for +subroutines, C for hashes and C for arrays. All the others are scalar types, that is, things that can be bound to a C<$> variable. For these, the internal types are mostly orthogonal to @@ -51,73 +51,73 @@ types in the Perl language. Hence, checking C<< SvTYPE(sv) < SVt_PVAV >> is the best way to see whether something is a scalar. -SVt_PVGV represents a typeglob. If !SvFAKE(sv), then it is a real, -incoercible typeglob. If SvFAKE(sv), then it is a scalar to which a +C represents a typeglob. If C, then it is a real, +incoercible typeglob. If C, then it is a scalar to which a typeglob has been assigned. Assigning to it again will stop it from being -a typeglob. SVt_PVLV represents a scalar that delegates to another scalar +a typeglob. C represents a scalar that delegates to another scalar behind the scenes. It is used, e.g., for the return value of C and for tied hash and array elements. It can hold any scalar value, including -a typeglob. SVt_REGEXP is for regular -expressions. SVt_INVLIST is for Perl +a typeglob. C is for regular +expressions. C is for Perl core internal use only. -SVt_PVMG represents a "normal" scalar (not a typeglob, regular expression, +C represents a "normal" scalar (not a typeglob, regular expression, or delegate). Since most scalars do not need all the internal fields of a PVMG, we save memory by allocating smaller structs when possible. All the -other types are just simpler forms of SVt_PVMG, with fewer internal fields. - SVt_NULL can only hold undef. SVt_IV can hold undef, an integer, or a -reference. (SVt_RV is an alias for SVt_IV, which exists for backward -compatibility.) SVt_NV can hold any of those or a double. SVt_PV can only -hold undef or a string. SVt_PVIV is a superset of SVt_PV and SVt_IV. -SVt_PVNV is similar. SVt_PVMG can hold anything SVt_PVNV can hold, but it +other types are just simpler forms of C, with fewer internal fields. +C can only hold undef. C can hold undef, an integer, or a +reference. (C is an alias for C, which exists for backward +compatibility.) C can hold any of those or a double. C can only +hold C or a string. C is a superset of C and C. +C is similar. C can hold anything C can hold, but it can, but does not have to, be blessed or magical. -=for apidoc AmU||SVt_NULL +=for apidoc AmnU||SVt_NULL Type flag for scalars. See L. -=for apidoc AmU||SVt_IV +=for apidoc AmnU||SVt_IV Type flag for scalars. See L. -=for apidoc AmU||SVt_NV +=for apidoc AmnU||SVt_NV Type flag for scalars. See L. -=for apidoc AmU||SVt_PV +=for apidoc AmnU||SVt_PV Type flag for scalars. See L. -=for apidoc AmU||SVt_PVIV +=for apidoc AmnU||SVt_PVIV Type flag for scalars. See L. -=for apidoc AmU||SVt_PVNV +=for apidoc AmnU||SVt_PVNV Type flag for scalars. See L. -=for apidoc AmU||SVt_PVMG +=for apidoc AmnU||SVt_PVMG Type flag for scalars. See L. -=for apidoc AmU||SVt_INVLIST -Type flag for scalars. See L. +=for apidoc CmnU||SVt_INVLIST +Type flag for scalars. See L. -=for apidoc AmU||SVt_REGEXP +=for apidoc AmnU||SVt_REGEXP Type flag for regular expressions. See L. -=for apidoc AmU||SVt_PVGV +=for apidoc AmnU||SVt_PVGV Type flag for typeglobs. See L. -=for apidoc AmU||SVt_PVLV +=for apidoc AmnU||SVt_PVLV Type flag for scalars. See L. -=for apidoc AmU||SVt_PVAV +=for apidoc AmnU||SVt_PVAV Type flag for arrays. See L. -=for apidoc AmU||SVt_PVHV +=for apidoc AmnU||SVt_PVHV Type flag for hashes. See L. -=for apidoc AmU||SVt_PVCV +=for apidoc AmnU||SVt_PVCV Type flag for subroutines. See L. -=for apidoc AmU||SVt_PVFM +=for apidoc AmnU||SVt_PVFM Type flag for formats. See L. -=for apidoc AmU||SVt_PVIO +=for apidoc AmnU||SVt_PVIO Type flag for I/O objects. See L. =cut @@ -149,20 +149,24 @@ 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; /* *** any alterations to the SV types above need to be reflected in * SVt_MASK and the various PL_valid_types_* tables. As of this writing those * 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 */ + * one in B.xs, and 'bodies_by_type[]' in sv.c. + * + * 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 -/* Although Fast Boyer Moore tables are now being stored in PVGVs, for most - purposes external code wanting to consider PVBM probably needs to think of - PVMG instead. */ +/* Fast Boyer Moore tables are now stored in magic attached to PVMGs */ # define SVt_PVBM SVt_PVMG /* Anything wanting to create a reference from clean should ensure that it has a scalar of type SVt_IV now: */ @@ -207,25 +211,28 @@ typedef struct hek HEK; UV svu_uv; \ _NV_BODYLESS_UNION \ SV* svu_rv; /* pointer to another SV */ \ - struct regexp* svu_rx; \ SV** svu_array; \ HE** svu_hash; \ GP* svu_gp; \ PerlIO *svu_fp; \ - } sv_u + } sv_u \ + _SV_HEAD_DEBUG +#ifdef DEBUG_LEAKING_SCALARS +#define _SV_HEAD_DEBUG ;\ + PERL_BITFIELD32 sv_debug_optype:9; /* the type of OP that allocated us */ \ + PERL_BITFIELD32 sv_debug_inpad:1; /* was allocated in a pad for an OP */ \ + PERL_BITFIELD32 sv_debug_line:16; /* the line where we were allocated */ \ + UV sv_debug_serial; /* serial number of sv allocation */ \ + char * sv_debug_file; /* the file where we were allocated */ \ + SV * sv_debug_parent /* what we were cloned from (ithreads)*/ +#else +#define _SV_HEAD_DEBUG +#endif struct STRUCT_SV { /* struct sv { */ _SV_HEAD(void*); _SV_HEAD_UNION; -#ifdef DEBUG_LEAKING_SCALARS - PERL_BITFIELD32 sv_debug_optype:9; /* the type of OP that allocated us */ - PERL_BITFIELD32 sv_debug_inpad:1; /* was allocated in a pad for an OP */ - PERL_BITFIELD32 sv_debug_line:16; /* the line where we were allocated */ - UV sv_debug_serial; /* serial number of sv allocation */ - char * sv_debug_file; /* the file where we were allocated */ - SV * sv_debug_parent; /* what we were cloned from (ithreads)*/ -#endif }; struct gv { @@ -265,62 +272,63 @@ struct p5rx { =head1 SV Manipulation Functions =for apidoc Am|U32|SvREFCNT|SV* sv -Returns the value of the object's reference count. +Returns the value of the object's reference count. Exposed +to perl code via Internals::SvREFCNT(). -=for apidoc Am|SV*|SvREFCNT_inc|SV* sv +=for apidoc SvREFCNT_inc Increments the reference count of the given SV, returning the SV. -All of the following SvREFCNT_inc* macros are optimized versions of -SvREFCNT_inc, and can be replaced with SvREFCNT_inc. +All of the following C* are optimized versions of +C, and can be replaced with C. -=for apidoc Am|SV*|SvREFCNT_inc_NN|SV* sv -Same as SvREFCNT_inc, but can only be used if you know I -is not NULL. Since we don't have to check the NULLness, it's faster +=for apidoc SvREFCNT_inc_NN +Same as C, but can only be used if you know C +is not C. Since we don't have to check the NULLness, it's faster and smaller. -=for apidoc Am|void|SvREFCNT_inc_void|SV* sv -Same as SvREFCNT_inc, but can only be used if you don't need the +=for apidoc SvREFCNT_inc_void +Same as C, but can only be used if you don't need the return value. The macro doesn't need to return a meaningful value. =for apidoc Am|void|SvREFCNT_inc_void_NN|SV* sv -Same as SvREFCNT_inc, but can only be used if you don't need the return -value, and you know that I is not NULL. The macro doesn't need +Same as C, but can only be used if you don't need the return +value, and you know that C is not C. The macro doesn't need to return a meaningful value, or check for NULLness, so it's smaller and faster. =for apidoc Am|SV*|SvREFCNT_inc_simple|SV* sv -Same as SvREFCNT_inc, but can only be used with expressions without side +Same as C, but can only be used with expressions without side effects. Since we don't have to store a temporary value, it's faster. =for apidoc Am|SV*|SvREFCNT_inc_simple_NN|SV* sv -Same as SvREFCNT_inc_simple, but can only be used if you know I -is not NULL. Since we don't have to check the NULLness, it's faster +Same as C, but can only be used if you know C +is not C. Since we don't have to check the NULLness, it's faster and smaller. =for apidoc Am|void|SvREFCNT_inc_simple_void|SV* sv -Same as SvREFCNT_inc_simple, but can only be used if you don't need the +Same as C, but can only be used if you don't need the return value. The macro doesn't need to return a meaningful value. =for apidoc Am|void|SvREFCNT_inc_simple_void_NN|SV* sv -Same as SvREFCNT_inc, but can only be used if you don't need the return -value, and you know that I is not NULL. The macro doesn't need +Same as C, but can only be used if you don't need the return +value, and you know that C is not C. The macro doesn't need to return a meaningful value, or check for NULLness, so it's smaller and faster. -=for apidoc Am|void|SvREFCNT_dec|SV* sv -Decrements the reference count of the given SV. I may be NULL. +=for apidoc SvREFCNT_dec +Decrements the reference count of the given SV. C may be C. -=for apidoc Am|void|SvREFCNT_dec_NN|SV* sv -Same as SvREFCNT_dec, but can only be used if you know I -is not NULL. Since we don't have to check the NULLness, it's faster +=for apidoc SvREFCNT_dec_NN +Same as C, but can only be used if you know C +is not C. Since we don't have to check the NULLness, it's faster and smaller. =for apidoc Am|svtype|SvTYPE|SV* sv -Returns the type of the SV. See C. +Returns the type of the SV. See C>. =for apidoc Am|void|SvUPGRADE|SV* sv|svtype type Used to upgrade an SV to a more complex form. Uses C to -perform the upgrade if necessary. See C. +perform the upgrade if necessary. See C>. =cut */ @@ -329,10 +337,10 @@ perform the upgrade if necessary. See C. #define SvFLAGS(sv) (sv)->sv_flags #define SvREFCNT(sv) (sv)->sv_refcnt -#define SvREFCNT_inc(sv) S_SvREFCNT_inc(MUTABLE_SV(sv)) +#define SvREFCNT_inc(sv) Perl_SvREFCNT_inc(MUTABLE_SV(sv)) #define SvREFCNT_inc_simple(sv) SvREFCNT_inc(sv) -#define SvREFCNT_inc_NN(sv) S_SvREFCNT_inc_NN(MUTABLE_SV(sv)) -#define SvREFCNT_inc_void(sv) S_SvREFCNT_inc_void(MUTABLE_SV(sv)) +#define SvREFCNT_inc_NN(sv) Perl_SvREFCNT_inc_NN(MUTABLE_SV(sv)) +#define SvREFCNT_inc_void(sv) Perl_SvREFCNT_inc_void(MUTABLE_SV(sv)) /* These guys don't need the curly blocks */ #define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END @@ -340,8 +348,8 @@ perform the upgrade if necessary. See C. #define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT(MUTABLE_SV(sv))) #define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT(MUTABLE_SV(sv))) -#define SvREFCNT_dec(sv) S_SvREFCNT_dec(aTHX_ MUTABLE_SV(sv)) -#define SvREFCNT_dec_NN(sv) S_SvREFCNT_dec_NN(aTHX_ MUTABLE_SV(sv)) +#define SvREFCNT_dec(sv) Perl_SvREFCNT_dec(aTHX_ MUTABLE_SV(sv)) +#define SvREFCNT_dec_NN(sv) Perl_SvREFCNT_dec_NN(aTHX_ MUTABLE_SV(sv)) #define SVTYPEMASK 0xff #define SvTYPE(sv) ((svtype)((sv)->sv_flags & SVTYPEMASK)) @@ -349,7 +357,7 @@ perform the upgrade if necessary. See C. /* Sadly there are some parts of the core that have pointers to already-freed SV heads, and rely on being able to tell that they are now free. So mark them all by using a consistent macro. */ -#define SvIS_FREED(sv) ((sv)->sv_flags == SVTYPEMASK) +#define SvIS_FREED(sv) UNLIKELY(((sv)->sv_flags == SVTYPEMASK)) /* this is defined in this peculiar way to avoid compiler warnings. * See the <20121213131428.GD1842@iabyn.com> thread in p5p */ @@ -364,23 +372,28 @@ perform the upgrade if necessary. See C. #define SVp_IOK 0x00001000 /* has valid non-public integer value */ #define SVp_NOK 0x00002000 /* has valid non-public numeric value */ #define SVp_POK 0x00004000 /* has valid non-public pointer value */ -#define SVp_SCREAM 0x00008000 /* method name is DOES */ +#define SVp_SCREAM 0x00008000 /* currently unused on plain scalars */ #define SVphv_CLONEABLE SVp_SCREAM /* PVHV (stashes) clone its objects */ #define SVpgv_GP SVp_SCREAM /* GV has a valid GP */ #define SVprv_PCS_IMPORTED SVp_SCREAM /* RV is a proxy for a constant subroutine in another package. Set the GvIMPORTED_CV_on() if it needs to be expanded to a real GV */ -#define SVpad_NAMELIST SVp_SCREAM /* AV is a padnamelist */ + +/* SVf_PROTECT is what SVf_READONLY should have been: i.e. modifying + * this SV is completely illegal. However, SVf_READONLY (via + * Internals::SvREADONLY()) has come to be seen as a flag that can be + * temporarily set and unset by the user to indicate e.g. whether a hash + * is "locked". Now, Hash::Util et al only set SVf_READONLY, while core + * sets both (SVf_READONLY|SVf_PROTECT) to indicate both to core and user + * code that this SV should not be messed with. + */ #define SVf_PROTECT 0x00010000 /* very read-only */ #define SVs_PADTMP 0x00020000 /* in use as tmp */ -#define SVpad_TYPED 0x00020000 /* pad name is a Typed Lexical */ #define SVs_PADSTALE 0x00040000 /* lexical has gone out of scope; only used when !PADTMP */ -#define SVpad_OUR 0x00040000 /* pad name is "our" instead of "my" */ #define SVs_TEMP 0x00080000 /* mortal (implies string is stealable) */ #define SVs_OBJECT 0x00100000 /* is "blessed" */ -#define SVpad_LVALUE 0x00100000 /* pad name is used as lvalue */ #define SVs_GMG 0x00200000 /* has magical get method */ #define SVs_SMG 0x00400000 /* has magical set method */ #define SVs_RMG 0x00800000 /* has random magical methods */ @@ -390,18 +403,22 @@ perform the upgrade if necessary. See C. 2: For PVCV, whether CvUNIQUE(cv) refers to an eval or once only [CvEVAL(cv), CvSPECIAL(cv)] - 3: On a pad name SV, that slot in the - frame AV is a REFCNT'ed reference - to a lexical from "outside". - 4: HV: informally reserved by DAPM - for vtables */ + 3: HV: informally reserved by DAPM + for vtables + 4: Together with other flags (or + lack thereof) indicates a regex, + including PVLV-as-regex. See + isREGEXP(). + */ #define SVf_OOK 0x02000000 /* has valid offset value. For a PVHV this means that a hv_aux struct is present after the main array */ #define SVf_BREAK 0x04000000 /* refcnt is artificially low - used by SVs in final arena cleanup. Set in S_regtry on PL_reg_curpm, so that - perl_destruct will skip it. */ + perl_destruct will skip it. + Used for mark and sweep by OP_AASSIGN + */ #define SVf_READONLY 0x08000000 /* may not be modified */ @@ -415,7 +432,12 @@ perform the upgrade if necessary. See C. #define PRIVSHIFT 4 /* (SVp_?OK >> PRIVSHIFT) == SVf_?OK */ -/* Note that SVf_AMAGIC is now only set on stashes. */ +/* 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 + * is now only set on stashes. + */ #define SVf_AMAGIC 0x10000000 /* has magical overloaded methods */ #define SVf_IsCOW 0x10000000 /* copy on write (shared hash key if SvLEN == 0) */ @@ -437,31 +459,10 @@ perform the upgrade if necessary. See C. /* Some private flags. */ -/* PVNV, PVMG only, and only used in pads. Should be safe to test on any scalar - SV, as the core is careful to avoid setting both. - - SVf_POK, SVp_POK also set: - 0x00004400 Normal - 0x0000C400 method name for DOES (SvSCREAM) - 0x40004400 FBM compiled (SvVALID) - 0x4000C400 pad name. - - 0x00008000 GV with GP - 0x00008800 RV with PCS imported -*/ -#define SVpad_NAME (SVp_SCREAM|SVpbm_VALID) - /* This SV is a name in the PAD, so - SVpad_TYPED, SVpad_OUR and SVpad_STATE - apply */ /* PVAV */ #define SVpav_REAL 0x40000000 /* free old entries */ /* PVHV */ #define SVphv_LAZYDEL 0x40000000 /* entry in xhv_eiter must be deleted */ -/* This is only set true on a PVGV when it's playing "PVBM", but is tested for - on any regular scalar (anything <= PVLV) */ -#define SVpbm_VALID 0x40000000 -/* Only used in toke.c on an SV stored in PL_lex_repl */ -#define SVrepl_EVAL 0x40000000 /* Replacement part of s///e */ /* IV, PVIV, PVNV, PVMG, PVGV and (I assume) PVLV */ #define SVf_IVisUV 0x80000000 /* use XPVUV instead of XPVIV */ @@ -469,12 +470,9 @@ perform the upgrade if necessary. See C. #define SVpav_REIFY 0x80000000 /* can become real */ /* PVHV */ #define SVphv_HASKFLAGS 0x80000000 /* keys have flag byte after hash */ -/* PVGV when SVpbm_VALID is true */ -#define SVpbm_TAIL 0x80000000 /* RV upwards. However, SVf_ROK and SVp_IOK are exclusive */ #define SVprv_WEAKREF 0x80000000 /* Weak reference */ /* pad name vars only */ -#define SVpad_STATE 0x80000000 /* pad name is a "state" var */ #define _XPV_HEAD \ HV* xmg_stash; /* class package */ \ @@ -482,7 +480,7 @@ perform the upgrade if necessary. See C. STRLEN xpv_cur; /* length of svu_pv as a C string */ \ union { \ STRLEN xpvlenu_len; /* allocated size */ \ - char * xpvlenu_pv; /* regexp string */ \ + struct regexp* xpvlenu_rx; /* regex when SV body is XPVLV */ \ } xpv_len_u #define xpv_len xpv_len_u.xpvlenu_len @@ -490,23 +488,22 @@ perform the upgrade if necessary. See C. union _xnvu { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; - struct { - U32 xlow; - U32 xhigh; - } xpad_cop_seq; /* used by pad.c for cop_sequence */ + line_t xnv_lines; /* used internally by S_scan_subst() */ + bool xnv_bm_tail; /* an SvVALID (BM) SV has an implicit "\n" */ }; union _xivu { IV xivu_iv; /* integer value */ UV xivu_uv; HEK * xivu_namehek; /* xpvlv, xpvgv: GvNAME */ + bool xivu_eval_seen; /* used internally by S_scan_subst() */ + }; union _xmgu { MAGIC* xmg_magic; /* linked list of magicalness */ - HV* xmg_ourstash; /* Stash for our (when SvPAD_OUR is true) */ STRLEN xmg_hash_index; /* used while freeing hash entries */ -}; /* also used by PadnamelistMAXNAMED */ +}; struct xpv { _XPV_HEAD; @@ -551,7 +548,8 @@ struct xpvlv { SV* xlv_targ; char xlv_type; /* k=keys .=pos x=substr v=vec /=join/re * y=alem/helem/iter t=tie T=tied HE */ - char xlv_flags; /* 1 = negative offset 2 = negative len */ + char xlv_flags; /* 1 = negative offset 2 = negative len + 4 = out of range (vec) */ }; #define xlv_targoff xlv_targoff_u.xlvu_targoff @@ -568,8 +566,8 @@ struct xpvinvlist { the list, merely toggle this flag */ }; -/* This structure works in 3 ways - regular scalar, GV with GP, or fast - Boyer-Moore. */ +/* This structure works in 2 ways - regular scalar, or GV with GP */ + struct xpvgv { _XPV_HEAD; union _xivu xiv_u; @@ -622,7 +620,7 @@ struct xpvio { * Perl_filter_add() tries to do with the dirp), hence the * following union trick (as suggested by Gurusamy Sarathy). * For further information see Geir Johansen's problem report - * titled [ID 20000612.002] Perl problem on Cray system + * titled [ID 20000612.002 (#3366)] Perl problem on Cray system * The any pointer (known as IoANY()) will also be a good place * to hang any IO disciplines to. */ @@ -696,20 +694,20 @@ Tells an SV that it is an integer. Unsets the IV status of an SV. =for apidoc Am|void|SvIOK_only|SV* sv -Tells an SV that it is an integer and disables all other OK bits. +Tells an SV that it is an integer and disables all other C bits. =for apidoc Am|void|SvIOK_only_UV|SV* sv -Tells an SV that it is an unsigned integer and disables all other OK bits. +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 SvUOK or SVIOK. +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 SvUOK or SVIOK. +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. @@ -737,7 +735,7 @@ Tells an SV that it is a string. Unsets the PV status of an SV. =for apidoc Am|void|SvPOK_only|SV* sv -Tells an SV that it is a string and disables all other OK bits. +Tells an SV that it is a string and disables all other C bits. Will also turn off the UTF-8 status. =for apidoc Am|bool|SvVOK|SV* sv @@ -746,9 +744,9 @@ Returns a boolean indicating whether the SV contains a v-string. =for apidoc Am|U32|SvOOK|SV* sv Returns a U32 indicating whether the pointer to the string buffer is offset. This hack is used internally to speed up removal of characters from the -beginning of a SvPV. When SvOOK is true, then the start of the -allocated string buffer is actually C bytes before SvPVX. -This offset used to be stored in SvIVX, but is now stored within the spare +beginning of a C. When C is true, then the start of the +allocated string buffer is actually C bytes before C. +This offset used to be stored in C, but is now stored within the spare part of the buffer. =for apidoc Am|U32|SvROK|SV* sv @@ -765,37 +763,40 @@ Dereferences an RV to return the SV. =for apidoc Am|IV|SvIVX|SV* sv Returns the raw value in the SV's IV slot, without checks or conversions. -Only use when you are sure SvIOK is true. See also C. +Only use when you are sure C is true. See also C>. =for apidoc Am|UV|SvUVX|SV* sv Returns the raw value in the SV's UV slot, without checks or conversions. -Only use when you are sure SvIOK is true. See also C. +Only use when you are sure C is true. See also C>. + +=for apidoc AmD|UV|SvUVXx|SV* sv +This is an unnecessary synonym for L =for apidoc Am|NV|SvNVX|SV* sv Returns the raw value in the SV's NV slot, without checks or conversions. -Only use when you are sure SvNOK is true. See also C. +Only use when you are sure C is true. See also C>. =for apidoc Am|char*|SvPVX|SV* sv Returns a pointer to the physical string in the SV. The SV must contain a string. Prior to 5.9.3 it is not safe to execute this macro unless the SV's -type >= SVt_PV. +type >= C. This is also used to store the name of an autoloaded subroutine in an XS AUTOLOAD routine. See L. =for apidoc Am|STRLEN|SvCUR|SV* sv -Returns the length of the string which is in the SV. See C. +Returns the length of the string which is in the SV. See C>. =for apidoc Am|STRLEN|SvLEN|SV* sv Returns the size of the string buffer in the SV, not including any part -attributable to C. See C. +attributable to C. See C>. =for apidoc Am|char*|SvEND|SV* sv Returns a pointer to the spot just after the last character in the string which is in the SV, where there is usually a trailing C character (even though Perl scalars do not strictly require it). -See C. Access the character as *(SvEND(sv)). +See C>. Access the character as C<*(SvEND(sv))>. Warning: If C is equal to C, then C points to unallocated memory. @@ -810,35 +811,40 @@ With future Perls, however, it will be more efficient to use C instead of the lvalue assignment to C. =for apidoc Am|void|SvNV_set|SV* sv|NV val -Set the value of the NV pointer in sv to val. See C. +Set the value of the NV pointer in C to val. See C>. =for apidoc Am|void|SvPV_set|SV* sv|char* val -Set the value of the PV pointer in C to the C-terminated string -C. See also C. +This is probably not what you want to use, you probably wanted +L or L or L. + +Set the value of the PV pointer in C to the Perl allocated +C-terminated string C. See also C>. +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 SvIsCOW flag) first to make sure this -modification is safe. +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. =for apidoc Am|void|SvUV_set|SV* sv|UV val -Set the value of the UV pointer in sv to val. See C. +Set the value of the UV pointer in C to val. See C>. =for apidoc Am|void|SvRV_set|SV* sv|SV* val -Set the value of the RV pointer in sv to val. See C. +Set the value of the RV pointer in C to val. See C>. =for apidoc Am|void|SvMAGIC_set|SV* sv|MAGIC* val -Set the value of the MAGIC pointer in sv to val. See C. +Set the value of the MAGIC pointer in C to val. See C>. =for apidoc Am|void|SvSTASH_set|SV* sv|HV* val -Set the value of the STASH pointer in sv to val. See C. +Set the value of the STASH pointer in C to val. See C>. =for apidoc Am|void|SvCUR_set|SV* sv|STRLEN len -Set the current length of the string which is in the SV. See C -and C. +Set the current length of the string which is in the SV. See C> +and C>. =for apidoc Am|void|SvLEN_set|SV* sv|STRLEN len -Set the actual length of the string which is in the SV. See C. +Set the size of the string buffer for the SV. See C>. =cut */ @@ -851,7 +857,7 @@ Set the actual length of the string which is in the SV. See C. #define assert_not_ROK(sv) assert_(!SvROK(sv) || !SvRV(sv)) #define assert_not_glob(sv) assert_(!isGV_with_GP(sv)) -#define SvOK(sv) (SvFLAGS(sv) & SVf_OK || isREGEXP(sv)) +#define SvOK(sv) (SvFLAGS(sv) & SVf_OK) #define SvOK_off(sv) (assert_not_ROK(sv) assert_not_glob(sv) \ SvFLAGS(sv) &= ~(SVf_OK| \ SVf_IVisUV|SVf_UTF8), \ @@ -863,7 +869,7 @@ Set the actual length of the string which is in the SV. See C. #define SvOKp(sv) (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) #define SvIOKp(sv) (SvFLAGS(sv) & SVp_IOK) -#define SvIOKp_on(sv) (assert_not_glob(sv) SvRELEASE_IVX_(sv) \ +#define SvIOKp_on(sv) (assert_not_glob(sv) \ SvFLAGS(sv) |= SVp_IOK) #define SvNOKp(sv) (SvFLAGS(sv) & SVp_NOK) #define SvNOKp_on(sv) (assert_not_glob(sv) SvFLAGS(sv) |= SVp_NOK) @@ -872,7 +878,7 @@ Set the actual length of the string which is in the SV. See C. SvFLAGS(sv) |= SVp_POK) #define SvIOK(sv) (SvFLAGS(sv) & SVf_IOK) -#define SvIOK_on(sv) (assert_not_glob(sv) SvRELEASE_IVX_(sv) \ +#define SvIOK_on(sv) (assert_not_glob(sv) \ SvFLAGS(sv) |= (SVf_IOK|SVp_IOK)) #define SvIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK|SVf_IVisUV)) #define SvIOK_only(sv) (SvOK_off(sv), \ @@ -901,9 +907,12 @@ Set the actual length of the string which is in the SV. See C. =for apidoc Am|U32|SvUTF8|SV* sv Returns a U32 value indicating the UTF-8 status of an SV. If things are set-up properly, this indicates whether or not the SV contains UTF-8 encoded data. -You should use this I a call to SvPV() or one of its variants, in +You should use this I a call to C or one of its variants, in case any call to string overloading updates the internal flag. +If you want to take into account the L pragma, use C> +instead. + =for apidoc Am|void|SvUTF8_on|SV *sv Turn on the UTF-8 status of an SV (the data is not changed, just the flag). Do not use frivolously. @@ -913,7 +922,7 @@ Unsets the UTF-8 status of an SV (the data is not changed, just the flag). Do not use frivolously. =for apidoc Am|void|SvPOK_only_UTF8|SV* sv -Tells an SV that it is a string and disables all other OK bits, +Tells an SV that it is a string and disables all other C bits, and leaves the UTF-8 status as it was. =cut @@ -946,7 +955,7 @@ in gv.h: */ #define SvOOK(sv) (SvFLAGS(sv) & SVf_OOK) #define SvOOK_on(sv) (SvFLAGS(sv) |= SVf_OOK) -#define SvOOK_off(sv) ((void)(SvOOK(sv) && sv_backoff(sv))) +#define SvOOK_off(sv) ((void)(SvOOK(sv) && (sv_backoff(sv),0))) #define SvFAKE(sv) (SvFLAGS(sv) & SVf_FAKE) #define SvFAKE_on(sv) (SvFLAGS(sv) |= SVf_FAKE) @@ -1041,14 +1050,14 @@ the scalar's value cannot change unless written to. /* =for apidoc m|U32|SvTHINKFIRST|SV *sv -A quick flag check to see whether an sv should be passed to sv_force_normal -to be "downgraded" before SvIVX or SvPVX can be modified directly. +A quick flag check to see whether an C should be passed to C +to be "downgraded" before C or C can be modified directly. -For example, if your scalar is a reference and you want to modify the SvIVX -slot, you can't just do SvROK_off, as that will leak the referent. +For example, if your scalar is a reference and you want to modify the C +slot, you can't just do C, as that will leak the referent. This is used internally by various sv-modifying functions, such as -sv_setsv, sv_setiv and sv_pvn_force. +C, C and C. One case that this does not handle is a gv without SvFAKE set. After @@ -1056,8 +1065,8 @@ One case that this does not handle is a gv without SvFAKE set. After it will still be a gv. -SvTHINKFIRST sometimes produces false positives. In those cases -sv_force_normal does nothing. +C sometimes produces false positives. In those cases +C does nothing. =cut */ @@ -1075,8 +1084,8 @@ sv_force_normal does nothing. #define SvPADTMP_on(sv) (SvFLAGS(sv) |= SVs_PADTMP) #define SvPADTMP_off(sv) (SvFLAGS(sv) &= ~SVs_PADTMP) -#define SvPADSTALE_on(sv) S_SvPADSTALE_on(MUTABLE_SV(sv)) -#define SvPADSTALE_off(sv) S_SvPADSTALE_off(MUTABLE_SV(sv)) +#define SvPADSTALE_on(sv) Perl_SvPADSTALE_on(MUTABLE_SV(sv)) +#define SvPADSTALE_off(sv) Perl_SvPADSTALE_off(MUTABLE_SV(sv)) #define SvTEMP(sv) (SvFLAGS(sv) & SVs_TEMP) #define SvTEMP_on(sv) (SvFLAGS(sv) |= SVs_TEMP) @@ -1086,6 +1095,22 @@ sv_force_normal does nothing. #define SvOBJECT_on(sv) (SvFLAGS(sv) |= SVs_OBJECT) #define SvOBJECT_off(sv) (SvFLAGS(sv) &= ~SVs_OBJECT) +/* +=for apidoc Am|U32|SvREADONLY|SV* sv +Returns true if the argument is readonly, otherwise returns false. +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 +type. Exposed to perl code via Internals::SvREADONLY(). + +=for apidoc Am|U32|SvREADONLY_off|SV* sv +Mark an object as not-readonly. Exactly what this mean depends on the +object type. Exposed to perl code via Internals::SvREADONLY(). + +=cut +*/ + #define SvREADONLY(sv) (SvFLAGS(sv) & (SVf_READONLY|SVf_PROTECT)) #ifdef PERL_CORE # define SvREADONLY_on(sv) (SvFLAGS(sv) |= (SVf_READONLY|SVf_PROTECT)) @@ -1105,85 +1130,28 @@ sv_force_normal does nothing. # define SvCOMPILED_off(sv) #endif -#define SvEVALED(sv) (SvFLAGS(sv) & SVrepl_EVAL) -#define SvEVALED_on(sv) (SvFLAGS(sv) |= SVrepl_EVAL) -#define SvEVALED_off(sv) (SvFLAGS(sv) &= ~SVrepl_EVAL) #if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) -# define SvVALID(sv) ({ const SV *const _svvalid = (const SV*)(sv); \ - if (SvFLAGS(_svvalid) & SVpbm_VALID && !SvSCREAM(_svvalid)) \ - assert(!isGV_with_GP(_svvalid)); \ - (SvFLAGS(_svvalid) & SVpbm_VALID); \ - }) -# define SvVALID_on(sv) ({ SV *const _svvalid = MUTABLE_SV(sv); \ - assert(!isGV_with_GP(_svvalid)); \ - assert(!SvSCREAM(_svvalid)); \ - (SvFLAGS(_svvalid) |= SVpbm_VALID); \ - }) -# define SvVALID_off(sv) ({ SV *const _svvalid = MUTABLE_SV(sv); \ - assert(!isGV_with_GP(_svvalid)); \ - assert(!SvSCREAM(_svvalid)); \ - (SvFLAGS(_svvalid) &= ~SVpbm_VALID); \ - }) - # define SvTAIL(sv) ({ const SV *const _svtail = (const SV *)(sv); \ assert(SvTYPE(_svtail) != SVt_PVAV); \ assert(SvTYPE(_svtail) != SVt_PVHV); \ - assert(!SvSCREAM(_svtail)); \ - (SvFLAGS(sv) & (SVpbm_TAIL|SVpbm_VALID)) \ - == (SVpbm_TAIL|SVpbm_VALID); \ + assert(!(SvFLAGS(_svtail) & (SVf_NOK|SVp_NOK))); \ + assert(SvVALID(_svtail)); \ + ((XPVNV*)SvANY(_svtail))->xnv_u.xnv_bm_tail; \ }) #else -# define SvVALID(sv) ((SvFLAGS(sv) & SVpbm_VALID) && !SvSCREAM(sv)) -# define SvVALID_on(sv) (SvFLAGS(sv) |= SVpbm_VALID) -# define SvVALID_off(sv) (SvFLAGS(sv) &= ~SVpbm_VALID) -# define SvTAIL(sv) ((SvFLAGS(sv) & (SVpbm_TAIL|SVpbm_VALID)) \ - == (SVpbm_TAIL|SVpbm_VALID)) - -#endif -#define SvTAIL_on(sv) (SvFLAGS(sv) |= SVpbm_TAIL) -#define SvTAIL_off(sv) (SvFLAGS(sv) &= ~SVpbm_TAIL) - -#define SvPAD_NAME(sv) ((SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME) - -#define SvPAD_TYPED(sv) \ - ((SvFLAGS(sv) & (SVpad_NAME|SVpad_TYPED)) == (SVpad_NAME|SVpad_TYPED)) - -#define SvPAD_OUR(sv) \ - ((SvFLAGS(sv) & (SVpad_NAME|SVpad_OUR)) == (SVpad_NAME|SVpad_OUR)) - -#define SvPAD_STATE(sv) \ - ((SvFLAGS(sv) & (SVpad_NAME|SVpad_STATE)) == (SVpad_NAME|SVpad_STATE)) - -#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) -# define SvPAD_TYPED_on(sv) ({ \ - SV *const _svpad = MUTABLE_SV(sv); \ - assert(SvTYPE(_svpad) == SVt_PVMG); \ - (SvFLAGS(_svpad) |= SVpad_NAME|SVpad_TYPED); \ - }) -#define SvPAD_OUR_on(sv) ({ \ - SV *const _svpad = MUTABLE_SV(sv); \ - assert(SvTYPE(_svpad) == SVt_PVMG); \ - (SvFLAGS(_svpad) |= SVpad_NAME|SVpad_OUR); \ - }) -#define SvPAD_STATE_on(sv) ({ \ - SV *const _svpad = MUTABLE_SV(sv); \ - assert(SvTYPE(_svpad) == SVt_PVNV || SvTYPE(_svpad) == SVt_PVMG); \ - (SvFLAGS(_svpad) |= SVpad_NAME|SVpad_STATE); \ - }) -#else -# define SvPAD_TYPED_on(sv) (SvFLAGS(sv) |= SVpad_NAME|SVpad_TYPED) -# define SvPAD_OUR_on(sv) (SvFLAGS(sv) |= SVpad_NAME|SVpad_OUR) -# define SvPAD_STATE_on(sv) (SvFLAGS(sv) |= SVpad_NAME|SVpad_STATE) +# define SvTAIL(_svtail) (((XPVNV*)SvANY(_svtail))->xnv_u.xnv_bm_tail) #endif -#define SvOURSTASH(sv) \ - (SvPAD_OUR(sv) ? ((XPVMG*) SvANY(sv))->xmg_u.xmg_ourstash : NULL) -#define SvOURSTASH_set(sv, st) \ - STMT_START { \ - assert(SvTYPE(sv) == SVt_PVMG); \ - ((XPVMG*) SvANY(sv))->xmg_u.xmg_ourstash = st; \ - } STMT_END +/* Does the SV have a Boyer-Moore table attached as magic? + * 'VALID' is a poor name, but is kept for historical reasons. */ +#define SvVALID(_svvalid) ( \ + SvPOKp(_svvalid) \ + && SvSMAGICAL(_svvalid) \ + && SvMAGIC(_svvalid) \ + && (SvMAGIC(_svvalid)->mg_type == PERL_MAGIC_bm \ + || mg_find(_svvalid, PERL_MAGIC_bm)) \ + ) #define SvRVx(sv) SvRV(sv) @@ -1208,7 +1176,11 @@ sv_force_normal does nothing. # define SvMAGIC(sv) (0 + *(assert_(SvTYPE(sv) >= SVt_PVMG) &((XPVMG*) SvANY(sv))->xmg_u.xmg_magic)) # define SvSTASH(sv) (0 + *(assert_(SvTYPE(sv) >= SVt_PVMG) &((XPVMG*) SvANY(sv))->xmg_stash)) #else +# ifdef PERL_CORE +# define SvLEN(sv) (0 + ((XPV*) SvANY(sv))->xpv_len) +# else # define SvLEN(sv) ((XPV*) SvANY(sv))->xpv_len +# 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) @@ -1221,15 +1193,25 @@ sv_force_normal does nothing. && !(IoFLAGS(_svpvx) & IOf_FAKE_DIRP))); \ &((_svpvx)->sv_u.svu_pv); \ })) +# ifdef PERL_CORE +# define SvCUR(sv) \ + ({ const SV *const _svcur = (const SV *)(sv); \ + assert(PL_valid_types_PVX[SvTYPE(_svcur) & SVt_MASK]); \ + assert(!isGV_with_GP(_svcur)); \ + assert(!(SvTYPE(_svcur) == SVt_PVIO \ + && !(IoFLAGS(_svcur) & IOf_FAKE_DIRP))); \ + (((XPV*) MUTABLE_PTR(SvANY(_svcur)))->xpv_cur); \ + }) +# else # define SvCUR(sv) \ (*({ const SV *const _svcur = (const SV *)(sv); \ - assert(PL_valid_types_PVX[SvTYPE(_svcur) & SVt_MASK] \ - || SvTYPE(_svcur) == SVt_REGEXP); \ + assert(PL_valid_types_PVX[SvTYPE(_svcur) & SVt_MASK]); \ assert(!isGV_with_GP(_svcur)); \ assert(!(SvTYPE(_svcur) == SVt_PVIO \ && !(IoFLAGS(_svcur) & IOf_FAKE_DIRP))); \ &(((XPV*) MUTABLE_PTR(SvANY(_svcur)))->xpv_cur); \ })) +# endif # define SvIVX(sv) \ (*({ const SV *const _svivx = (const SV *)(sv); \ assert(PL_valid_types_IVX[SvTYPE(_svivx) & SVt_MASK]); \ @@ -1267,8 +1249,6 @@ sv_force_normal does nothing. # define SvMAGIC(sv) \ (*({ const SV *const _svmagic = (const SV *)(sv); \ assert(SvTYPE(_svmagic) >= SVt_PVMG); \ - if(SvTYPE(_svmagic) == SVt_PVMG) \ - assert(!SvPAD_OUR(_svmagic)); \ &(((XPVMG*) MUTABLE_PTR(SvANY(_svmagic)))->xmg_u.xmg_magic); \ })) # define SvSTASH(sv) \ @@ -1313,11 +1293,11 @@ sv_force_normal does nothing. Not guaranteed to stay returning void */ /* Macro won't actually call sv_2iv if already IOK */ #define SvIV_please(sv) \ - STMT_START {if (!SvIOKp(sv) && (SvNOK(sv) || SvPOK(sv))) \ + STMT_START {if (!SvIOKp(sv) && (SvFLAGS(sv) & (SVf_NOK|SVf_POK))) \ (void) SvIV(sv); } STMT_END #define SvIV_please_nomg(sv) \ - (!SvIOKp(sv) && (SvNOK(sv) || SvPOK(sv)) \ - ? (SvIV_nomg(sv), SvIOK(sv)) \ + (!(SvFLAGS(sv) & (SVf_IOK|SVp_IOK)) && (SvFLAGS(sv) & (SVf_NOK|SVf_POK)) \ + ? (sv_2iv_flags(sv, 0), SvIOK(sv)) \ : SvIOK(sv)) #define SvIV_set(sv, val) \ STMT_START { \ @@ -1356,8 +1336,7 @@ sv_force_normal does nothing. (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END #define SvCUR_set(sv, val) \ STMT_START { \ - assert(PL_valid_types_PVX[SvTYPE(sv) & SVt_MASK] \ - || SvTYPE(sv) == SVt_REGEXP); \ + assert(PL_valid_types_PVX[SvTYPE(sv) & SVt_MASK]); \ assert(!isGV_with_GP(sv)); \ assert(!(SvTYPE(sv) == SVt_PVIO \ && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \ @@ -1446,6 +1425,10 @@ sv_force_normal does nothing. #define LvTARGLEN(sv) ((XPVLV*) SvANY(sv))->xlv_targlen #define LvFLAGS(sv) ((XPVLV*) SvANY(sv))->xlv_flags +#define LVf_NEG_OFF 0x1 +#define LVf_NEG_LEN 0x2 +#define LVf_OUT_OF_RANGE 0x4 + #define IoIFP(sv) (sv)->sv_u.svu_fp #define IoOFP(sv) ((XPVIO*) SvANY(sv))->xio_ofp #define IoDIRP(sv) ((XPVIO*) SvANY(sv))->xio_dirp @@ -1513,10 +1496,9 @@ attention to precisely which outputs are influenced by which inputs. #define SvTAINT(sv) \ STMT_START { \ - if (UNLIKELY(TAINTING_get)) { \ - if (UNLIKELY(TAINT_get)) \ - SvTAINTED_on(sv); \ - } \ + assert(TAINTING_get || !TAINT_get); \ + if (UNLIKELY(TAINT_get)) \ + SvTAINTED_on(sv); \ } STMT_END /* @@ -1539,17 +1521,17 @@ Returns a pointer to the string in the SV, or a stringified form of the SV if the SV does not contain a string. The SV may cache the stringified version becoming C. Handles 'get' magic. The C variable will be set to the length of the string (this is a macro, so -don't use C<&len>). See also C for a version which guarantees to -evaluate sv only once. +don't use C<&len>). See also C> for a version which guarantees to +evaluate C only once. Note that there is no guarantee that the return value of C is equal to C, or that C contains valid data, or that successive calls to C will return the same pointer value each time. This is due to the way that things like overloading and Copy-On-Write are handled. In these cases, the return value may point to -a temporary buffer or similar. If you absolutely need the SvPVX field to +a temporary buffer or similar. If you absolutely need the C field to be valid (for example, if you intend to write to it), then see -L. +C>. =for apidoc Am|char*|SvPVx|SV* sv|STRLEN len A version of C which guarantees to evaluate C only once. @@ -1566,91 +1548,136 @@ Like C but doesn't set a length variable. Like C but doesn't process magic. =for apidoc Am|IV|SvIV|SV* sv -Coerces the given SV to an integer and returns it. See C for a -version which guarantees to evaluate sv only once. +Coerces the given SV to IV and returns it. The returned value in many +circumstances will get stored in C's IV slot, but not in all cases. (Use +C> to make sure it does). + +See C> for a version which guarantees to evaluate C only once. =for apidoc Am|IV|SvIV_nomg|SV* sv Like C but doesn't process magic. =for apidoc Am|IV|SvIVx|SV* sv -Coerces the given SV to an integer and returns it. -Guarantees to evaluate C only once. Only use -this if C is an expression with side effects, -otherwise use the more efficient C. +Coerces the given SV to IV and returns it. The returned value in many +circumstances will get stored in C's IV slot, but not in all cases. (Use +C> to make sure it does). + +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. =for apidoc Am|NV|SvNV|SV* sv -Coerce the given SV to a double and return it. See C for a version -which guarantees to evaluate sv only once. +Coerces the given SV to NV and returns it. The returned value in many +circumstances will get stored in C's NV slot, but not in all cases. (Use +C> to make sure it does). + +See C> for a version which guarantees to evaluate C only once. =for apidoc Am|NV|SvNV_nomg|SV* sv Like C but doesn't process magic. =for apidoc Am|NV|SvNVx|SV* sv -Coerces the given SV to a double and returns it. -Guarantees to evaluate C only once. Only use -this if C is an expression with side effects, -otherwise use the more efficient C. +Coerces the given SV to NV and returns it. The returned value in many +circumstances will get stored in C's NV slot, but not in all cases. (Use +C> to make sure it does). + +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. =for apidoc Am|UV|SvUV|SV* sv -Coerces the given SV to an unsigned integer and returns it. See C -for a version which guarantees to evaluate sv only once. +Coerces the given SV to UV and returns it. The returned value in many +circumstances will get stored in C's UV slot, but not in all cases. (Use +C> to make sure it does). + +See C> for a version which guarantees to evaluate C only once. =for apidoc Am|UV|SvUV_nomg|SV* sv Like C but doesn't process magic. =for apidoc Am|UV|SvUVx|SV* sv -Coerces the given SV to an unsigned integer and -returns it. Guarantees to evaluate C only once. Only -use this if C is an expression with side effects, -otherwise use the more efficient C. +Coerces the given SV to UV and returns it. The returned value in many +circumstances will get stored in C's UV slot, but not in all cases. (Use +C> to make sure it does). + +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. =for apidoc Am|bool|SvTRUE|SV* sv Returns a boolean indicating whether Perl would evaluate the SV as true or -false. See SvOK() for a defined/undefined test. Handles 'get' magic -unless the scalar is already SvPOK, SvIOK or SvNOK (the public, not the +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). +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 SvOK() for a defined/undefined test. Does not handle 'get' magic. +false. See C> for a defined/undefined test. Does not handle 'get' magic. + +=for apidoc Am|bool|SvTRUEx|SV* sv +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 sv to utf8 first if necessary. +Like C, but converts C to UTF-8 first if necessary. =for apidoc Am|char*|SvPVutf8|SV* sv|STRLEN len -Like C, but converts sv to utf8 first if necessary. +Like C, but converts C to UTF-8 first if necessary. + +=for apidoc Am|char*|SvPVutf8_nomg|SV* sv|STRLEN len +Like C, but does not process get magic. + +=for apidoc Am|char*|SvPVutf8_or_null|SV* sv|STRLEN len +Like C, but when C is undef, returns C. + +=for apidoc Am|char*|SvPVutf8_or_null_nomg|SV* sv|STRLEN len +Like C, but does not process get magic. =for apidoc Am|char*|SvPVutf8_nolen|SV* sv -Like C, but converts sv to utf8 first if necessary. +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 sv 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 sv 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. + +=for apidoc Am|char*|SvPVbyte_or_null|SV* sv|STRLEN len +Like C, but when C is undef, returns C. + +=for apidoc Am|char*|SvPVbyte_or_null_nomg|SV* sv|STRLEN len +Like C, but does not process get magic. =for apidoc Am|char*|SvPVbyte_nolen|SV* sv -Like C, but converts sv 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 sv to utf8 first if necessary. -Guarantees to evaluate sv only once; use the more efficient C +Like C, but converts C to UTF-8 first if necessary. +Guarantees to evaluate C only once; use the more efficient C otherwise. =for apidoc Am|char*|SvPVutf8x|SV* sv|STRLEN len -Like C, but converts sv to utf8 first if necessary. -Guarantees to evaluate sv only once; use the more efficient C +Like C, but converts C to UTF-8 first if necessary. +Guarantees to evaluate C only once; use the more efficient C otherwise. =for apidoc Am|char*|SvPVbytex_force|SV* sv|STRLEN len -Like C, but converts sv to byte representation first if necessary. -Guarantees to evaluate sv only once; use the more efficient C -otherwise. +Like C, but converts C to byte representation first if necessary. +Guarantees to evaluate C only once; use the more efficient C +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 sv to byte representation first if necessary. -Guarantees to evaluate sv only once; use the more efficient C -otherwise. +Like C, but converts C to byte representation first if necessary. +Guarantees to evaluate C only once; use the more efficient C +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 @@ -1673,10 +1700,6 @@ 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. -=for apidoc Amdb|STRLEN|sv_utf8_upgrade_nomg|NN SV *sv - -Like sv_utf8_upgrade, but doesn't do magic on C. - =cut */ @@ -1686,50 +1709,50 @@ Like sv_utf8_upgrade, but doesn't do magic on C. #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) \ @@ -1744,19 +1767,33 @@ Like sv_utf8_upgrade, but doesn't do magic on C. (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) \ + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &len)) + +#define SvPVutf8_or_null(sv, len) \ + (SvPOK_utf8_nog(sv) \ + ? ((len = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \ + ? sv_2pvutf8_flags(sv, &len, 0) : ((len = 0), NULL)) + +#define SvPVutf8_nomg(sv, len) \ + (SvPOK_utf8_nog(sv) \ + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8_flags(sv, &len, 0)) + +#define SvPVutf8_or_null_nomg(sv, len) \ (SvPOK_utf8_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &lp)) + ? ((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) \ @@ -1764,13 +1801,27 @@ Like sv_utf8_upgrade, but doesn't do magic on C. /* ----*/ -#define SvPVbyte(sv, lp) \ +#define SvPVbyte(sv, len) \ + (SvPOK_byte_nog(sv) \ + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &len)) + +#define SvPVbyte_or_null(sv, len) \ (SvPOK_byte_nog(sv) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) + ? ((len = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \ + ? sv_2pvbyte_flags(sv, &len, 0) : ((len = 0), NULL)) -#define SvPVbyte_force(sv, lp) \ +#define SvPVbyte_nomg(sv, len) \ + (SvPOK_byte_nog(sv) \ + ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte_flags(sv, &len, 0)) + +#define SvPVbyte_or_null_nomg(sv, len) \ + (SvPOK_utf8_nog(sv) \ + ? ((len = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \ + ? sv_2pvbyte_flags(sv, &len, 0) : ((len = 0), NULL)) + +#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) \ @@ -1782,22 +1833,28 @@ Like sv_utf8_upgrade, but doesn't do magic on C. * 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) 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))) -#define SvTRUE(sv) (LIKELY(sv) && (UNLIKELY(SvGMAGICAL(sv)) ? sv_2bool(sv) : SvTRUE_common(sv, sv_2bool_nomg(sv)))) -#define SvTRUE_nomg(sv) (LIKELY(sv) && ( SvTRUE_common(sv, sv_2bool_nomg(sv)))) -#define SvTRUE_NN(sv) (UNLIKELY(SvGMAGICAL(sv)) ? sv_2bool(sv) : SvTRUE_common(sv, sv_2bool_nomg(sv))) -#define SvTRUE_nomg_NN(sv) ( SvTRUE_common(sv, sv_2bool_nomg(sv))) #define SvTRUE_common(sv,fallback) ( \ - !SvOK(sv) \ + SvIMMORTAL_INTERP(sv) \ + ? SvIMMORTAL_TRUE(sv) \ + : !SvOK(sv) \ ? 0 \ : SvPOK(sv) \ ? SvPVXtrue(sv) \ - : (SvFLAGS(sv) & (SVf_IOK|SVf_NOK)) \ - ? ( (SvIOK(sv) && SvIVX(sv) != 0) \ - || (SvNOK(sv) && SvNVX(sv) != 0.0)) \ + : SvIOK(sv) \ + ? (SvIVX(sv) != 0 /* cast to bool */) \ + : (SvROK(sv) && !( SvOBJECT(SvRV(sv)) \ + && HvAMAGIC(SvSTASH(SvRV(sv))))) \ + ? TRUE \ : (fallback)) #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) @@ -1805,14 +1862,13 @@ Like sv_utf8_upgrade, but doesn't do magic on C. # 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__ */ @@ -1823,14 +1879,13 @@ Like sv_utf8_upgrade, but doesn't do magic on C. # 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__ */ @@ -1855,10 +1910,10 @@ Like sv_utf8_upgrade, but doesn't do magic on C. #define SvSHARED_HASH(sv) (0 + SvSHARED_HEK_FROM_PV(SvPVX_const(sv))->hek_hash) /* flag values for sv_*_flags functions */ +#define SV_UTF8_NO_ENCODING 0 /* No longer used */ #define SV_IMMEDIATE_UNREF 1 #define SV_GMAGIC 2 #define SV_COW_DROP_PV 4 -#define SV_UTF8_NO_ENCODING 8 #define SV_NOSTEAL 16 #define SV_CONST_RETURN 32 #define SV_MUTABLE_RETURN 64 @@ -1866,6 +1921,9 @@ Like sv_utf8_upgrade, but doesn't do magic on C. #define SV_HAS_TRAILING_NUL 256 #define SV_COW_SHARED_HASH_KEYS 512 /* This one is only enabled for PERL_OLD_COPY_ON_WRITE */ +/* XXX This flag actually enabled for any COW. But it appears not to do + anything. Can we just remove it? Or will it serve some future + purpose. */ #define SV_COW_OTHER_PVS 1024 /* Make sv_2pv_flags return NULL if something is undefined. */ #define SV_UNDEF_RETURNS_NULL 2048 @@ -1907,26 +1965,7 @@ Like sv_utf8_upgrade, but doesn't do magic on C. #define SV_CHECK_THINKFIRST_COW_DROP(sv) if (SvTHINKFIRST(sv)) \ sv_force_normal_flags(sv, SV_COW_DROP_PV) -#ifdef PERL_OLD_COPY_ON_WRITE -#define SvRELEASE_IVX(sv) \ - ((SvIsCOW(sv) ? sv_force_normal_flags(sv, 0) : (void) 0), 0) -# define SvIsCOW_normal(sv) (SvIsCOW(sv) && SvLEN(sv)) -# define SvRELEASE_IVX_(sv) SvRELEASE_IVX(sv), -# define SvCANCOW(sv) \ - (SvIsCOW(sv) || (SvFLAGS(sv) & CAN_COW_MASK) == CAN_COW_FLAGS) -/* This is a pessimistic view. Scalar must be purely a read-write PV to copy- - on-write. */ -# define CAN_COW_MASK (SVs_OBJECT|SVs_GMG|SVs_SMG|SVs_RMG|SVf_IOK|SVf_NOK| \ - SVf_POK|SVf_ROK|SVp_IOK|SVp_NOK|SVp_POK|SVf_FAKE| \ - SVf_OOK|SVf_BREAK|SVf_READONLY|SVf_PROTECT) -#else -# define SvRELEASE_IVX(sv) 0 -/* This little game brought to you by the need to shut this warning up: -mg.c: In function 'Perl_magic_get': -mg.c:1024: warning: left-hand operand of comma expression has no effect -*/ -# define SvRELEASE_IVX_(sv) /**/ -# ifdef PERL_NEW_COPY_ON_WRITE +#ifdef PERL_COPY_ON_WRITE # define SvCANCOW(sv) \ (SvIsCOW(sv) \ ? SvLEN(sv) ? CowREFCNT(sv) != SV_COW_REFCNT_MAX : 1 \ @@ -1934,11 +1973,10 @@ mg.c:1024: warning: left-hand operand of comma expression has no effect && 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 -#endif /* PERL_OLD_COPY_ON_WRITE */ +#endif #define CAN_COW_FLAGS (SVp_POK|SVf_POK) @@ -1955,6 +1993,8 @@ mg.c:1024: warning: left-hand operand of comma expression has no effect #define sv_pvn_force_nomg(sv, lp) sv_pvn_force_flags(sv, lp, 0) #define sv_utf8_upgrade_flags(sv, flags) sv_utf8_upgrade_flags_grow(sv, flags, 0) #define sv_utf8_upgrade_nomg(sv) sv_utf8_upgrade_flags(sv, 0) +#define sv_utf8_downgrade(sv, fail_ok) sv_utf8_downgrade_flags(sv, fail_ok, SV_GMAGIC) +#define sv_utf8_downgrade_nomg(sv, fail_ok) sv_utf8_downgrade_flags(sv, fail_ok, 0) #define sv_catpvn_nomg(dsv, sstr, slen) sv_catpvn_flags(dsv, sstr, slen, 0) #define sv_catpv_nomg(dsv, sstr) sv_catpv_flags(dsv, sstr, 0) #define sv_setsv(dsv, ssv) \ @@ -1969,7 +2009,9 @@ mg.c:1024: warning: left-hand operand of comma expression has no effect #define sv_copypv_nomg(dsv, ssv) sv_copypv_flags(dsv, ssv, 0) #define sv_2pv(sv, lp) sv_2pv_flags(sv, lp, SV_GMAGIC) #define sv_2pv_nolen(sv) sv_2pv(sv, 0) +#define sv_2pvbyte(sv, lp) sv_2pvbyte_flags(sv, lp, SV_GMAGIC) #define sv_2pvbyte_nolen(sv) sv_2pvbyte(sv, 0) +#define sv_2pvutf8(sv, lp) sv_2pvutf8_flags(sv, lp, SV_GMAGIC) #define sv_2pvutf8_nolen(sv) sv_2pvutf8(sv, 0) #define sv_2pv_nomg(sv, lp) sv_2pv_flags(sv, lp, 0) #define sv_pvn_force(sv, lp) sv_pvn_force_flags(sv, lp, SV_GMAGIC) @@ -2027,7 +2069,7 @@ incremented. #define newRV_inc(sv) newRV(sv) -/* the following macros update any magic values this sv is associated with */ +/* the following macros update any magic values this C is associated with */ /* =head1 Magical Functions @@ -2044,12 +2086,12 @@ or a tied variable (it calls C). This macro evaluates its argument more than once. =for apidoc Am|void|SvSetSV|SV* dsv|SV* ssv -Calls C if dsv is not the same as ssv. May evaluate arguments +Calls C if C is not the same as C. May evaluate arguments more than once. Does not handle 'set' magic on the destination SV. =for apidoc Am|void|SvSetSV_nosteal|SV* dsv|SV* ssv -Calls a non-destructive version of C if dsv is not the same as -ssv. May evaluate arguments more than once. +Calls a non-destructive version of C if C is not the same as +C. May evaluate arguments more than once. =for apidoc Am|void|SvSetMagicSV|SV* dsv|SV* ssv Like C, but does any set magic required afterwards. @@ -2058,15 +2100,15 @@ Like C, but does any set magic required afterwards. Like C, but does any set magic required afterwards. =for apidoc Am|void|SvSHARE|SV* sv -Arranges for sv to be shared between threads if a suitable module +Arranges for C to be shared between threads if a suitable module has been loaded. =for apidoc Am|void|SvLOCK|SV* sv -Arranges for a mutual exclusion lock to be obtained on sv if a suitable module +Arranges for a mutual exclusion lock to be obtained on C if a suitable module has been loaded. =for apidoc Am|void|SvUNLOCK|SV* sv -Releases a mutual exclusion lock on sv if a suitable module +Releases a mutual exclusion lock on C if a suitable module has been loaded. =head1 SV Manipulation Functions @@ -2076,12 +2118,20 @@ Expands the character buffer in the SV so that it has room for the indicated number of bytes (remember to reserve space for an extra trailing C character). Calls C to perform the expansion if necessary. Returns a pointer to the character -buffer. SV must be of type >= SVt_PV. One +buffer. SV must be of type >= C. One alternative is to call C if you are not sure of the type of SV. +You might mistakenly think that C is the number of bytes to add to the +existing size, but instead it is the total size C should be. + +=for apidoc Am|char *|SvPVCLEAR|SV* sv +Ensures that sv is a SVt_PV and that its SvCUR is 0, and that it is +properly null terminated. Equivalent to sv_setpvs(""), but more efficient. + =cut */ +#define SvPVCLEAR(sv) sv_setpv_bufsize(sv,0,0) #define SvSHARE(sv) PL_sharehook(aTHX_ sv) #define SvLOCK(sv) PL_lockhook(aTHX_ sv) #define SvUNLOCK(sv) PL_unlockhook(aTHX_ sv) @@ -2122,7 +2172,20 @@ alternative is to call C if you are not sure of the type of SV. #define SvPEEK(sv) "" #endif -#define SvIMMORTAL(sv) (SvREADONLY(sv) && ((sv)==&PL_sv_undef || (sv)==&PL_sv_yes || (sv)==&PL_sv_no || (sv)==&PL_sv_placeholder)) +/* Is this a per-interpreter immortal SV (rather than global)? + * These should either occupy adjacent entries in the interpreter struct + * (MULTIPLICITY) or adjacent elements of PL_sv_immortals[] otherwise. + * The unsigned (Size_t) cast avoids the need for a second < 0 condition. + */ +#define SvIMMORTAL_INTERP(sv) ((Size_t)((sv) - &PL_sv_yes) < 4) + +/* Does this immortal have a true value? Currently only PL_sv_yes does. */ +#define SvIMMORTAL_TRUE(sv) ((sv) == &PL_sv_yes) + +/* the SvREADONLY() test is to quickly reject most SVs */ +#define SvIMMORTAL(sv) \ + ( SvREADONLY(sv) \ + && (SvIMMORTAL_INTERP(sv) || (sv) == &PL_sv_placeholder)) #ifdef DEBUGGING /* exercise the immortal resurrection code in sv_free2() */ @@ -2136,7 +2199,7 @@ alternative is to call C if you are not sure of the type of SV. Returns a true SV if C is a true value, or a false SV if C is 0. -See also C and C. +See also C> and C>. =cut */ @@ -2161,9 +2224,13 @@ See also C and C. assert (!SvIOKp(sv)); \ (SvFLAGS(sv) &= ~SVpgv_GP); \ } STMT_END +#ifdef PERL_CORE +# define isGV_or_RVCV(kadawp) \ + (isGV(kadawp) || (SvROK(kadawp) && SvTYPE(SvRV(kadawp)) == SVt_PVCV)) +#endif #define isREGEXP(sv) \ (SvTYPE(sv) == SVt_REGEXP \ - || (SvFLAGS(sv) & (SVTYPEMASK|SVp_POK|SVpgv_GP|SVf_FAKE)) \ + || (SvFLAGS(sv) & (SVTYPEMASK|SVpgv_GP|SVf_FAKE)) \ == (SVt_PVLV|SVf_FAKE)) @@ -2190,11 +2257,16 @@ struct clone_params { AV *unreferenced; }; +/* SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games + with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */ +#define newSVsv(sv) newSVsv_flags((sv), SV_GMAGIC|SV_NOSTEAL) +#define newSVsv_nomg(sv) newSVsv_flags((sv), SV_NOSTEAL) + /* -=for apidoc Am|SV*|newSVpvn_utf8|NULLOK const char* s|STRLEN len|U32 utf8 +=for apidoc Am|SV*|newSVpvn_utf8|const char* s|STRLEN len|U32 utf8 Creates a new SV and copies a string (which may contain C (C<\0>) -characters) into it. If utf8 is true, calls +characters) into it. If C is true, calls C on the new SV. Implemented as a wrapper around C. =cut @@ -2205,23 +2277,21 @@ C on the new SV. Implemented as a wrapper around C. /* =for apidoc Amx|SV*|newSVpadname|PADNAME *pn -Creates a new SV containing the pad name. This is currently identical -to C, but pad names may cease being SVs at some point, so -C is preferable. +Creates a new SV containing the pad name. =cut */ -#define newSVpadname(pn) newSVsv(pn) +#define newSVpadname(pn) newSVpvn_utf8(PadnamePV(pn), PadnameLEN(pn), TRUE) /* -=for apidoc Am|void|SvOOK_offset|NN SV*sv|STRLEN len +=for apidoc Am|void|SvOOK_offset|SV*sv|STRLEN len -Reads into I the offset from SvPVX back to the true start of the +Reads into C the offset from C back to the true start of the allocated buffer, which will be non-zero if C has been used to efficiently remove characters from start of the buffer. Implemented as a -macro, which takes the address of I, which must be of type C. -Evaluates I more than once. Sets I to 0 if C is false. +macro, which takes the address of C, which must be of type C. +Evaluates C more than once. Sets C to 0 if C is false. =cut */ @@ -2232,7 +2302,7 @@ Evaluates I more than once. Sets I 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; \ @@ -2256,7 +2326,7 @@ Evaluates I more than once. Sets I 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)) { \ @@ -2320,11 +2390,39 @@ Evaluates I more than once. Sets I to 0 if C is false. #define SV_CONSTS_COUNT 35 /* - * Local variables: - * c-indentation-style: bsd - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: + * Bodyless IVs and NVs! * + * Since 5.9.2, we can avoid allocating a body for SVt_IV-type SVs. + * Since the larger IV-holding variants of SVs store their integer + * values in their respective bodies, the family of SvIV() accessor + * macros would naively have to branch on the SV type to find the + * integer value either in the HEAD or BODY. In order to avoid this + * expensive branch, a clever soul has deployed a great hack: + * We set up the SvANY pointer such that instead of pointing to a + * real body, it points into the memory before the location of the + * head. We compute this pointer such that the location of + * the integer member of the hypothetical body struct happens to + * be the same as the location of the integer member of the bodyless + * SV head. This now means that the SvIV() family of accessors can + * always read from the (hypothetical or real) body via SvANY. + * + * Since the 5.21 dev series, we employ the same trick for NVs + * if the architecture can support it (NVSIZE <= IVSIZE). + */ + +/* The following two macros compute the necessary offsets for the above + * trick and store them in SvANY for SvIV() (and friends) to use. */ + +#ifdef PERL_CORE +# define SET_SVANY_FOR_BODYLESS_IV(sv) \ + SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) \ + - STRUCT_OFFSET(XPVIV, xiv_iv)) + +# define SET_SVANY_FOR_BODYLESS_NV(sv) \ + SvANY(sv) = (XPVNV*)((char*)&(sv->sv_u.svu_nv) \ + - STRUCT_OFFSET(XPVNV, xnv_u.xnv_nv)) +#endif + +/* * ex: set ts=8 sts=4 sw=4 et: */