source: trunk/third/perl/XSUB.h @ 10724

Revision 10724, 2.0 KB checked in by ghudson, 27 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r10723, which included commits to RCS files with non-trunk default branches.
Line 
1#define ST(off) stack_base[ax + (off)]
2
3#ifdef CAN_PROTOTYPE
4#define XS(name) void name(CV* cv)
5#else
6#define XS(name) void name(cv) CV* cv;
7#endif
8
9#define dXSARGS                         \
10        dSP; dMARK;                     \
11        I32 ax = mark - stack_base + 1; \
12        I32 items = sp - mark
13
14#define XSANY CvXSUBANY(cv)
15
16#define dXSI32 I32 ix = XSANY.any_i32
17
18#define XSRETURN(off) stack_sp = stack_base + ax + ((off) - 1); return
19
20/* Simple macros to put new mortal values onto the stack.   */
21/* Typically used to return values from XS functions.       */
22#define XST_mIV(i,v)  (ST(i) = sv_2mortal(newSViv(v))  )
23#define XST_mNV(i,v)  (ST(i) = sv_2mortal(newSVnv(v))  )
24#define XST_mPV(i,v)  (ST(i) = sv_2mortal(newSVpv(v,0)))
25#define XST_mNO(i)    (ST(i) = &sv_no   )
26#define XST_mYES(i)   (ST(i) = &sv_yes  )
27#define XST_mUNDEF(i) (ST(i) = &sv_undef)
28 
29#define XSRETURN_IV(v) STMT_START { XST_mIV(0,v);  XSRETURN(1); } STMT_END
30#define XSRETURN_NV(v) STMT_START { XST_mNV(0,v);  XSRETURN(1); } STMT_END
31#define XSRETURN_PV(v) STMT_START { XST_mPV(0,v);  XSRETURN(1); } STMT_END
32#define XSRETURN_NO    STMT_START { XST_mNO(0);    XSRETURN(1); } STMT_END
33#define XSRETURN_YES   STMT_START { XST_mYES(0);   XSRETURN(1); } STMT_END
34#define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END
35#define XSRETURN_EMPTY STMT_START {                XSRETURN(0); } STMT_END
36
37#define newXSproto(a,b,c,d)     sv_setpv((SV*)newXS(a,b,c), d)
38
39#ifdef XS_VERSION
40# define XS_VERSION_BOOTCHECK \
41    STMT_START {                                                        \
42        char *vn = "", *module = SvPV(ST(0),na);                        \
43        if (items >= 2)  /* version supplied as bootstrap arg */        \
44            Sv = ST(1);                                                 \
45        else {                                                          \
46            /* XXX GV_ADDWARN */                                        \
47            Sv = perl_get_sv(form("%s::%s", module,                     \
48                                  vn = "XS_VERSION"), FALSE);           \
49            if (!Sv || !SvOK(Sv))                                       \
50                Sv = perl_get_sv(form("%s::%s", module,                 \
51                                      vn = "VERSION"), FALSE);          \
52        }                                                               \
53        if (Sv && (!SvOK(Sv) || strNE(XS_VERSION, SvPV(Sv, na))))       \
54            croak("%s object version %s does not match $%s::%s %_",     \
55                  module, XS_VERSION, module, vn, Sv);                  \
56    } STMT_END
57#else
58# define XS_VERSION_BOOTCHECK
59#endif
Note: See TracBrowser for help on using the repository browser.