diff options
Diffstat (limited to 'XSUB.h')
-rw-r--r-- | XSUB.h | 30 |
1 files changed, 27 insertions, 3 deletions
@@ -243,6 +243,10 @@ Macro to verify that a PM module's $VERSION variable matches the XS module's C<XS_VERSION> variable. This is usually handled automatically by C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">. +=for apidoc Ams||XS_APIVERSION_BOOTCHECK +Macro to verify that the perl api version an XS module has been compiled against +matches the api version of the perl interpreter it's being loaded into. + =head1 Simple Exception Handling Macros =for apidoc Ams||dXCPT @@ -335,6 +339,26 @@ Rethrows a previously caught exception. See L<perlguts/"Exception Handling">. # define XS_VERSION_BOOTCHECK #endif +#define XS_APIVERSION_BOOTCHECK \ + STMT_START { \ + SV *_xpt = NULL; \ + SV *_compver = Perl_newSVpv(aTHX_ "v" PERL_API_VERSION_STRING, 0); \ + SV *_runver = new_version(PL_apiversion); \ + _compver = upg_version(_compver, 0); \ + if (vcmp(_compver, _runver)) { \ + _xpt = Perl_newSVpvf(aTHX_ "Perl API version %"SVf \ + " of %s does not match %"SVf, \ + SVfARG(Perl_sv_2mortal(aTHX_ vstringify(_compver))), \ + SvPV_nolen_const(ST(0)), \ + SVfARG(Perl_sv_2mortal(aTHX_ vstringify(_runver)))); \ + Perl_sv_2mortal(aTHX_ _xpt); \ + } \ + SvREFCNT_dec(_compver); \ + SvREFCNT_dec(_runver); \ + if (_xpt) \ + Perl_croak_sv(aTHX_ _xpt); \ + } STMT_END + #ifdef NO_XSLOCKS # define dXCPT dJMPENV; int rEtV = 0 # define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) @@ -343,9 +367,9 @@ Rethrows a previously caught exception. See L<perlguts/"Exception Handling">. # define XCPT_RETHROW JMPENV_JUMP(rEtV) #endif -/* - The DBM_setFilter & DBM_ckFilter macros are only used by - the *DB*_File modules +/* + The DBM_setFilter & DBM_ckFilter macros are only used by + the *DB*_File modules */ #define DBM_setFilter(db_type,code) \ |