summaryrefslogtreecommitdiff
path: root/XSUB.h
diff options
context:
space:
mode:
Diffstat (limited to 'XSUB.h')
-rw-r--r--XSUB.h30
1 files changed, 27 insertions, 3 deletions
diff --git a/XSUB.h b/XSUB.h
index f3ba8027cd..939a7a64f7 100644
--- a/XSUB.h
+++ b/XSUB.h
@@ -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) \