Re: [perl #34493] h2ph `extern inline' problems
[p5sagit/p5-mst-13.2.git] / XSUB.h
diff --git a/XSUB.h b/XSUB.h
index c940d77..c74d6f6 100644 (file)
--- a/XSUB.h
+++ b/XSUB.h
@@ -192,6 +192,24 @@ 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">.
 
+=head1 Simple Exception Handling Macros
+
+=for apidoc Ams||dXCPT
+Set up neccessary local variables for exception handling.
+See L<perlguts/"Exception Handling">.
+
+=for apidoc AmU||XCPT_TRY_START
+Starts a try block.  See L<perlguts/"Exception Handling">.
+
+=for apidoc AmU||XCPT_TRY_END
+Ends a try block.  See L<perlguts/"Exception Handling">.
+
+=for apidoc AmU||XCPT_CATCH
+Introduces a catch block.  See L<perlguts/"Exception Handling">.
+
+=for apidoc Ams||XCPT_RETHROW
+Rethrows a previously caught exception.  See L<perlguts/"Exception Handling">.
+
 =cut
 */
 
@@ -244,7 +262,7 @@ C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
            if ( !sv_derived_from(_sv, "version") )                     \
                _sv = new_version(_sv);                         \
            if ( vcmp(_sv,xssv) )                                       \
-               Perl_croak(aTHX_ "%s object version %_ does not match %s%s%s%s %_",\
+               Perl_croak(aTHX_ "%s object version %"SVf" does not match %s%s%s%s %"SVf,\
                      module, vstringify(xssv),                         \
                      vn ? "$" : "", vn ? module : "", vn ? "::" : "",  \
                      vn ? vn : "bootstrap parameter", vstringify(_sv));\
@@ -254,6 +272,14 @@ C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
 #  define XS_VERSION_BOOTCHECK
 #endif
 
+#ifdef NO_XSLOCKS
+#  define dXCPT             dJMPENV; int rEtV = 0
+#  define XCPT_TRY_START    JMPENV_PUSH(rEtV); if (rEtV == 0)
+#  define XCPT_TRY_END      JMPENV_POP;
+#  define XCPT_CATCH        if (rEtV != 0)
+#  define XCPT_RETHROW      JMPENV_JUMP(rEtV)
+#endif
+
 /* 
    The DBM_setFilter & DBM_ckFilter macros are only used by 
    the *DB*_File modules