/* XSUB.h
*
- * Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999,
- * 2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
+ * Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+ * 2003, 2004, 2005, 2006, 2007, 2008 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.
#define ST(off) PL_stack_base[ax + (off)]
+/* XSPROTO() is also used by SWIG like this:
+ *
+ * typedef XSPROTO(SwigPerlWrapper);
+ * typedef SwigPerlWrapper *SwigPerlWrapperPtr;
+ *
+ * This code needs to be compilable under both C and C++.
+ *
+ * Don't forget to change the __attribute__unused__ version of XS()
+ * below too if you change XSPROTO() here.
+ */
+#define XSPROTO(name) void name(pTHX_ CV* cv)
+
#undef XS
#if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
-# define XS(name) __declspec(dllexport) void name(pTHX_ CV* cv)
+# define XS(name) __declspec(dllexport) XSPROTO(name)
#endif
#if defined(__SYMBIAN32__)
-# define XS(name) EXPORT_C void name(pTHX_ CV* cv)
+# define XS(name) EXPORT_C XSPROTO(name)
#endif
#ifndef XS
# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
# define XS(name) void name(pTHX_ CV* cv __attribute__unused__)
# else
# ifdef __cplusplus
-# define XS(name) extern "C" void name(pTHX_ CV* cv)
+# define XS(name) extern "C" XSPROTO(name)
# else
-# define XS(name) void name(pTHX_ CV* cv)
+# define XS(name) XSPROTO(name)
# endif
# endif
#endif
-#define dAX const I32 ax = MARK - PL_stack_base + 1
+#define dAX const I32 ax = (I32)(MARK - PL_stack_base + 1)
#define dAXMARK \
I32 ax = POPMARK; \
register SV **mark = PL_stack_base + ax++
-#define dITEMS I32 items = SP - MARK
+#define dITEMS I32 items = (I32)(SP - MARK)
#if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
# define dXSARGS \
#ifdef __cplusplus
# define XSINTERFACE_CVT(ret,name) ret (*name)(...)
+# define XSINTERFACE_CVT_ANON(ret) ret (*)(...)
#else
# define XSINTERFACE_CVT(ret,name) ret (*name)()
+# define XSINTERFACE_CVT_ANON(ret) ret (*)()
#endif
#define dXSFUNCTION(ret) XSINTERFACE_CVT(ret,XSFUNCTION)
-#define XSINTERFACE_FUNC(ret,cv,f) ((XSINTERFACE_CVT(ret,))(f))
+#define XSINTERFACE_FUNC(ret,cv,f) ((XSINTERFACE_CVT_ANON(ret))(f))
#define XSINTERFACE_FUNC_SET(cv,f) \
CvXSUBANY(cv).any_dxptr = (void (*) (pTHX_ void*))(f)
#define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
#define XST_mNV(i,v) (ST(i) = sv_2mortal(newSVnv(v)) )
#define XST_mPV(i,v) (ST(i) = sv_2mortal(newSVpv(v,0)))
-#define XST_mPVN(i,v,n) (ST(i) = sv_2mortal(newSVpvn(v,n)))
+#define XST_mPVN(i,v,n) (ST(i) = newSVpvn_flags(v,n, SVs_TEMP))
#define XST_mNO(i) (ST(i) = &PL_sv_no )
#define XST_mYES(i) (ST(i) = &PL_sv_yes )
#define XST_mUNDEF(i) (ST(i) = &PL_sv_undef)
#define XSRETURN(off) \
STMT_START { \
- IV tmpXSoff = (off); \
+ const IV tmpXSoff = (off); \
PL_stack_sp = PL_stack_base + ax + (tmpXSoff - 1); \
return; \
} STMT_END
vn = "VERSION"), FALSE); \
} \
if (_sv) { \
- SV *xssv = Perl_newSVpvf(aTHX_ "%s",XS_VERSION); \
+ SV *xssv = Perl_newSVpv(aTHX_ XS_VERSION, 0); \
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), \
+ module, SVfARG(vstringify(xssv)), \
vn ? "$" : "", vn ? module : "", vn ? "::" : "", \
- vn ? vn : "bootstrap parameter", vstringify(_sv));\
+ vn ? vn : "bootstrap parameter", SVfARG(vstringify(_sv)));\
} \
} STMT_END
#else
SAVETMPS ; \
SAVEINT(db->filtering) ; \
db->filtering = TRUE ; \
- SAVESPTR(DEFSV) ; \
+ SAVE_DEFSV ; \
if (name[7] == 's') \
arg = newSVsv(arg); \
- DEFSV = arg ; \
+ DEFSV_set(arg) ; \
SvTEMP_off(arg) ; \
PUSHMARK(SP) ; \
PUTBACK ; \
# define VTBL_uvar &PL_vtbl_uvar
# define VTBL_defelem &PL_vtbl_defelem
# define VTBL_regexp &PL_vtbl_regexp
-# define VTBL_regdata_names &PL_vtbl_regdata_names
# define VTBL_regdata &PL_vtbl_regdata
# define VTBL_regdatum &PL_vtbl_regdatum
# ifdef USE_LOCALE_COLLATE
#endif
#include "perlapi.h"
-#ifndef PERL_MAD
-# undef PL_madskills
-# undef PL_xmlfp
-# define PL_madskills 0
-# define PL_xmlfp 0
-#endif
#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_GET_CONTEXT) && !defined(PERL_CORE)
# undef aTHX