#include "easyxs/init.h"

SV *cbf_call_scalar_with_arguments( pTHX_ SV* cb, const U8 count, SV** args ) {
    // --- Almost all copy-paste from “perlcall” … blegh!
    dSP;

    ENTER;
    SAVETMPS;

    PUSHMARK(SP);
    EXTEND(SP, count);

    U8 i;
    for (i=0; i<count; i++) PUSHs( sv_2mortal(args[i]) );

    PUTBACK;

    call_sv(cb, G_SCALAR);

    SV *ret = newSVsv(POPs);

    FREETMPS;
    LEAVE;

    return ret;
}

void cbf_die_with_arguments( pTHX_ U8 argslen, SV** args ) {
    SV* diename = newSVpvs("CBOR::Free::_die");
    sv_2mortal(diename);

    // NB: args should NOT be mortal because the call to Perl
    // will do that for us.

    cbf_call_scalar_with_arguments(
        aTHX_
        diename,
        argslen,
        args
    );

    assert(0);
}
