From 7faeda8ddb4f17c21f1c05bb349464a70a4358de Mon Sep 17 00:00:00 2001 From: Richard Leach Date: Mon, 19 Apr 2021 21:28:01 +0100 Subject: [PATCH] Perl_clear_defarray: faster array creation via new macro+function --- av.c | 2 +- pp_hot.c | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/av.c b/av.c index 041fc32ac32b..afac896dda8d 100644 --- a/av.c +++ b/av.c @@ -418,7 +418,7 @@ Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag) AV * const av = newAV(); SV** ary; PERL_ARGS_ASSERT_AV_NEW_ALLOC; - assert(size > 1); + assert(size > 0); Newx(ary, size, SV*); /* Newx performs the memwrap check */ AvALLOC(av) = ary; diff --git a/pp_hot.c b/pp_hot.c index 5119638b9ff6..e7f688ad1b97 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -4966,8 +4966,6 @@ PP(pp_leavesub) void Perl_clear_defarray(pTHX_ AV* av, bool abandon) { - const SSize_t fill = AvFILLp(av); - PERL_ARGS_ASSERT_CLEAR_DEFARRAY; if (LIKELY(!abandon && SvREFCNT(av) == 1 && !SvMAGICAL(av))) { @@ -4975,8 +4973,9 @@ Perl_clear_defarray(pTHX_ AV* av, bool abandon) AvREIFY_only(av); } else { - AV *newav = newAV(); - av_extend(newav, fill); + const SSize_t size = AvFILLp(av) + 1; + /* The ternary gives consistency with av_extend() */ + AV *newav = newAV_alloc_x(size < 4 ? 4 : size); AvREIFY_only(newav); PAD_SVl(0) = MUTABLE_SV(newav); SvREFCNT_dec_NN(av);