#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "ffi_platypus.h"
#include "ffi_platypus_guts.h"
#include "perl_math_int64.h"
#define MY_CXT_KEY "FFI::Platypus::_guts" XS_VERSION
typedef struct {
ffi_pl_arguments *current_argv;
/*
* 0 not loaded
* 1 loaded ok
* 2 attempted load, but errored
*/
int loaded_math_longdouble;
AV* custom_keepers;
} my_cxt_t;
START_MY_CXT
XS(ffi_pl_sub_call)
{
ffi_pl_function *self;
int i,n, perl_arg_index;
SV *arg;
ffi_pl_arguments *arguments;
void **argument_pointers;
dMY_CXT;
dVAR; dXSARGS;
self = (ffi_pl_function*) CvXSUBANY(cv).any_ptr;
{
#define EXTRA_ARGS 0
#define FFI_PL_CALL_NO_RECORD_VALUE 1
#include "ffi_platypus_call.h"
}
}
XS(ffi_pl_sub_call_rv)
{
ffi_pl_function *self;
int i,n, perl_arg_index;
SV *arg;
ffi_pl_arguments *arguments;
void **argument_pointers;
dMY_CXT;
dVAR; dXSARGS;
self = (ffi_pl_function*) CvXSUBANY(cv).any_ptr;
{
#define EXTRA_ARGS 0
#define FFI_PL_CALL_RET_NO_NORMAL 1
#include "ffi_platypus_call.h"
}
}
MODULE = FFI::Platypus PACKAGE = FFI::Platypus
BOOT:
{
HV *stash;
MY_CXT_INIT;
MY_CXT.current_argv = NULL;
MY_CXT.loaded_math_longdouble = 0;
MY_CXT.custom_keepers = get_av("FFI::Platypus::keep", GV_ADD);
PERL_MATH_INT64_LOAD_OR_CROAK;
stash = gv_stashpv("FFI::Platypus", TRUE);
newCONSTSUB(stash, "_cast0", newSVuv(PTR2UV(cast0)));
newCONSTSUB(stash, "_cast1", newSVuv(PTR2UV(cast1)));
}
void
CLONE(...)
CODE:
MY_CXT_CLONE;
MY_CXT.custom_keepers = get_av("FFI::Platypus::keep", GV_ADD);
INCLUDE: ../../xs/DL.xs
INCLUDE: ../../xs/Internal.xs
INCLUDE: ../../xs/Type.xs
INCLUDE: ../../xs/TypeParser.xs
INCLUDE: ../../xs/Function.xs
INCLUDE: ../../xs/ClosureData.xs
INCLUDE: ../../xs/API.xs
INCLUDE: ../../xs/ABI.xs
INCLUDE: ../../xs/Record.xs
INCLUDE: ../../xs/Closure.xs
INCLUDE: ../../xs/Buffer.xs