From: Abhijit Menon-Sen Date: Fri, 10 Aug 2007 05:42:26 +0000 (+0000) Subject: SWIG uses XS() like this (in the perlrun.swg template): X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=081304cacec6bce6f35c552d790a2bd93a6cda31;p=p5sagit%2Fp5-mst-13.2.git SWIG uses XS() like this (in the perlrun.swg template): typedef XS(SwigPerlWrapper); typedef SwigPerlWrapper *SwigPerlWrapperPtr; This breaks if XS() includes the 'extern "C"' decoration under C++. The appended patch provides an XSPROTO() macro that could be used by SWIG instead. (Patch from Jan Dubois to fix breakage caused by #28734.) p4raw-id: //depot/perl@31697 --- diff --git a/XSUB.h b/XSUB.h index 268a2ff..a149115 100644 --- a/XSUB.h +++ b/XSUB.h @@ -96,21 +96,33 @@ is a lexical $_ in scope. #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