For compiler's CC, make PP_EVAL, PP_ENTERTRY work with JMPENV.
[p5sagit/p5-mst-13.2.git] / cc_runtime.h
1 #define DOOP(ppname) PUTBACK; op = ppname(); SPAGAIN
2
3 #define PP_LIST(g) do {                 \
4         dMARK;                          \
5         if (g != G_ARRAY) {             \
6             if (++MARK <= SP)           \
7                 *MARK = *SP;            \
8             else                        \
9                 *MARK = &sv_undef;      \
10             SP = MARK;                  \
11         }                               \
12    } while (0)
13
14 #define MAYBE_TAINT_SASSIGN_SRC(sv) \
15     if (tainting && tainted && (!SvGMAGICAL(left) || !SvSMAGICAL(left) || \
16                                 !((mg=mg_find(left, 't')) && mg->mg_len & 1)))\
17         TAINT_NOT
18
19 #define PP_PREINC(sv) do {      \
20         if (SvIOK(sv)) {        \
21             ++SvIVX(sv);        \
22             SvFLAGS(sv) &= ~(SVf_NOK|SVf_POK|SVp_NOK|SVp_POK); \
23         }                       \
24         else                    \
25             sv_inc(sv);         \
26         SvSETMAGIC(sv);         \
27     } while (0)
28
29 #define PP_UNSTACK do {         \
30         TAINT_NOT;              \
31         stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;  \
32         FREETMPS;               \
33         oldsave = scopestack[scopestack_ix - 1]; \
34         LEAVE_SCOPE(oldsave);   \
35         SPAGAIN;                \
36     } while(0)
37
38 #if PATCHLEVEL < 3
39 #define RUN() run()
40 #else
41 #define RUN() runops()
42 #endif
43
44 #if PATCHLEVEL > 3
45 /* Anyone using eval "" deserves this mess */
46 #define PP_EVAL(ppaddr, nxt) do {               \
47         dJMPENV;                                \
48         int ret;                                \
49         PUTBACK;                                \
50         JMPENV_PUSH(ret);                       \
51         switch (ret) {                          \
52         case 0:                                 \
53             op = ppaddr();                      \
54             retstack[retstack_ix - 1] = Nullop; \
55             if (op != nxt) RUN();               \
56             JMPENV_POP;                         \
57             break;                              \
58         case 1: JMPENV_POP; JMPENV_JUMP(1);     \
59         case 2: JMPENV_POP; JMPENV_JUMP(2);     \
60         case 3:                                 \
61             JMPENV_POP;                         \
62             if (restartop != nxt)               \
63                 JMPENV_JUMP(3);                 \
64         }                                       \
65         op = nxt;                               \
66         SPAGAIN;                                \
67     } while (0)
68
69 #define PP_ENTERTRY(jmpbuf,label) do {          \
70         dJMPENV;                                \
71         int ret;                                \
72         JMPENV_PUSH(ret);                       \
73         switch (ret) {                          \
74         case 1: JMPENV_POP; JMPENV_JUMP(1);     \
75         case 2: JMPENV_POP; JMPENV_JUMP(2);     \
76         case 3: JMPENV_POP; SPAGAIN; goto label;\
77         }                                       \
78     } while (0)
79 #else
80 /* Anyone using eval "" deserves this mess */
81 #define PP_EVAL(ppaddr, nxt) do {               \
82         Sigjmp_buf oldtop;                      \
83         Copy(top_env,oldtop,1,Sigjmp_buf);      \
84         PUTBACK;                                \
85         switch (Sigsetjmp(top_env,1)) {         \
86         case 0:                                 \
87             op = ppaddr();                      \
88             retstack[retstack_ix - 1] = Nullop; \
89             Copy(oldtop,top_env,1,Sigjmp_buf);  \
90             if (op != nxt) RUN();               \
91             break;                              \
92         case 1: Copy(oldtop,top_env,1,Sigjmp_buf); Siglongjmp(top_env,1); \
93         case 2: Copy(oldtop,top_env,1,Sigjmp_buf); Siglongjmp(top_env,2); \
94         case 3:                                 \
95             Copy(oldtop,top_env,1,Sigjmp_buf);  \
96             if (restartop != nxt)               \
97                 Siglongjmp(top_env, 3);         \
98         }                                       \
99         op = nxt;                               \
100         SPAGAIN;                                \
101     } while (0)
102
103 #define PP_ENTERTRY(jmpbuf,label) do {          \
104         Copy(top_env,jmpbuf,1,Sigjmp_buf);      \
105         switch (Sigsetjmp(top_env,1)) {         \
106         case 1: Copy(jmpbuf,top_env,1,Sigjmp_buf); Siglongjmp(top_env,1); \
107         case 2: Copy(jmpbuf,top_env,1,Sigjmp_buf); Siglongjmp(top_env,2); \
108         case 3: Copy(jmpbuf,top_env,1,Sigjmp_buf); SPAGAIN; goto label; \
109         }                                       \
110     } while (0)
111 #endif