Skip to content

Commit

Permalink
Merge ff11f44 into 1005e8f
Browse files Browse the repository at this point in the history
  • Loading branch information
richardleach committed May 6, 2021
2 parents 1005e8f + ff11f44 commit 3509302
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 2 deletions.
33 changes: 33 additions & 0 deletions av.c
Expand Up @@ -393,6 +393,39 @@ Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
return &ary[key];
}

/*
=for apidoc av_new_alloc
Creates a new AV and allocates its SV* array.
This is similar to but more efficient than doing:
AV *av = newAV();
av_extend(av, key);
The zeroflag parameter controls whether the array is NULL initialized.
=cut
*/

AV *
Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag)
{
AV * const av = newAV();
SV** ary;
PERL_ARGS_ASSERT_AV_NEW_ALLOC;

Newx(ary, size, SV*);
AvALLOC(av) = ary;
AvARRAY(av) = ary;
AvMAX(av) = size - 1;

if (zeroflag)
Zero(ary, size, SV*);

return av;
}

/*
=for apidoc av_make
Expand Down
20 changes: 20 additions & 0 deletions av.h
Expand Up @@ -108,6 +108,26 @@ Perl equivalent: C<my @array;>.

#define newAV() MUTABLE_AV(newSV_type(SVt_PVAV))

/*
=for apidoc newAV_alloc_x
Similar to newAV(), but the SV* array is also allocated.
This is similar to but more efficient than doing:
AV *av = newAV();
av_extend(av, key);
Note that these the actual size requested is allocated. This is unlike
av_extend(), which enforces a minimum size of 3, and always does a +1
to the requested/minimum size when allocating.
=cut
*/

#define newAV_alloc_x(key) av_new_alloc(key,0)
#define newAV_alloc_xz(key) av_new_alloc(key,1)

/*
* ex: set ts=8 sts=4 sw=4 et:
*/
3 changes: 3 additions & 0 deletions embed.fnc
Expand Up @@ -636,6 +636,7 @@ ApdR |SV** |av_fetch |NN AV *av|SSize_t key|I32 lval
Apd |void |av_fill |NN AV *av|SSize_t fill
ApdR |SSize_t|av_len |NN AV *av
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
Expand Down Expand Up @@ -1459,6 +1460,8 @@ Apx |CV * |newXS_flags |NULLOK const char *name|NN XSUBADDR_t subaddr\
ApdU |CV* |newXS |NULLOK const char *name|NN XSUBADDR_t subaddr\
|NN const char *filename
ApMdbR |AV* |newAV
AmdR |AV* |newAV_alloc_x |SSize_t key
AmdR |AV* |newAV_alloc_xz |SSize_t key
ApR |OP* |newAVREF |NN OP* o
ApdR |OP* |newBINOP |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
ApR |OP* |newCVREF |I32 flags|NULLOK OP* o
Expand Down
1 change: 1 addition & 0 deletions embed.h
Expand Up @@ -62,6 +62,7 @@
#define av_fill(a,b) Perl_av_fill(aTHX_ a,b)
#define av_len(a) Perl_av_len(aTHX_ a)
#define av_make(a,b) Perl_av_make(aTHX_ a,b)
#define av_new_alloc(a,b) Perl_av_new_alloc(aTHX_ a,b)
#define av_pop(a) Perl_av_pop(aTHX_ a)
#define av_push(a,b) Perl_av_push(aTHX_ a,b)
#define av_shift(a) Perl_av_shift(aTHX_ a)
Expand Down
4 changes: 2 additions & 2 deletions pp_hot.c
Expand Up @@ -4975,8 +4975,8 @@ Perl_clear_defarray(pTHX_ AV* av, bool abandon)
AvREIFY_only(av);
}
else {
AV *newav = newAV();
av_extend(newav, fill);
/* fill can be -1. The ternary gives consistency with av_extend() */
AV *newav = newAV_alloc_xz(fill < 3 ? 4 : fill);
AvREIFY_only(newav);
PAD_SVl(0) = MUTABLE_SV(newav);
SvREFCNT_dec_NN(av);
Expand Down
12 changes: 12 additions & 0 deletions proto.h
Expand Up @@ -285,6 +285,10 @@ PERL_CALLCONV AV* Perl_av_make(pTHX_ SSize_t size, SV **strp)
#define PERL_ARGS_ASSERT_AV_MAKE \
assert(strp)

PERL_CALLCONV AV* Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag)
__attribute__warn_unused_result__;
#define PERL_ARGS_ASSERT_AV_NEW_ALLOC

PERL_CALLCONV SV* Perl_av_nonelem(pTHX_ AV *av, SSize_t ix);
#define PERL_ARGS_ASSERT_AV_NONELEM \
assert(av)
Expand Down Expand Up @@ -2239,6 +2243,14 @@ PERL_CALLCONV OP* Perl_newAVREF(pTHX_ OP* o)
#define PERL_ARGS_ASSERT_NEWAVREF \
assert(o)

/* PERL_CALLCONV AV* newAV_alloc_x(pTHX_ SSize_t key)
__attribute__warn_unused_result__; */
#define PERL_ARGS_ASSERT_NEWAV_ALLOC_X

/* PERL_CALLCONV AV* newAV_alloc_xz(pTHX_ SSize_t key)
__attribute__warn_unused_result__; */
#define PERL_ARGS_ASSERT_NEWAV_ALLOC_XZ

PERL_CALLCONV OP* Perl_newBINOP(pTHX_ I32 type, I32 flags, OP* first, OP* last)
__attribute__warn_unused_result__;
#define PERL_ARGS_ASSERT_NEWBINOP
Expand Down

0 comments on commit 3509302

Please sign in to comment.