This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
integrate change#3893, make it conditional on bincompat5005
[perl5.git] / cc_runtime.h
... / ...
CommitLineData
1#define DOOP(ppname) PUTBACK; PL_op = ppname(aTHX); SPAGAIN
2#define CCPP(s) OP * s(pTHX)
3
4#define PP_LIST(g) do { \
5 dMARK; \
6 if (g != G_ARRAY) { \
7 if (++MARK <= SP) \
8 *MARK = *SP; \
9 else \
10 *MARK = &PL_sv_undef; \
11 SP = MARK; \
12 } \
13 } while (0)
14
15#define MAYBE_TAINT_SASSIGN_SRC(sv) \
16 if (PL_tainting && PL_tainted && (!SvGMAGICAL(left) || !SvSMAGICAL(left) || \
17 !((mg=mg_find(left, 't')) && mg->mg_len & 1)))\
18 TAINT_NOT
19
20#define PP_PREINC(sv) do { \
21 if (SvIOK(sv)) { \
22 ++SvIVX(sv); \
23 SvFLAGS(sv) &= ~(SVf_NOK|SVf_POK|SVp_NOK|SVp_POK); \
24 } \
25 else \
26 sv_inc(sv); \
27 SvSETMAGIC(sv); \
28 } while (0)
29
30#define PP_UNSTACK do { \
31 TAINT_NOT; \
32 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp; \
33 FREETMPS; \
34 oldsave = PL_scopestack[PL_scopestack_ix - 1]; \
35 LEAVE_SCOPE(oldsave); \
36 SPAGAIN; \
37 } while(0)
38
39/* Anyone using eval "" deserves this mess */
40#define PP_EVAL(ppaddr, nxt) do { \
41 dJMPENV; \
42 int ret; \
43 PUTBACK; \
44 JMPENV_PUSH(ret); \
45 switch (ret) { \
46 case 0: \
47 PL_op = ppaddr(aTHX); \
48 PL_retstack[PL_retstack_ix - 1] = Nullop; \
49 if (PL_op != nxt) CALLRUNOPS(); \
50 JMPENV_POP; \
51 break; \
52 case 1: JMPENV_POP; JMPENV_JUMP(1); \
53 case 2: JMPENV_POP; JMPENV_JUMP(2); \
54 case 3: \
55 JMPENV_POP; \
56 if (PL_restartop && PL_restartop != nxt) \
57 JMPENV_JUMP(3); \
58 } \
59 PL_op = nxt; \
60 SPAGAIN; \
61 } while (0)
62
63
64#define PP_ENTERTRY(jmpbuf,label) \
65 STMT_START { \
66 int ret; \
67 JMPENV_PUSH_ENV(jmpbuf,ret); \
68 switch (ret) { \
69 case 1: JMPENV_POP_ENV(jmpbuf); JMPENV_JUMP(1);\
70 case 2: JMPENV_POP_ENV(jmpbuf); JMPENV_JUMP(2);\
71 case 3: JMPENV_POP_ENV(jmpbuf); SPAGAIN; goto label;\
72 } \
73 } STMT_END
74#define PP_LEAVETRY \
75 STMT_START{ PL_top_env=PL_top_env->je_prev; }STMT_END