CV * cv;
/* Above here is the same for sub and format. */
AV * savearray;
- AV * argarray;
I32 olddepth;
PAD *prevcomppad; /* the caller's PL_comppad */
};
CopSTASHPV((COP*)CvSTART((const CV*)cx->blk_sub.cv))); \
\
if (CxHASARGS(cx)) { \
- assert(cx->blk_sub.argarray == (AV*)PL_curpad[0]); \
+ AV *av = MUTABLE_AV(PAD_SVl(0)); \
assert(AvARRAY(MUTABLE_AV( \
PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[ \
CvDEPTH(cx->blk_sub.cv)])) == PL_curpad); \
POP_SAVEARRAY(); \
/* abandon @_ if it got reified */ \
- if (AvREAL(cx->blk_sub.argarray)) { \
- const SSize_t fill = AvFILLp(cx->blk_sub.argarray); \
- SvREFCNT_dec_NN(cx->blk_sub.argarray); \
- cx->blk_sub.argarray = newAV(); \
- av_extend(cx->blk_sub.argarray, fill); \
- AvREIFY_only(cx->blk_sub.argarray); \
- (AvARRAY(MUTABLE_AV( \
- PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[ \
- CvDEPTH(cx->blk_sub.cv)])))[0] = \
- MUTABLE_SV(cx->blk_sub.argarray); \
+ if (AvREAL(av)) { \
+ const SSize_t fill = AvFILLp(av); \
+ SvREFCNT_dec_NN(av); \
+ av = newAV(); \
+ av_extend(av, fill); \
+ AvREIFY_only(av); \
+ PAD_SVl(0) = MUTABLE_SV(av); \
} \
else { \
- CLEAR_ARGARRAY(cx->blk_sub.argarray); \
+ CLEAR_ARGARRAY(av); \
} \
} \
} \
PERL_CONTEXT *cx = &cxstack[cxstack_ix];
POP_SAVEARRAY();
cx->cx_type &= ~ CXp_HASARGS;
- assert(cx->blk_sub.argarray == (AV*)PL_curpad[0]);
assert(AvARRAY(MUTABLE_AV(
PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[
CvDEPTH(cx->blk_sub.cv)])) == PL_curpad);
- assert(!AvREAL(cx->blk_sub.argarray));
+ assert(!AvREAL(MUTABLE_AV(PAD_SVl(0))));
}
}
break;
if (CxTYPE(cx) == CXt_SUB && CxHASARGS(cx)
&& CopSTASH_eq(PL_curcop, PL_debstash))
{
- AV * const ary = cx->blk_sub.argarray;
+ /* slot 0 of the pad contains the original @_ */
+ AV * const ary = MUTABLE_AV(AvARRAY(MUTABLE_AV(
+ PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[
+ cx->blk_sub.olddepth+1]))[0]);
const SSize_t off = AvARRAY(ary) - AvALLOC(ary);
- assert((AV*)((AvARRAY(MUTABLE_AV(
- PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[
- cx->blk_sub.olddepth+1])))[0]) == cx->blk_sub.argarray);
-
Perl_init_dbargs(aTHX);
if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
/* partial unrolled POPSUB(): */
if (CxTYPE(cx) == CXt_SUB && CxHASARGS(cx)) {
- AV* av = cx->blk_sub.argarray;
-
- assert(cx->blk_sub.argarray == (AV*)PL_curpad[0]);
+ AV* av = MUTABLE_AV(PAD_SVl(0));
assert(AvARRAY(MUTABLE_AV(
PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[
CvDEPTH(cx->blk_sub.cv)])) == PL_curpad);
SvREFCNT_dec(av);
av = newAV();
AvREIFY_only(av);
- PAD_SVl(0) = MUTABLE_SV(cx->blk_sub.argarray = av);
+ PAD_SVl(0) = (SV*)av;
}
else CLEAR_ARGARRAY(av);
}
PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
if (CxHASARGS(cx))
{
- /* cx->blk_sub.argarray has no reference count, so we
+ /* XXX
+ cx->blk_sub.argarray has no reference count, so we
need something to hang on to our argument array so
that cx->blk_sub.argarray does not end up pointing
to freed memory as the result of undef *_. So put
SvREFCNT_dec(PAD_SVl(0));
PAD_SVl(0) = (SV *)arg;
}
- cx->blk_sub.argarray = (AV*)PAD_SVl(0);
/* GvAV(PL_defgv) might have been modified on scope
exit, so restore it. */
defavp = &GvAV(PL_defgv);
cx->blk_sub.savearray = *defavp;
*defavp = MUTABLE_AV(SvREFCNT_inc_simple_NN(av));
- cx->blk_sub.argarray = av;
items = SP - MARK;
if (UNLIKELY(items - 1 > AvMAX(av))) {
cx->blk_sub.savearray = GvAV(PL_defgv);
GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av));
- cx->blk_sub.argarray = av;
}
}
case CXt_SUB:
ncx->blk_sub.cv = cv_dup_inc(ncx->blk_sub.cv, param);
if(CxHASARGS(ncx)){
- ncx->blk_sub.argarray = av_dup_inc(ncx->blk_sub.argarray,param);
ncx->blk_sub.savearray = av_dup_inc(ncx->blk_sub.savearray,param);
} else {
- ncx->blk_sub.argarray = NULL;
ncx->blk_sub.savearray = NULL;
}
ncx->blk_sub.prevcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,