X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/3ea8bc937be5cc09bfcc0beabb3ac6c672b01b67..194e5090d23ea35a046eac37a5d4af6db452bb54:/sv.h diff --git a/sv.h b/sv.h index da36705..bc5daa9 100644 --- a/sv.h +++ b/sv.h @@ -16,7 +16,7 @@ =head1 SV Flags =for apidoc AmU||svtype -An enum of flags for Perl types. These are found in the file B +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: @@ -212,20 +212,24 @@ typedef struct hek HEK; 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 { @@ -274,7 +278,7 @@ All of the following SvREFCNT_inc* macros are optimized versions of SvREFCNT_inc, and can be replaced with SvREFCNT_inc. =for apidoc Am|SV*|SvREFCNT_inc_NN|SV* sv -Same as SvREFCNT_inc, but can only be used if you know I +Same as SvREFCNT_inc, but can only be used if you know C is not NULL. Since we don't have to check the NULLness, it's faster and smaller. @@ -284,7 +288,7 @@ 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 +value, and you know that C is not NULL. The macro doesn't need to return a meaningful value, or check for NULLness, so it's smaller and faster. @@ -293,7 +297,7 @@ Same as SvREFCNT_inc, 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 +Same as SvREFCNT_inc_simple, but can only be used if you know C is not NULL. Since we don't have to check the NULLness, it's faster and smaller. @@ -303,15 +307,15 @@ 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 +value, and you know that C is not NULL. 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. +Decrements the reference count of the given SV. C may be NULL. =for apidoc Am|void|SvREFCNT_dec_NN|SV* sv -Same as SvREFCNT_dec, but can only be used if you know I +Same as SvREFCNT_dec, but can only be used if you know C is not NULL. Since we don't have to check the NULLness, it's faster and smaller. @@ -349,7 +353,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 */ @@ -365,22 +369,19 @@ perform the upgrade if necessary. See C. #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 */ + /* eval cx text is ref counted */ #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 */ #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,10 +391,7 @@ 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 + 3: HV: informally reserved by DAPM for vtables */ #define SVf_OOK 0x02000000 /* has valid offset value. For a PVHV this means that a hv_aux struct is present @@ -401,7 +399,9 @@ perform the upgrade if necessary. See C. #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 */ @@ -437,22 +437,19 @@ 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. +/* The SVp_SCREAM|SVpbm_VALID (0x40008000) combination is up for grabs. + Formerly it was used for pad names, but now it is available. The core + is careful to avoid setting both flags. SVf_POK, SVp_POK also set: 0x00004400 Normal 0x0000C400 method name for DOES (SvSCREAM) 0x40004400 FBM compiled (SvVALID) - 0x4000C400 pad name. + 0x4000C400 *** Formerly used for pad names *** 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 */ @@ -474,7 +471,6 @@ perform the upgrade if necessary. See C. /* 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 */ \ @@ -504,9 +500,8 @@ union _xivu { 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; @@ -813,13 +808,18 @@ C instead of the lvalue assignment to C. Set the value of the NV pointer in sv 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. +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. @@ -863,7 +863,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 +872,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), \ @@ -904,6 +904,9 @@ 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 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. @@ -1144,47 +1147,6 @@ sv_force_normal does nothing. #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) -#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 - #define SvRVx(sv) SvRV(sv) #ifdef PERL_DEBUG_COW @@ -1267,8 +1229,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) \ @@ -1866,6 +1826,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 +1870,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 \ @@ -1937,8 +1881,7 @@ mg.c:1024: warning: left-hand operand of comma expression has no effect # define SV_COW_REFCNT_MAX ((1 << sizeof(U8)*8) - 1) # 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) @@ -2205,23 +2148,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 -Reads into I the offset from SvPVX back to the true start of the +Reads into C the offset from SvPVX 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 */ @@ -2320,11 +2261,5 @@ 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: - * * ex: set ts=8 sts=4 sw=4 et: */