diff options
-rw-r--r-- | hv.c | 6 | ||||
-rw-r--r-- | sv.c | 6 |
2 files changed, 6 insertions, 6 deletions
@@ -1678,8 +1678,10 @@ S_hfreeentries(pTHX_ HV *hv) * If, during the entry freeing, a destructor happens to add * a new weak backref, then sv_add_backref will look in both * places (magic in HvAUX) for the AV, but will create a new - * AV in HvAUX if it can't find one. So at the end of the - * iteration we have to allow for this. */ + * AV in HvAUX if it can't find one (if it finds it in magic, + * it moves it back into HvAUX. So at the end of the iteration + * we have to allow for this. */ + if (iter->xhv_backreferences) { if (SvTYPE(iter->xhv_backreferences) == SVt_PVAV) { @@ -5310,6 +5310,8 @@ Perl_sv_rvweaken(pTHX_ SV *const sv) * store it directly in the HvAUX or mg_obj slot, avoiding the need to * allocate an AV. (Whether the slot holds an AV tells us whether this is * active.) + * + * If an HV's backref is stored in magic, it is moved back to HvAUX. */ /* A discussion about the backreferences array and its refcount: @@ -5420,10 +5422,6 @@ Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv) if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) { svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv)); - /* We mustn't attempt to "fix up" the hash here by moving the - backreference array back to the hv_aux structure, as that is stored - in the main HvARRAY(), and hfreentries assumes that no-one - reallocates HvARRAY() while it is running. */ } if (!svp || !*svp) { MAGIC *const mg |