Skip to content

Commit

Permalink
Assert that backreferences array is not freed rather than handling it
Browse files Browse the repository at this point in the history
In several places where the weakrefs backreferences array is used
or freed, the code checks whether the array has already been freed
and if so skips. Since the array already being freed is a bad bug,
lets instead assert that this never happens, based on the
assumptions that (a) such premature freeing bugs are likely ironed
out by now, (b) if they aren't then we want to know about them and
fix them rather than silently skip.

p4raw-id: //depot/perl@34210
  • Loading branch information
Dave Mitchell committed Aug 20, 2008
1 parent b17f5ab commit 41fae7a
Showing 1 changed file with 5 additions and 9 deletions.
14 changes: 5 additions & 9 deletions sv.c
Expand Up @@ -5086,14 +5086,11 @@ S_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
if (mg)
av = (AV *)mg->mg_obj;
}
if (!av) {
if (PL_in_clean_all)
return;

if (!av)
Perl_croak(aTHX_ "panic: del_backref");
}

if (SvIS_FREED(av))
return;
assert(!SvIS_FREED(av));

svp = AvARRAY(av);
/* We shouldn't be in here more than once, but for paranoia reasons lets
Expand Down Expand Up @@ -5123,9 +5120,8 @@ Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
PERL_UNUSED_ARG(sv);

/* Not sure why the av can get freed ahead of its sv, but somehow it does
in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
if (svp && !SvIS_FREED(av)) {
assert(!svp || !SvIS_FREED(av));
if (svp) {
SV *const *const last = svp + AvFILLp(av);

while (svp <= last) {
Expand Down

0 comments on commit 41fae7a

Please sign in to comment.