I think you leaked ST(0). It comes from Adder already mortaled. You increased the refcount, but didn't remortal it (unless the mortal is in the C version after XSPP does its job). As I understand each sv_2mortal will put the SV once on mortal stack. Each mortal must own one notch on the refcount and it all is supposed to balance out in the end. Perl interp fatally errors if it double frees a SV. I often omit SAVE/FREETMPS, I dont omit the ENTER/LEAVE since I don't have a good understanding when its safe to omit ENTER/LEAVE. I would use a POPs rather than fix up ax and get ST() working again, smaller machine code then. I'm not sure if the count check makes sense, I think G_SCALAR will FORCE the count to be 1 or 0 (or is that 1, a immortal undef is always placed if the callee return a 0 length list?), and it will mortal and delete the excess SVs off the perl stack before giving it to you.