-
Notifications
You must be signed in to change notification settings - Fork 138
/
embed_private.h
49 lines (42 loc) · 1.82 KB
/
embed_private.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* api.h
* Copyright (C) 2001-2011, Parrot Foundation.
* Overview:
* Parrot embed API's private macros
*/
#ifndef PARROT_EMBED_PRIVATE_H_GUARD
#define PARROT_EMBED_PRIVATE_H_GUARD
#include "pmc/pmc_parrotinterpreter.h"
/* Don't add ';' at the end of these macros.
* they are expressions, not statements */
#define GET_RAW_INTERP(p) (((Parrot_ParrotInterpreter_attributes*)(p)->data)->interp)
#define GET_INTERP(p) (PMC_IS_NULL(p) ? NULL : GET_RAW_INTERP(p))
#define EMBED_API_CALLIN(p, i) \
Parrot_jump_buff env; \
if (setjmp(env)) { \
Interp * const __interp = GET_INTERP(p); \
__interp->api_jmp_buf = NULL; \
return !__interp->exit_code; \
} \
else { \
Interp * const (i) = GET_INTERP(p); \
void * _oldtop = (i)->lo_var_ptr; \
if (_oldtop == NULL) \
(i)->lo_var_ptr = &_oldtop; \
(i)->api_jmp_buf = &env; \
{
#define EMBED_API_CALLOUT(p, i) \
} \
(i)->api_jmp_buf = NULL; \
if (!_oldtop) { \
PARROT_ASSERT((i)->lo_var_ptr == &_oldtop); \
(i)->lo_var_ptr = NULL; \
} \
return 1; \
}
#endif /* PARROT_EMBED_PRIVATE_H_GUARD */
/*
* Local variables:
* c-file-style: "parrot"
* End:
* vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
*/