*/
assert(sud);
if (sud->argarray) {
+ I32 fill;
AV *av = newAV();
AvREAL_off(av);
AvREIFY_on(av);
- av_extend(av, AvMAX(sud->argarray));
- AvFILLp(av) = AvFILLp(sud->argarray);
- Copy(AvARRAY(sud->argarray), AvARRAY(av), AvFILLp(av) + 1, SV *);
+ fill = AvFILLp(sud->argarray);
+ if (fill >= 0) {
+ av_extend(av, fill);
+ Copy(AvARRAY(sud->argarray), AvARRAY(av), fill + 1, SV *);
+ AvFILLp(av) = fill;
+ }
+
+#if !XSH_HAS_PERL(5, 37, 10)
/* should be referenced by PL_curpad[0] and *_ */
assert(SvREFCNT(PL_curpad[0]) > 1);
SvREFCNT_dec(PL_curpad[0]);
+#endif
PL_curpad[0] = (SV *) av;
}
/* warnings (9) */
{
SV *mask = NULL;
-#if XSH_HAS_PERL(5, 9, 4)
+#if XSH_HAS_PERL(5, 37, 6)
+ char *old_warnings = cop->cop_warnings;
+#elif XSH_HAS_PERL(5, 9, 4)
STRLEN *old_warnings = cop->cop_warnings;
#else
SV *old_warnings = cop->cop_warnings;
if (!mask)
mask = su_newmortal_pvn(WARN_ALLstring, WARNsize);
} else {
-#if XSH_HAS_PERL(5, 9, 4)
+#if XSH_HAS_PERL(5, 37, 6)
+ mask = su_newmortal_pvn((char *) old_warnings, RCPV_LEN(old_warnings));
+#elif XSH_HAS_PERL(5, 9, 4)
mask = su_newmortal_pvn((char *) (old_warnings + 1), old_warnings[0]);
#else
mask = sv_mortalcopy(old_warnings);