source: owl_perl.h @ 72ec874

release-1.10release-1.7release-1.8release-1.9
Last change on this file since 72ec874 was 06adc25, checked in by David Benjamin <davidben@mit.edu>, 14 years ago
Sanitize our include guards somewhat Avoid double underscores to avoid clashing with reserved symbols. Also adding BARNOWL to guard names. While I'm at it, owl_prototypes.h could use guards.
  • Property mode set to 100644
File size: 1.4 KB
Line 
1#ifndef INC_BARNOWL_OWL_PERL_H
2#define INC_BARNOWL_OWL_PERL_H
3
4#define OWL_PERL_VOID_CALL (void)POPs;
5
6/*
7 * This macro defines a convenience wrapper around the boilerplate of
8 * calling a method on a perl object (SV*) from C.
9 *
10 * Arguments are
11 * * obj    - the SV* to call the method on
12 * * meth   - a char* method name
13 * * args   - a code block responsible for pushing args (other than the object)
14 * * err    - a string with a %s format specifier to log in case of error
15 * * fatalp - if true, perl errors terminate barnowl
16 * * ret    - a code block executed if the call succeeded
17 *
18 * See also: `perldoc perlcall', `perldoc perlapi'
19 */
20#define OWL_PERL_CALL_METHOD(obj, meth, args, err, fatalp, ret) { \
21    int count; \
22    dSP; \
23    ENTER; \
24    SAVETMPS; \
25    PUSHMARK(SP); \
26    XPUSHs(obj); \
27    {args} \
28    PUTBACK; \
29    \
30    count = call_method(meth, G_SCALAR|G_EVAL); \
31    \
32    SPAGAIN; \
33    \
34    if(count != 1) { \
35      fprintf(stderr, "perl returned wrong count: %d\n", count); \
36      abort();                                                   \
37    } \
38    if (SvTRUE(ERRSV)) { \
39      if(fatalp) { \
40        printf(err, SvPV_nolen(ERRSV)); \
41        exit(-1); \
42      } else { \
43        owl_function_error(err, SvPV_nolen(ERRSV)); \
44        (void)POPs; \
45        sv_setsv(ERRSV, &PL_sv_undef); \
46      } \
47    } else { \
48      ret; \
49    } \
50    PUTBACK; \
51    FREETMPS; \
52    LEAVE; \
53}
54
55#endif /* INC_BARNOWL_OWL_PERL_H */
Note: See TracBrowser for help on using the repository browser.