Provide padname_dup_inc() and padnamelist_dup_inc()

This commit is contained in:
Paul "LeoNerd" Evans 2023-02-13 14:37:10 +00:00 committed by Paul Evans
parent 45826d9c09
commit e7faea5438
3 changed files with 15 additions and 5 deletions

View File

@ -3525,6 +3525,13 @@ Perl_padname_refcnt_inc(PADNAME *pn)
return pn;
}
PERL_STATIC_INLINE PADNAMELIST *
Perl_padnamelist_refcnt_inc(PADNAMELIST *pnl)
{
PadnamelistREFCNT(pnl)++;
return pnl;
}
/* copy a string to a safe spot */
/*

7
pad.c
View File

@ -2504,9 +2504,7 @@ Perl_padlist_dup(pTHX_ PADLIST *srcpad, CLONE_PARAMS *param)
PadlistMAX(dstpad) = max;
Newx(PadlistARRAY(dstpad), max + 1, PAD *);
PadlistARRAY(dstpad)[0] = (PAD *)
padnamelist_dup(PadlistNAMES(srcpad), param);
PadnamelistREFCNT(PadlistNAMES(dstpad))++;
PadlistARRAY(dstpad)[0] = (PAD *)padnamelist_dup_inc(PadlistNAMES(srcpad), param);
if (cloneall) {
PADOFFSET depth;
for (depth = 1; depth <= max; ++depth)
@ -2740,8 +2738,7 @@ Perl_padnamelist_dup(pTHX_ PADNAMELIST *srcpad, CLONE_PARAMS *param)
for (; max >= 0; max--)
if (PadnamelistARRAY(srcpad)[max]) {
PadnamelistARRAY(dstpad)[max] =
padname_dup(PadnamelistARRAY(srcpad)[max], param);
PadnameREFCNT_inc(PadnamelistARRAY(dstpad)[max]);
padname_dup_inc(PadnamelistARRAY(srcpad)[max], param);
}
return dstpad;

6
pad.h
View File

@ -330,6 +330,7 @@ Restore the old pad saved into the local variable C<opad> by C<PAD_SAVE_LOCAL()>
#define PadnamelistMAX(pnl) (pnl)->xpadnl_fill
#define PadnamelistMAXNAMED(pnl) (pnl)->xpadnl_max_named
#define PadnamelistREFCNT(pnl) (pnl)->xpadnl_refcnt
#define PadnamelistREFCNT_inc(pnl) Perl_padnamelist_refcnt_inc(pnl)
#define PadnamelistREFCNT_dec(pnl) Perl_padnamelist_free(aTHX_ pnl)
#define PadARRAY(pad) AvARRAY(pad)
@ -387,6 +388,11 @@ Restore the old pad saved into the local variable C<opad> by C<PAD_SAVE_LOCAL()>
# define PADNAMEt_OUR PADNAMEf_OUR
#endif
#ifdef USE_ITHREADS
# define padnamelist_dup_inc(pnl,param) PadnamelistREFCNT_inc(padnamelist_dup(pnl,param))
# define padname_dup_inc(pn,param) PadnameREFCNT_inc(padname_dup(pn,param))
#endif
#ifdef DEBUGGING
# define PAD_SV(po) pad_sv(po)
# define PAD_SETSV(po,sv) pad_setsv(po,sv)