This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
XS() __attribute__
[perl5.git] / XSUB.h
diff --git a/XSUB.h b/XSUB.h
index a1e48dd..358a4b7 100644 (file)
--- a/XSUB.h
+++ b/XSUB.h
@@ -1,7 +1,7 @@
 /*    XSUB.h
  *
  *    Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999,
 /*    XSUB.h
  *
  *    Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999,
- *    2000, 2001, 2002, 2003, by Larry Wall and others
+ *    2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -80,10 +80,19 @@ is a lexical $_ in scope.
 
 #define ST(off) PL_stack_base[ax + (off)]
 
 
 #define ST(off) PL_stack_base[ax + (off)]
 
+#undef XS
 #if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
 #  define XS(name) __declspec(dllexport) void name(pTHX_ CV* cv)
 #if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
 #  define XS(name) __declspec(dllexport) void name(pTHX_ CV* cv)
-#else
-#  define XS(name) void name(pTHX_ CV* cv)
+#endif
+#if defined(SYMBIAN)
+#  define XS(name) EXPORT_C void name(pTHX_ CV* cv)
+#endif
+#ifndef XS
+#  if defined(HASATTRIBUTE)
+#    define XS(name) void name(pTHX_ CV* cv __attribute__((unused)))
+#  else
+#    define XS(name) void name(pTHX_ CV* cv)
+#  endif
 #endif
 
 #define dAX I32 ax = MARK - PL_stack_base + 1
 #endif
 
 #define dAX I32 ax = MARK - PL_stack_base + 1
@@ -114,7 +123,7 @@ is a lexical $_ in scope.
 #define XSINTERFACE_FUNC_SET(cv,f)     \
                CvXSUBANY(cv).any_dxptr = (void (*) (pTHX_ void*))(f)
 
 #define XSINTERFACE_FUNC_SET(cv,f)     \
                CvXSUBANY(cv).any_dxptr = (void (*) (pTHX_ void*))(f)
 
-#define dUNDERBAR I32 padoff_du = pad_findmy("$_")
+#define dUNDERBAR I32 padoff_du = find_rundefsvoffset()
 #define UNDERBAR ((padoff_du == NOT_IN_PAD \
            || PAD_COMPNAME_FLAGS(padoff_du) & SVpad_OUR) \
        ? DEFSV : PAD_SVl(padoff_du))
 #define UNDERBAR ((padoff_du == NOT_IN_PAD \
            || PAD_COMPNAME_FLAGS(padoff_du) & SVpad_OUR) \
        ? DEFSV : PAD_SVl(padoff_du))
@@ -179,7 +188,7 @@ Return an empty list from an XSUB immediately.
 
 =head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
 
 
 =head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
 
-=for apidoc AmU||newXSproto
+=for apidoc AmU||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto
 Used by C<xsubpp> to hook up XSUBs as Perl subs.  Adds Perl prototypes to
 the subs.
 
 Used by C<xsubpp> to hook up XSUBs as Perl subs.  Adds Perl prototypes to
 the subs.
 
@@ -192,6 +201,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">.
 
 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
 */
 
 =cut
 */
 
@@ -227,7 +254,7 @@ C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
 #  define XS_VERSION_BOOTCHECK \
     STMT_START {                                                       \
        SV *_sv; STRLEN n_a;                                            \
 #  define XS_VERSION_BOOTCHECK \
     STMT_START {                                                       \
        SV *_sv; STRLEN n_a;                                            \
-       char *vn = Nullch, *module = SvPV(ST(0),n_a);                   \
+       const char *vn = Nullch, *module = SvPV(ST(0),n_a);             \
        if (items >= 2)  /* version supplied as bootstrap arg */        \
            _sv = ST(1);                                                \
        else {                                                          \
        if (items >= 2)  /* version supplied as bootstrap arg */        \
            _sv = ST(1);                                                \
        else {                                                          \
@@ -238,16 +265,30 @@ C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
                _sv = get_sv(Perl_form(aTHX_ "%s::%s", module,  \
                                    vn = "VERSION"), FALSE);            \
        }                                                               \
                _sv = get_sv(Perl_form(aTHX_ "%s::%s", module,  \
                                    vn = "VERSION"), FALSE);            \
        }                                                               \
-       if (_sv && (!SvOK(_sv) || strNE(XS_VERSION, SvPV(_sv, n_a))))   \
-           Perl_croak(aTHX_ "%s object version %s does not match %s%s%s%s %"SVf,\
-                 module, XS_VERSION,                                   \
-                 vn ? "$" : "", vn ? module : "", vn ? "::" : "",      \
-                 vn ? vn : "bootstrap parameter", _sv);                \
+       if (_sv) {                                                      \
+           SV *xssv = Perl_newSVpvf(aTHX_ "%s",XS_VERSION);            \
+           xssv = new_version(xssv);                                   \
+           if ( !sv_derived_from(_sv, "version") )                     \
+               _sv = new_version(_sv);                         \
+           if ( vcmp(_sv,xssv) )                                       \
+               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));\
+       }                                                               \
     } STMT_END
 #else
 #  define XS_VERSION_BOOTCHECK
 #endif
 
     } STMT_END
 #else
 #  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 
 /* 
    The DBM_setFilter & DBM_ckFilter macros are only used by 
    the *DB*_File modules