From 33dd4d2c9eda6856877f1f4402289819be9a98db Mon Sep 17 00:00:00 2001 From: Richard Leach Date: Mon, 7 Jun 2021 00:35:38 +0100 Subject: [PATCH 1/2] av_create_and_push/unshift_one: remove experimental flag --- embed.fnc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embed.fnc b/embed.fnc index 93801ec41f7b..b0b8bfbd68d0 100644 --- a/embed.fnc +++ b/embed.fnc @@ -639,7 +639,7 @@ ApdR |AV* |av_make |SSize_t size|NN SV **strp ApdR |AV* |av_new_alloc |SSize_t size|bool zeroflag p |SV* |av_nonelem |NN AV *av|SSize_t ix Apd |SV* |av_pop |NN AV *av -Apdoex |void |av_create_and_push|NN AV **const avp|NN SV *const val +Apdoe |void |av_create_and_push|NN AV **const avp|NN SV *const val Apd |void |av_push |NN AV *av|NN SV *val : Used in scope.c, and by Data::Alias EXp |void |av_reify |NN AV *av @@ -649,7 +649,7 @@ AmdR |SSize_t|av_top_index |NN AV *av AidRp |Size_t |av_count |NN AV *av AmdR |SSize_t|av_tindex |NN AV *av Apd |void |av_undef |NN AV *av -Apdoex |SV** |av_create_and_unshift_one|NN AV **const avp|NN SV *const val +Apdoe |SV** |av_create_and_unshift_one|NN AV **const avp|NN SV *const val Apd |void |av_unshift |NN AV *av|SSize_t num Cpo |SV** |av_arylen_p |NN AV *av Cpo |IV* |av_iter_p |NN AV *av From e397a6f2612a822def315f61e32cddaeb4d33b38 Mon Sep 17 00:00:00 2001 From: Richard Leach Date: Mon, 7 Jun 2021 01:05:55 +0100 Subject: [PATCH 2/2] av_create_and_push/unshift_one: faster create via newAV_alloc_xz --- av.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/av.c b/av.c index afac896dda8d..05311ba0a164 100644 --- a/av.c +++ b/av.c @@ -639,9 +639,11 @@ Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val) { PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH; - if (!*avp) - *avp = newAV(); - av_push(*avp, val); + if (!*avp) { + *avp = newAV_alloc_xz(4); + AvARRAY(*avp)[ ++AvFILLp(*avp) ] = val; + } else + av_push(*avp, val); } /* @@ -728,10 +730,14 @@ Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val) { PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE; - if (!*avp) - *avp = newAV(); - av_unshift(*avp, 1); - return av_store(*avp, 0, val); + if (!*avp) { + *avp = newAV_alloc_xz(4); + AvARRAY(*avp)[ ++AvFILLp(*avp) ] = val; + return val; + } else { + av_unshift(*avp, 1); + return av_store(*avp, 0, val); + } } /*