In a XS function, I want to return a series of AVs. Each of the AV store one object and three integers. Currently, I suppose the code looks like this:
PPCODE:
// the number of return value is known
EXTEND(SP, things.size());
// cycle a list of things
for (size_t i=0; i<things.size(); i++)
{
AV* curr_slot = newAV();
SV* sv_obj = newSV(NULL);
sv_setref_pv(sv_obj, "My::Class", things[i].obj);
SV* sv_num1 = newSViv(things[i].foo);
SV* sv_num2 = newSViv(things[i].bar);
SV* sv_num3 = newSViv(things[i].baz);
av_push(curr_slot, sv_obj);
av_push(curr_slot, sv_num1);
av_push(curr_slot, sv_num2);
av_push(curr_slot, sv_num3);
mPUSHs((SV*) curr_slot);
}
Now, I have two questions:
1. There are four SVs created on each for cycle. Should I manually unref them, or they are automatically destroyed on XS function return?
2. Does the use of mPUSHs(AV) correct?
Thanks!!!