XSRETURN(1);
}
+/** Called when values are "unshifted" onto a tied array
+ *
+ * The stack contains
+ * - the tied SV
+ * - one or more values being shifted onto the array
+ */
+static XS(XS_pairs_UNSHIFT)
+{
+ dXSARGS;
+ int i = 1;
+ fr_pair_t *vp;
+ fr_perl_pair_t *parent;
+
+ GET_PAIR_MAGIC(2)
+
+ fr_assert(fr_type_is_leaf(pair_data->da->type));
+
+ parent = pair_data->parent;
+ if (!parent->vp) {
+ if (fr_perl_pair_parent_build(parent) < 0) XSRETURN(0);
+ }
+
+ while (i < items) {
+ fr_pair_prepend_by_da(parent->vp, &vp, &parent->vp->vp_group, pair_data->da);
+ if (perl_value_unmarshal(vp, ST(i++)) < 0) break;
+ }
+
+ XSRETURN(0);
+}
+
static void xs_init(pTHX)
{
char const *file = __FILE__;
newXS("freeradiuspairs::PUSH", XS_pairs_PUSH, "rlm_perl");
newXS("freeradiuspairs::POP", XS_pairs_POP, "rlm_perl");
newXS("freeradiuspairs::SHIFT", XS_pairs_SHIFT, "rlm_perl");
+ newXS("freeradiuspairs::UNSHIFT", XS_pairs_UNSHIFT, "rlm_perl");
}
/** Convert a list of value boxes to a Perl array for passing to subroutines