XS-Parse-Sublike
view release on metacpan or search on metacpan
share/include/XSParseSublike.h view on Meta::CPAN
* params whose pad variable has already been declared, and that have no
* attributes attached.
*/
char sigil;
PADOFFSET padix;
};
static void (*signature_add_param_func)(pTHX_ struct XSParseSublikeContext *ctx, struct XPSSignatureParamDetails *details);
#define xps_signature_add_param(ctx, details) S_xps_signature_add_param(aTHX_ ctx, details)
static void S_xps_signature_add_param(pTHX_ struct XSParseSublikeContext *ctx, struct XPSSignatureParamDetails *details)
{
if(!signature_add_param_func)
croak("Must call boot_xs_parse_sublike() first");
(*signature_add_param_func)(aTHX_ ctx, details);
}
/* Easier to define one query function that takes a `q` parameter, that
* indicates which question we are asking. This saves us having to export
* lots of functions. This is internal implementation detail, not exposed
* API.
*/
static IV (*signature_query_func)(pTHX_ struct XSParseSublikeContext *ctx, int q);
#define xps_signature_query_params(ctx) S_xps_signature_query(aTHX_ ctx, 0)
#define xps_signature_query_optparams(ctx) S_xps_signature_query(aTHX_ ctx, 1)
#define xps_signature_query_slurpy(ctx) ((char)S_xps_signature_query(aTHX_ ctx, 2))
static IV S_xps_signature_query(pTHX_ struct XSParseSublikeContext *ctx, int q)
{
if(!signature_query_func)
croak("Must call boot_xs_parse_sublike() first");
return (*signature_query_func)(aTHX_ ctx, q);
}
/* Experimental support for subroutine parameter attributes.
* Only supported on Perl v5.26 or later
*/
struct XPSSignatureParamContext {
bool is_named;
PADOFFSET padix;
OP *varop;
/* apply phase runs here */
OP *defop;
OP *op;
/* post_defop phase runs here */
/* TODO: in next ABI-breaking change, move this to the top */
char sigil;
const char *namepv;
STRLEN namelen;
bool is_refalias;
};
struct XPSSignatureAttributeFuncs {
U32 ver; /* caller must initialise to XSPARSESUBLIKE_ABI_VERSION */
U32 flags;
const char *permit_hintkey;
void (*apply)(pTHX_ struct XPSSignatureParamContext *ctx, SV *attrvalue, void **attrdata_ptr, void *funcdata);
void (*post_defop)(pTHX_ struct XPSSignatureParamContext *ctx, void *attrdata, void *funcdata);
void (*free)(pTHX_ void *attrdata, void *funcdata);
};
static void (*register_xps_signature_attribute_func)(pTHX_ const char *name, const struct XPSSignatureAttributeFuncs *funcs, void *funcdata);
#define register_xps_signature_attribute(name, funcs, funcdata) S_register_xps_signature_attribute(aTHX_ name, funcs, funcdata)
static void S_register_xps_signature_attribute(pTHX_ const char *name, const struct XPSSignatureAttributeFuncs *funcs, void *funcdata)
{
if(!register_xps_signature_attribute_func)
croak("Must call boot_xs_parse_sublike() first");
(*register_xps_signature_attribute_func)(aTHX_ name, funcs, funcdata);
}
#define boot_xs_parse_sublike(ver) S_boot_xs_parse_sublike(aTHX_ ver)
static void S_boot_xs_parse_sublike(pTHX_ double ver) {
SV **svp;
SV *versv = ver ? newSVnv(ver) : NULL;
load_module(PERL_LOADMOD_NOIMPORT, newSVpvs("XS::Parse::Sublike"), versv, NULL);
svp = hv_fetchs(PL_modglobal, "XS::Parse::Sublike/ABIVERSION_MIN", 0);
if(!svp)
croak("XS::Parse::Sublike ABI minimum version missing");
int abi_ver = SvIV(*svp);
if(abi_ver > XSPARSESUBLIKE_ABI_VERSION)
croak("XS::Parse::Sublike ABI version mismatch - library supports >= %d, compiled for %d",
abi_ver, XSPARSESUBLIKE_ABI_VERSION);
svp = hv_fetchs(PL_modglobal, "XS::Parse::Sublike/ABIVERSION_MAX", 0);
abi_ver = SvIV(*svp);
if(abi_ver < XSPARSESUBLIKE_ABI_VERSION)
croak("XS::Parse::Sublike ABI version mismatch - library supports <= %d, compiled for %d",
abi_ver, XSPARSESUBLIKE_ABI_VERSION);
parse_xs_parse_sublike_func = INT2PTR(int (*)(pTHX_ const struct XSParseSublikeHooks *, void *, OP**),
SvUV(*hv_fetchs(PL_modglobal, "XS::Parse::Sublike/parse()@6", 0)));
register_xs_parse_sublike_func = INT2PTR(void (*)(pTHX_ const char *, const struct XSParseSublikeHooks *, void *),
SvUV(*hv_fetchs(PL_modglobal, "XS::Parse::Sublike/register()@6", 0)));
parseany_xs_parse_sublike_func = INT2PTR(int (*)(pTHX_ const struct XSParseSublikeHooks *, void *, OP**),
SvUV(*hv_fetchs(PL_modglobal, "XS::Parse::Sublike/parseany()@6", 0)));
register_xps_signature_attribute_func = INT2PTR(void (*)(pTHX_ const char *, const struct XPSSignatureAttributeFuncs *, void *),
SvUV(*hv_fetchs(PL_modglobal, "XS::Parse::Sublike/register_sigattr()@5", 0)));
signature_add_param_func = INT2PTR(void (*)(pTHX_ struct XSParseSublikeContext *ctx, struct XPSSignatureParamDetails *details),
SvUV(*hv_fetchs(PL_modglobal, "XS::Parse::Sublike/signature_add_param()@7", 0)));
signature_query_func = INT2PTR(IV (*)(pTHX_ struct XSParseSublikeContext *ctx, int q),
SvUV(*hv_fetchs(PL_modglobal, "XS::Parse::Sublike/signature_query()@8", 0)));
}
#endif
( run in 0.617 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )