From 6662c9a722f53ebc65b51c61fe887a2e8b6b479c Mon Sep 17 00:00:00 2001 From: Father Chrysostomos Date: Thu, 8 Sep 2011 22:49:12 -0700 Subject: Collapse some code in shared.xs In the previous commit, I added duplicate code to make it obvious what was going on. --- dist/threads-shared/shared.xs | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) (limited to 'dist') diff --git a/dist/threads-shared/shared.xs b/dist/threads-shared/shared.xs index 17cb645d43..58afefb7f5 100644 --- a/dist/threads-shared/shared.xs +++ b/dist/threads-shared/shared.xs @@ -1064,32 +1064,16 @@ sharedsv_array_mg_CLEAR(pTHX_ SV *sv, MAGIC *mg) { dTHXc; SV *ssv = (SV *) mg->mg_ptr; + const bool isav = SvTYPE(ssv) == SVt_PVAV; PERL_UNUSED_ARG(sv); SHARED_EDIT; - if (SvTYPE(ssv) == SVt_PVAV) { - if (!PL_dirty) { - SV **svp = AvARRAY((AV *)ssv); - I32 items = AvFILLp((AV *)ssv) + 1; - while (items--) { - SV *sv = *svp++; - if (!sv) continue; - if ( (SvOBJECT(sv) || (SvROK(sv) && (sv = SvRV(sv)))) - && SvREFCNT(sv) == 1 ) { - SV *tmp = Perl_sv_newmortal(caller_perl); - PERL_SET_CONTEXT((aTHX = caller_perl)); - sv_upgrade(tmp, SVt_RV); - get_RV(tmp, sv); - PERL_SET_CONTEXT((aTHX = PL_sharedsv_space)); - } - } - } - av_clear((AV*) ssv); - } else { - if (!PL_dirty) { + if (!PL_dirty) { + SV **svp = isav ? AvARRAY((AV *)ssv) : NULL; + I32 items = isav ? AvFILLp((AV *)ssv) + 1 : 0; HE *iter; - hv_iterinit((HV *)ssv); - while ((iter = hv_iternext((HV *)ssv))) { - SV *sv = HeVAL(iter); + if (!isav) hv_iterinit((HV *)ssv); + while (isav ? items-- : !!(iter = hv_iternext((HV *)ssv))) { + SV *sv = isav ? *svp++ : HeVAL(iter); if (!sv) continue; if ( (SvOBJECT(sv) || (SvROK(sv) && (sv = SvRV(sv)))) && SvREFCNT(sv) == 1 ) { @@ -1100,9 +1084,9 @@ sharedsv_array_mg_CLEAR(pTHX_ SV *sv, MAGIC *mg) PERL_SET_CONTEXT((aTHX = PL_sharedsv_space)); } } - } - hv_clear((HV*) ssv); } + if (isav) av_clear((AV*) ssv); + else hv_clear((HV*) ssv); SHARED_RELEASE; return (0); } -- cgit v1.2.1