X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=XSUB.h;h=aaa4c22e1ab71a857753d6badb664e3854b8a643;hb=774d564bb7dd1ed64ca0d7e534aa67e93f991f02;hp=78a922defdd9599d13cc3b91523b7cc6cf76671d;hpb=3712091946b37b5feabcc1f630b32639406ad717;p=p5sagit%2Fp5-mst-13.2.git diff --git a/XSUB.h b/XSUB.h index 78a922d..aaa4c22 100644 --- a/XSUB.h +++ b/XSUB.h @@ -26,12 +26,37 @@ #define XST_mYES(i) (ST(i) = &sv_yes ) #define XST_mUNDEF(i) (ST(i) = &sv_undef) -#define XSRETURN_IV(v) do { XST_mIV(0,v); XSRETURN(1); } while (0) -#define XSRETURN_NV(v) do { XST_mNV(0,v); XSRETURN(1); } while (0) -#define XSRETURN_PV(v) do { XST_mPV(0,v); XSRETURN(1); } while (0) -#define XSRETURN_NO do { XST_mNO(0); XSRETURN(1); } while (0) -#define XSRETURN_YES do { XST_mYES(0); XSRETURN(1); } while (0) -#define XSRETURN_UNDEF do { XST_mUNDEF(0); XSRETURN(1); } while (0) -#define XSRETURN_EMPTY do { XSRETURN(0); } while (0) +#define XSRETURN_IV(v) STMT_START { XST_mIV(0,v); XSRETURN(1); } STMT_END +#define XSRETURN_NV(v) STMT_START { XST_mNV(0,v); XSRETURN(1); } STMT_END +#define XSRETURN_PV(v) STMT_START { XST_mPV(0,v); XSRETURN(1); } STMT_END +#define XSRETURN_NO STMT_START { XST_mNO(0); XSRETURN(1); } STMT_END +#define XSRETURN_YES STMT_START { XST_mYES(0); XSRETURN(1); } STMT_END +#define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END +#define XSRETURN_EMPTY STMT_START { XSRETURN(0); } STMT_END #define newXSproto(a,b,c,d) sv_setpv((SV*)newXS(a,b,c), d) + +#ifdef XS_VERSION +# define XS_VERSION_BOOTCHECK \ + STMT_START { \ + char vn[255], *module = SvPV(ST(0),na); \ + if (items >= 2) /* version supplied as bootstrap arg */ \ + Sv = ST(1); \ + else { \ + sprintf(vn,"%s::XS_VERSION", module); \ + Sv = perl_get_sv(vn, FALSE); /* XXX GV_ADDWARN */ \ + if (!Sv || !SvOK(Sv)) { \ + sprintf(vn,"%s::VERSION", module); \ + Sv = perl_get_sv(vn, FALSE); /* XXX GV_ADDWARN */ \ + } \ + } \ + if (!Sv || !SvOK(Sv)) \ + croak("%s object can't find $%s::XS_VERSION or $%s::VERSION", \ + module, module, module); \ + else if (strNE(XS_VERSION, SvPV(Sv, na))) \ + croak("%s object version %s does not match $%s %s", \ + module, XS_VERSION, vn, SvPV(Sv, na)); \ + } STMT_END +#else +# define XS_VERSION_BOOTCHECK +#endif