/* --- Compatibility ------------------------------------------------------- */
+/* perl 5.23.8 onwards has a revamped context system */
+#if XSH_HAS_PERL(5, 23, 8)
+# define SU_HAS_NEW_CXT
+#endif
+
+
#ifndef dVAR
# define dVAR dNOOP
#endif
# define NEGATIVE_INDICES_VAR "NEGATIVE_INDICES"
#endif
+/* CX_ARGARRAY(cx): the AV at pad[0] of the CV associated with CXt_SUB
+ * context cx */
+
+#if XSH_HAS_PERL(5, 23, 8)
+# define CX_ARGARRAY(cx) \
+ ((AV*)(AvARRAY(MUTABLE_AV( \
+ PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[ \
+ CvDEPTH(cx->blk_sub.cv)]))[0]))
+/* XXX is the new def ok to use in lvalue cxt? Formerly it assigned to
+ * blk_sub.argarray, now to pad[0]. Does this matter?
+ */
+# define CX_ARGARRAY_set(cx,ary) \
+ (AvARRAY(MUTABLE_AV( \
+ PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[ \
+ CvDEPTH(cx->blk_sub.cv)]))[0] = (SV*)(ary))
+#else
+# define CX_ARGARRAY(cx) (cx->blk_sub.argarray)
+# define CX_ARGARRAY_set(cx,ary) (cx->blk_sub.argarray = (ary))
+#endif
+
+
/* --- Error messages ------------------------------------------------------ */
static const char su_stack_smash[] = "Cannot target a scope outside of the current stack";
o = SU_RETOP_EVAL(cx2);
break;
#if XSH_HAS_PERL(5, 11, 0)
+# if XSH_HAS_PERL(5, 23, 8)
+ case CXt_LOOP_ARY:
+ case CXt_LOOP_LIST:
+# else
case CXt_LOOP_FOR:
+# endif
case CXt_LOOP_PLAIN:
case CXt_LOOP_LAZYSV:
case CXt_LOOP_LAZYIV:
next = SU_RETOP_EVAL(cx);
break;
#if XSH_HAS_PERL(5, 11, 0)
+# if XSH_HAS_PERL(5, 23, 8)
+ case CXt_LOOP_ARY:
+ case CXt_LOOP_LIST:
+# else
case CXt_LOOP_FOR:
+# endif
case CXt_LOOP_PLAIN:
case CXt_LOOP_LAZYSV:
case CXt_LOOP_LAZYIV:
switch (CxTYPE(cx)) {
case CXt_SUB:
if (CxHASARGS(cx)) {
- argarray = cx->blk_sub.argarray;
+ argarray = CX_ARGARRAY(cx);
goto done;
}
break;
* reached without a goto() happening, and the old argarray member is
* actually our fake argarray. Destroy it properly in that case. */
if (cx->blk_sub.cv == sud->renamed) {
- SvREFCNT_dec(cx->blk_sub.argarray);
- cx->blk_sub.argarray = argarray;
+ SvREFCNT_dec(CX_ARGARRAY(cx));
+ CX_ARGARRAY_set(cx, argarray);
}
CvDEPTH(sud->callback)--;
if ((PL_op = PL_ppaddr[OP_ENTERSUB](aTHX))) {
PERL_CONTEXT *sub_cx = cxstack + cxstack_ix;
+ AV *argarray = CX_ARGARRAY(cx);
/* If pp_entersub() returns a non-null OP, it means that the callback is not
* an XSUB. */
sud->callback = MUTABLE_CV(SvREFCNT_inc(callback));
CvDEPTH(callback)++;
- if (CxHASARGS(cx) && cx->blk_sub.argarray) {
+ if (CxHASARGS(cx) && argarray) {
/* The call to pp_entersub() has saved the current @_ (in XS terms,
* GvAV(PL_defgv)) in the savearray member, and has created a new argarray
* with what we put on the stack. But we want to fake up the same arguments
AV *av = newAV();
AvREAL_off(av);
AvREIFY_on(av);
- av_extend(av, AvMAX(cx->blk_sub.argarray));
- AvFILLp(av) = AvFILLp(cx->blk_sub.argarray);
- Copy(AvARRAY(cx->blk_sub.argarray), AvARRAY(av), AvFILLp(av) + 1, SV *);
- sub_cx->blk_sub.argarray = av;
+ av_extend(av, AvMAX(argarray));
+ AvFILLp(av) = AvFILLp(argarray);
+ Copy(AvARRAY(argarray), AvARRAY(av), AvFILLp(av) + 1, SV *);
+ CX_ARGARRAY_set(sub_cx, av);
} else {
- SvREFCNT_inc_simple_void(sub_cx->blk_sub.argarray);
+ SvREFCNT_inc_simple_void(CX_ARGARRAY(sub_cx));
}
if (su_uplevel_goto_static(CvROOT(renamed))) {
switch (CxTYPE(cx)) {
/* gimme is always G_ARRAY for loop contexts. */
#if XSH_HAS_PERL(5, 11, 0)
+# if XSH_HAS_PERL(5, 23, 8)
+ case CXt_LOOP_ARY:
+ case CXt_LOOP_LIST:
+# else
case CXt_LOOP_FOR:
+# endif
case CXt_LOOP_PLAIN:
case CXt_LOOP_LAZYSV:
case CXt_LOOP_LAZYIV: