The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include <xs/xs.h>
#include <xs/XSCallbackDispatcher.h>
#ifdef TEST_FULL
#  include "t/src/test.h"
#endif

STATIC xs::payload_marker_t marker;

MODULE = Panda::XS                PACKAGE = Panda::XS
PROTOTYPES: DISABLE

void sv_payload_attach (SV* sv, SV* payload) {
    xs::sv_payload_detach(aTHX_ sv, &marker);
    xs::sv_payload_attach(aTHX_ sv, payload, &marker);
}    
    
bool sv_payload_exists (SV* sv) {
    RETVAL = xs::sv_payload_exists(aTHX_ sv, &marker);
}   
    
SV* sv_payload (SV* sv) {
    RETVAL = xs::sv_payload_sv(aTHX_ sv, &marker);
    if (!RETVAL) XSRETURN_UNDEF;
    else SvREFCNT_inc_simple_void_NN(RETVAL);
}    

int sv_payload_detach (SV* sv) {
    RETVAL = xs::sv_payload_detach(aTHX_ sv, &marker);
}

void rv_payload_attach (SV* rv, SV* payload) {
    if (!SvROK(rv)) croak("Panda::XS::rv_payload_attach: argument is not a reference"); 
    xs::rv_payload_detach(aTHX_ rv, &marker);
    xs::rv_payload_attach(aTHX_ rv, payload, &marker);
}    
    
bool rv_payload_exists (SV* rv) {
    if (!SvROK(rv)) croak("Panda::XS::rv_payload_exists: argument is not a reference"); 
    RETVAL = xs::rv_payload_exists(aTHX_ rv, &marker);
}   
    
SV* rv_payload (SV* rv) {
    if (!SvROK(rv)) croak("Panda::XS::rv_payload: argument is not a reference"); 
    RETVAL = xs::rv_payload_sv(aTHX_ rv, &marker);
    if (!RETVAL) XSRETURN_UNDEF;
    else SvREFCNT_inc_simple_void_NN(RETVAL);
}    

int rv_payload_detach (SV* rv) {
    if (!SvROK(rv)) croak("Panda::XS::rv_payload_detach: argument is not a reference"); 
    RETVAL = xs::rv_payload_detach(aTHX_ rv, &marker);
}

void any_payload_attach (SV* sv, SV* payload) {
    if (SvROK(sv)) {
        xs::sv_payload_detach(aTHX_ SvRV(sv), &marker);
        xs::sv_payload_attach(aTHX_ SvRV(sv), payload, &marker);
    }
    else {
        xs::sv_payload_detach(aTHX_ sv, &marker);
        xs::sv_payload_attach(aTHX_ sv, payload, &marker);
    }
}
    
bool any_payload_exists (SV* sv) {
    if (SvROK(sv)) RETVAL = xs::sv_payload_exists(aTHX_ SvRV(sv), &marker);
    else RETVAL = xs::sv_payload_exists(aTHX_ sv, &marker);
}   
    
SV* any_payload (SV* sv) {
    if (SvROK(sv)) RETVAL = xs::sv_payload_sv(aTHX_ SvRV(sv), &marker);
    else RETVAL = xs::sv_payload_sv(aTHX_ sv, &marker);

    if (!RETVAL) XSRETURN_UNDEF;
    else SvREFCNT_inc_simple_void_NN(RETVAL);
}    

int any_payload_detach (SV* sv) {
    if (SvROK(sv)) RETVAL = xs::sv_payload_detach(aTHX_ SvRV(sv), &marker); 
    else RETVAL = xs::sv_payload_detach(aTHX_ sv, &marker);
}


void obj2hv (SV* rv) {
    if (!SvROK(rv)) croak("Panda::XS::obj2hv: argument is not a reference");
    SV* obj = SvRV(rv);
    if (SvOK(obj)) croak("Panda::XS::obj2hv: only references to undefs can be upgraded");
    SvUPGRADE(obj, SVt_PVHV);
}

void obj2av (SV* rv) {
    if (!SvROK(rv)) croak("Panda::XS::obj2av: argument is not a reference");
    SV* obj = SvRV(rv);
    if (SvOK(obj)) croak("Panda::XS::obj2av: only references to undefs can be upgraded");
    SvUPGRADE(obj, SVt_PVAV);
}

INCLUDE: XSCallbackDispatcher.xsi

#ifdef TEST_FULL

INCLUDE: t/src/test.xsi

#endif