diff options
-rw-r--r-- | dump.c | 6 | ||||
-rw-r--r-- | ext/Hash-Util/Util.xs | 2 | ||||
-rw-r--r-- | ext/Hash-Util/lib/Hash/Util.pm | 2 | ||||
-rw-r--r-- | gv.c | 8 | ||||
-rw-r--r-- | hv.c | 48 | ||||
-rw-r--r-- | hv.h | 24 | ||||
-rw-r--r-- | mro_core.c | 4 | ||||
-rw-r--r-- | scope.c | 10 | ||||
-rw-r--r-- | sv.c | 16 |
9 files changed, 59 insertions, 61 deletions
@@ -2091,7 +2091,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo break; case SVt_PVHV: { U32 totalkeys; - if (SvOOK(sv)) { + if (HvHasAUX(sv)) { struct xpvhv_aux *const aux = HvAUX(sv); Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %" UVuf "\n", (UV)aux->xhv_aux_flags); @@ -2175,7 +2175,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo } Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n", (IV)HvMAX(sv)); - if (SvOOK(sv)) { + if (HvHasAUX(sv)) { Perl_dump_indent(aTHX_ level, file, " RITER = %" IVdf "\n", (IV)HvRITER_get(sv)); Perl_dump_indent(aTHX_ level, file, " EITER = 0x%" UVxf "\n", @@ -2205,7 +2205,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo HvNAMELEN(sv), HvNAMEUTF8(sv))); } } - if (SvOOK(sv)) { + if (HvHasAUX(sv)) { AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv)); struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta; diff --git a/ext/Hash-Util/Util.xs b/ext/Hash-Util/Util.xs index 4e49a095e3..b266f4a81c 100644 --- a/ext/Hash-Util/Util.xs +++ b/ext/Hash-Util/Util.xs @@ -115,7 +115,7 @@ hash_traversal_mask(rhv, ...) if (items>1) { hv_rand_set(hv, SvUV(ST(1))); } - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { XSRETURN_UV(HvRAND_get(hv)); } else { XSRETURN_UNDEF; diff --git a/ext/Hash-Util/lib/Hash/Util.pm b/ext/Hash-Util/lib/Hash/Util.pm index 0b42922c96..f2c6df690e 100644 --- a/ext/Hash-Util/lib/Hash/Util.pm +++ b/ext/Hash-Util/lib/Hash/Util.pm @@ -42,7 +42,7 @@ our @EXPORT_OK = qw( BEGIN { # make sure all our XS routines are available early so their prototypes # are correctly applied in the following code. - our $VERSION = '0.28'; + our $VERSION = '0.29'; require XSLoader; XSLoader::load(); } @@ -2769,7 +2769,7 @@ Perl_gv_check(pTHX_ HV *stash) PERL_ARGS_ASSERT_GV_CHECK; - if (!SvOOK(stash)) + if (!HvHasAUX(stash)) return; assert(HvARRAY(stash)); @@ -2788,7 +2788,7 @@ Perl_gv_check(pTHX_ HV *stash) (gv = MUTABLE_GV(HeVAL(entry))) && isGV(gv) && (hv = GvHV(gv))) { if (hv != PL_defstash && hv != stash - && !(SvOOK(hv) + && !(HvHasAUX(hv) && (HvAUX(hv)->xhv_aux_flags & HvAUXf_SCAN_STASH)) ) gv_check(hv); /* nested package */ @@ -3183,7 +3183,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash, bool destructing) filled = 1; } - assert(SvOOK(stash)); + assert(HvHasAUX(stash)); /* initially assume the worst */ HvAUX(stash)->xhv_aux_flags &= ~HvAUXf_NO_DEREF; @@ -3479,7 +3479,7 @@ Perl_amagic_deref_call(pTHX_ SV *ref, int method) { return ref; /* return quickly if none of the deref ops are overloaded */ stash = SvSTASH(SvRV(ref)); - assert(SvOOK(stash)); + assert(HvHasAUX(stash)); if (HvAUX(stash)->xhv_aux_flags & HvAUXf_NO_DEREF) return ref; @@ -1016,7 +1016,7 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, *oentry = entry; } #ifdef PERL_HASH_RANDOMIZE_KEYS - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { /* Currently this makes various tests warn in annoying ways. * So Silenced for now. - Yves | bogus end of comment =>* / if (HvAUX(hv)->xhv_riter != -1) { @@ -1432,11 +1432,11 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, else { HeVAL(entry) = NULL; *oentry = HeNEXT(entry); - if (SvOOK(hv) && entry == HvAUX(hv)->xhv_eiter /* HvEITER(hv) */) { + if (HvHasAUX(hv) && entry == HvAUX(hv)->xhv_eiter /* HvEITER(hv) */) { HvLAZYDEL_on(hv); } else { - if (SvOOK(hv) && HvLAZYDEL(hv) && + if (HvHasAUX(hv) && HvLAZYDEL(hv) && entry == HeNEXT(HvAUX(hv)->xhv_eiter)) HeNEXT(HvAUX(hv)->xhv_eiter) = HeNEXT(entry); hv_free_ent(NULL, entry); @@ -1602,7 +1602,7 @@ static bool S_large_hash_heuristic(pTHX_ HV *hv, STRLEN size) { if (size > 42 && !SvOBJECT(hv) - && !(SvOOK(hv) && HvENAME_get(hv))) { + && !(HvHasAUX(hv) && HvENAME_get(hv))) { /* This hash appears to be growing quite large. We gamble that it is not sharing keys with other hashes. */ return TRUE; @@ -1745,11 +1745,11 @@ Perl_hv_ksplit(pTHX_ HV *hv, IV newmax) a = (char *) HvARRAY(hv); if (a) { #ifdef PERL_HASH_RANDOMIZE_KEYS - U32 was_ook = SvOOK(hv); + U32 was_ook = HvHasAUX(hv); #endif hsplit(hv, oldsize, newsize); #ifdef PERL_HASH_RANDOMIZE_KEYS - if (was_ook && SvOOK(hv) && HvTOTALKEYS(hv)) { + if (was_ook && HvHasAUX(hv) && HvTOTALKEYS(hv)) { MAYBE_UPDATE_HASH_RAND_BITS(); HvAUX(hv)->xhv_rand = (U32)PL_hash_rand_bits; } @@ -2047,7 +2047,7 @@ Perl_hv_clear(pTHX_ HV *hv) HvHASKFLAGS_off(hv); } - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { if(HvENAME_get(hv)) mro_isa_changed_in(hv); HvEITER_set(hv, NULL); @@ -2108,7 +2108,7 @@ S_clear_placeholders(pTHX_ HV *hv, const U32 placeholders) if (entry == HvEITER_get(hv)) HvLAZYDEL_on(hv); else { - if (SvOOK(hv) && HvLAZYDEL(hv) && + if (HvHasAUX(hv) && HvLAZYDEL(hv) && entry == HeNEXT(HvAUX(hv)->xhv_eiter)) HeNEXT(HvAUX(hv)->xhv_eiter) = HeNEXT(entry); hv_free_ent(NULL, entry); @@ -2167,7 +2167,7 @@ Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp) PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY; - if (SvOOK(hv) && ((iter = HvAUX(hv)))) { + if (HvHasAUX(hv) && ((iter = HvAUX(hv)))) { if ((entry = iter->xhv_eiter)) { /* the iterator may get resurrected after each * destructor call, so check each time */ @@ -2272,7 +2272,7 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags) HE* that needs to be explicitly freed. */ hv_free_entries(hv); - /* SvOOK() is true for a hash if it has struct xpvhv_aux allocated. That + /* HvHasAUX() is true for a hash if it has struct xpvhv_aux allocated. That structure has several other pieces of allocated memory - hence those must be freed before the structure itself can be freed. Some can be freed when a hash is "undefined" (this function), but some must persist until it is @@ -2285,7 +2285,7 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags) must remain consistent, because this code can no longer clear SVf_OOK, meaning that this structure might be read again at any point in the future without further checks or reinitialisation. */ - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { struct mro_meta *meta; const char *name; @@ -2407,7 +2407,7 @@ S_hv_auxinit(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_AUXINIT; - if (!SvOOK(hv)) { + if (!HvHasAUX(hv)) { char *array = (char *) HvARRAY(hv); if (!array) { Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1), char); @@ -2455,7 +2455,7 @@ Perl_hv_iterinit(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_ITERINIT; - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { struct xpvhv_aux * iter = HvAUX(hv); HE * const entry = iter->xhv_eiter; /* HvEITER(hv) */ if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */ @@ -2489,7 +2489,7 @@ Perl_hv_riter_p(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_RITER_P; - iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv); + iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv); return &(iter->xhv_riter); } @@ -2507,7 +2507,7 @@ Perl_hv_eiter_p(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_EITER_P; - iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv); + iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv); return &(iter->xhv_eiter); } @@ -2525,7 +2525,7 @@ Perl_hv_riter_set(pTHX_ HV *hv, I32 riter) { PERL_ARGS_ASSERT_HV_RITER_SET; - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { iter = HvAUX(hv); } else { if (riter == -1) @@ -2543,7 +2543,7 @@ Perl_hv_rand_set(pTHX_ HV *hv, U32 new_xhv_rand) { PERL_ARGS_ASSERT_HV_RAND_SET; #ifdef PERL_HASH_RANDOMIZE_KEYS - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { iter = HvAUX(hv); } else { iter = hv_auxinit(hv); @@ -2568,7 +2568,7 @@ Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter) { PERL_ARGS_ASSERT_HV_EITER_SET; - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { iter = HvAUX(hv); } else { /* 0 is the default so don't go malloc()ing a new structure just to @@ -2618,7 +2618,7 @@ Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags) if (len > I32_MAX) Perl_croak(aTHX_ "panic: hv name too long (%" UVuf ")", (UV) len); - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { iter = HvAUX(hv); if (iter->xhv_name_u.xhvnameu_name) { if(iter->xhv_name_count) { @@ -2714,7 +2714,7 @@ table. void Perl_hv_ename_add(pTHX_ HV *hv, const char *name, U32 len, U32 flags) { - struct xpvhv_aux *aux = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv); + struct xpvhv_aux *aux = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv); U32 hash; PERL_ARGS_ASSERT_HV_ENAME_ADD; @@ -2784,7 +2784,7 @@ Perl_hv_ename_delete(pTHX_ HV *hv, const char *name, U32 len, U32 flags) if (len > I32_MAX) Perl_croak(aTHX_ "panic: hv name too long (%" UVuf ")", (UV) len); - if (!SvOOK(hv)) return; + if (!HvHasAUX(hv)) return; aux = HvAUX(hv); if (!aux->xhv_name_u.xhvnameu_name) return; @@ -2844,7 +2844,7 @@ Perl_hv_backreferences_p(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_BACKREFERENCES_P; /* See also Perl_sv_get_backrefs in sv.c where this logic is unrolled */ { - struct xpvhv_aux * const iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv); + struct xpvhv_aux * const iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv); return &(iter->xhv_backreferences); } } @@ -2855,7 +2855,7 @@ Perl_hv_kill_backrefs(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_KILL_BACKREFS; - if (!SvOOK(hv)) + if (!HvHasAUX(hv)) return; av = HvAUX(hv)->xhv_backreferences; @@ -2910,7 +2910,7 @@ Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags) PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS; - if (!SvOOK(hv)) { + if (!HvHasAUX(hv)) { /* Too many things (well, pp_each at least) merrily assume that you can call hv_iternext without calling hv_iterinit, so we'll have to deal with it. */ @@ -303,10 +303,10 @@ whether it is valid to call C<HvAUX()>. #define HvEITER(hv) (*Perl_hv_eiter_p(aTHX_ MUTABLE_HV(hv))) #define HvRITER_set(hv,r) Perl_hv_riter_set(aTHX_ MUTABLE_HV(hv), r) #define HvEITER_set(hv,e) Perl_hv_eiter_set(aTHX_ MUTABLE_HV(hv), e) -#define HvRITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_riter : -1) -#define HvEITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : NULL) -#define HvRAND_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_rand : 0) -#define HvLASTRAND_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_last_rand : 0) +#define HvRITER_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_riter : -1) +#define HvEITER_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_eiter : NULL) +#define HvRAND_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_rand : 0) +#define HvLASTRAND_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_last_rand : 0) #define HvNAME(hv) HvNAME_get(hv) #define HvNAMELEN(hv) HvNAMELEN_get(hv) @@ -327,15 +327,15 @@ whether it is valid to call C<HvAUX()>. ) /* This macro may go away without notice. */ #define HvNAME_HEK(hv) \ - (SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvNAME_HEK_NN(hv) : NULL) + (HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvNAME_HEK_NN(hv) : NULL) #define HvNAME_get(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ + ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ ? HEK_KEY(HvNAME_HEK_NN(hv)) : NULL) #define HvNAMELEN_get(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ + ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ ? HEK_LEN(HvNAME_HEK_NN(hv)) : 0) #define HvNAMEUTF8(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ + ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ ? HEK_UTF8(HvNAME_HEK_NN(hv)) : 0) #define HvENAME_HEK_NN(hv) \ ( \ @@ -345,15 +345,15 @@ whether it is valid to call C<HvAUX()>. HvAUX(hv)->xhv_name_u.xhvnameu_name \ ) #define HvENAME_HEK(hv) \ - (SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvENAME_HEK_NN(hv) : NULL) + (HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvENAME_HEK_NN(hv) : NULL) #define HvENAME_get(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ + ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ ? HEK_KEY(HvENAME_HEK_NN(hv)) : NULL) #define HvENAMELEN_get(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ + ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ ? HEK_LEN(HvENAME_HEK_NN(hv)) : 0) #define HvENAMEUTF8(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ + ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ ? HEK_UTF8(HvENAME_HEK_NN(hv)) : 0) /* diff --git a/mro_core.c b/mro_core.c index 235dacaec7..042ed673e8 100644 --- a/mro_core.c +++ b/mro_core.c @@ -415,7 +415,7 @@ Perl_mro_get_linear_isa(pTHX_ HV *stash) AV *isa; PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA; - if(!SvOOK(stash)) + if(!HvHasAUX(stash)) Perl_croak(aTHX_ "Can't linearize anonymous symbol table"); meta = HvMROMETA(stash); @@ -792,7 +792,7 @@ Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash, *svp != (SV *)gv ) return; } - assert(SvOOK(GvSTASH(gv))); + assert(HvHasAUX(GvSTASH(gv))); assert(GvNAMELEN(gv)); assert(GvNAME(gv)[GvNAMELEN(gv) - 1] == ':'); assert(GvNAMELEN(gv) == 1 || GvNAME(gv)[GvNAMELEN(gv) - 2] == ':'); @@ -1396,12 +1396,10 @@ Perl_leave_scope(pTHX_ I32 base) if (SvREADONLY(sv)) SvREADONLY_off(sv); - if (SvOOK(sv)) { /* OOK or HvAUX */ - if (SvTYPE(sv) == SVt_PVHV) - Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv)); - else - sv_backoff(sv); - } + if (SvTYPE(sv) == SVt_PVHV && HvHasAUX(sv)) + Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv)); + else if(SvOOK(sv)) + sv_backoff(sv); if (SvMAGICAL(sv)) { /* note that backrefs (either in HvAUX or magic) @@ -1206,7 +1206,7 @@ Perl_hv_auxalloc(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_AUXALLOC; assert(SvTYPE(hv) == SVt_PVHV); - assert(!SvOOK(hv)); + assert(!HvHasAUX(hv)); #ifdef PURIFY new_body = new_NOARENAZ(&fake_hv_with_aux); @@ -1230,7 +1230,7 @@ Perl_hv_auxalloc(pTHX_ HV *hv) { #endif SvANY(hv) = (XPVHV *) new_body; - SvOOK_on(hv); + SvFLAGS(hv) |= SVphv_HasAUX; return HvAUX(hv); } @@ -6011,7 +6011,7 @@ Perl_sv_get_backrefs(SV *const sv) /* find slot to store array or singleton backref */ if (SvTYPE(sv) == SVt_PVHV) { - if (SvOOK(sv)) { + if (HvHasAUX(sv)) { struct xpvhv_aux * const iter = HvAUX((HV *)sv); backrefs = (SV *)iter->xhv_backreferences; } @@ -6118,7 +6118,7 @@ Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv) PERL_ARGS_ASSERT_SV_DEL_BACKREF; if (SvTYPE(tsv) == SVt_PVHV) { - if (SvOOK(tsv)) + if (HvHasAUX(tsv)) svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv)); } else if (SvIS_FREED(tsv) && PL_phase == PERL_PHASE_DESTRUCT) { @@ -6841,7 +6841,7 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) U32 arena_index; const struct body_details *sv_type_details; - if (type == SVt_PVHV && SvOOK(sv)) { + if (type == SVt_PVHV && HvHasAUX(sv)) { arena_index = HVAUX_ARENA_ROOT_IX; sv_type_details = &fake_hv_with_aux; } @@ -6963,7 +6963,7 @@ S_curse(pTHX_ SV * const sv, const bool check_refcnt) { CV* destructor = NULL; struct mro_meta *meta; - assert (SvOOK(stash)); + assert (HvHasAUX(stash)); DEBUG_o( Perl_deb(aTHX_ "Looking for DESTROY method for %s\n", HvNAME(stash)) ); @@ -14371,7 +14371,7 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param) break; case SVt_PVHV: - if (SvOOK(ssv)) { + if (HvHasAUX(ssv)) { sv_type_details = &fake_hv_with_aux; #ifdef PURIFY new_body = new_NOARENA(sv_type_details); @@ -14555,7 +14555,7 @@ S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param) ? he_dup(source, FALSE, param) : 0; ++i; } - if (SvOOK(ssv)) { + if (HvHasAUX(ssv)) { const struct xpvhv_aux * const saux = HvAUX(ssv); struct xpvhv_aux * const daux = HvAUX(dsv); /* This flag isn't copied. */ |