This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
make it an error to look for magic hv backref
authorDavid Mitchell <davem@iabyn.com>
Mon, 5 Jul 2010 20:11:21 +0000 (21:11 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 14 Jul 2010 22:06:17 +0000 (23:06 +0100)
Now that we only store a stash's backref AV in xhv_backreferences,
make it a panic if we don't find it there, rather than falling back to
look for backref magic.

sv.c

diff --git a/sv.c b/sv.c
index c841dc9..4ca7333 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -5373,14 +5373,16 @@ Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
 
     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
 
-    if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
-       av = *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 (!av) {
+    if (SvTYPE(tsv) == SVt_PVHV) {
+       if (SvOOK(tsv)) {
+           /* SvOOK: We must avoid creating the hv_aux structure if its
+            * not already there, as that is stored in the main HvARRAY(),
+            * and hfreentries assumes that no-one reallocates HvARRAY()
+            * while it is running.  */
+           av = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
+       }
+    }
+    else {
        const MAGIC *const mg
            = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
        if (mg)