diff options
author | Adrian M. Enache <enache@rdslink.ro> | 2003-12-20 21:32:37 +0000 |
---|---|---|
committer | Enache Adrian <enache@rdslink.ro> | 2003-12-20 21:32:37 +0000 |
commit | fdc9a8133c4fc01dd144b5bec5fdcd27115b9782 (patch) | |
tree | 9e5b35dd36ad18fb5b0946381e44a0d662edf669 /sv.c | |
parent | 823a69961924ac9218a5eb5cbdeedc3389c85b19 (diff) | |
download | perl-fdc9a8133c4fc01dd144b5bec5fdcd27115b9782.tar.gz |
fix [perl #24660], [perl #24663].
p4raw-id: //depot/perl@21936
Diffstat (limited to 'sv.c')
-rw-r--r-- | sv.c | 36 |
1 files changed, 14 insertions, 22 deletions
@@ -5137,15 +5137,13 @@ S_sv_add_backref(pTHX_ SV *tsv, SV *sv) * by magic_killbackrefs() when tsv is being freed */ } if (AvFILLp(av) >= AvMAX(av)) { + I32 i; SV **svp = AvARRAY(av); - I32 i = AvFILLp(av); - while (i >= 0) { - if (svp[i] == &PL_sv_undef) { + for (i = AvFILLp(av); i >= 0; i--) + if (!svp[i]) { svp[i] = sv; /* reuse the slot */ return; } - i--; - } av_extend(av, AvFILLp(av)+1); } AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */ @@ -5167,13 +5165,8 @@ S_sv_del_backref(pTHX_ SV *sv) Perl_croak(aTHX_ "panic: del_backref"); av = (AV *)mg->mg_obj; svp = AvARRAY(av); - i = AvFILLp(av); - while (i >= 0) { - if (svp[i] == sv) { - svp[i] = &PL_sv_undef; /* XXX */ - } - i--; - } + for (i = AvFILLp(av); i >= 0; i--) + if (svp[i] == sv) svp[i] = Nullsv; } /* @@ -9799,16 +9792,15 @@ Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param) nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param); } else if(mg->mg_type == PERL_MAGIC_backref) { - AV *av = (AV*) mg->mg_obj; - SV **svp; - I32 i; - nmg->mg_obj = (SV*)newAV(); - svp = AvARRAY(av); - i = AvFILLp(av); - while (i >= 0) { - av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param)); - i--; - } + AV *av = (AV*) mg->mg_obj; + SV **svp; + I32 i; + SvREFCNT_inc(nmg->mg_obj = (SV*)newAV()); + svp = AvARRAY(av); + for (i = AvFILLp(av); i >= 0; i--) { + if (!svp[i] || SvREFCNT(svp[i]) < 2) continue; + av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param)); + } } else { nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED) |