1 /***********************************************************
3 * $Header: /usr/src/local/lwall/perl5/RCS/pp.h,v 4.1 92/08/07 18:26:20 lwall Exp Locker: lwall $
11 * Mon Jun 15 16:47:20 1992
14 * Larry Wall <lwall@netlabs.com>
17 * Revision 4.1 92/08/07 18:26:20 lwall
20 **********************************************************/
23 #define ARGSproto void
25 #define PP(s) OP* s(ARGS) dARGS
31 #define POPMARK (*markstack_ptr--)
32 #define dSP register SV **sp = stack_sp
33 #define dMARK register SV **mark = stack_base + POPMARK
34 #define dORIGMARK I32 origmark = mark - stack_base
35 #define SETORIGMARK origmark = mark - stack_base
36 #define ORIGMARK stack_base + origmark
38 #define SPAGAIN sp = stack_sp
39 #define MSPAGAIN sp = stack_sp; mark = ORIGMARK
41 #define GETTARGETSTACKED targ = (op->op_flags & OPf_STACKED ? POPs : PAD_SV(op->op_targ))
42 #define dTARGETSTACKED SV * GETTARGETSTACKED
44 #define GETTARGET targ = PAD_SV(op->op_targ)
45 #define dTARGET SV * GETTARGET
47 #define GETATARGET targ = (op->op_flags & OPf_STACKED ? sp[-1] : PAD_SV(op->op_targ))
48 #define dATARGET SV * GETATARGET
50 #define dTARG SV *targ
52 #define GETavn(a,g,st) \
53 a = sv_2av(cGVOP->op_gv ? (SV*)cGVOP->op_gv : POPs, &st, &g, 1)
54 #define GEThvn(h,g,st) \
55 h = sv_2hv(cGVOP->op_gv ? (SV*)cGVOP->op_gv : POPs, &st, &g, 1)
56 #define GETav(a,g,st) \
57 a = sv_2av(cGVOP->op_gv ? (SV*)cGVOP->op_gv : POPs, &st, &g, 0)
58 #define GEThv(h,g,st) \
59 h = sv_2hv(cGVOP->op_gv ? (SV*)cGVOP->op_gv : POPs, &st, &g, 0)
60 #define GETcv(r,g,st) \
61 r = sv_2cv(POPs, &st, &g, 0)
63 #define NORMAL op->op_next
64 #define DIE return die
65 #define PROP if (dying) return die("%s", dying);
67 #define PUTBACK stack_sp = sp
68 #define RETURN return PUTBACK, NORMAL
69 #define RETURNOP(o) return PUTBACK, o
70 #define RETURNX(x) return x, PUTBACK, NORMAL
73 #define POPp (SvPVx(POPs, na))
74 #define POPn (SvNVx(POPs))
75 #define POPi ((int)SvIVx(POPs))
76 #define POPl ((long)SvIVx(POPs))
79 #define TOPp (SvPV(TOPs, na))
80 #define TOPn (SvNV(TOPs))
81 #define TOPi ((int)SvIV(TOPs))
82 #define TOPl ((long)SvIV(TOPs))
84 /* Go to some pains in the rare event that we must extend the stack. */
85 #define EXTEND(p,n) do { if (stack_max - p < (n)) { \
86 av_fill(stack, (p - stack_base) + (n) + 128); \
87 sp = AvARRAY(stack) + (sp - stack_base); \
88 stack_base = AvARRAY(stack); \
89 stack_max = stack_base + AvMAX(stack) - 1; \
91 /* Same thing, but update mark register too. */
92 #define MEXTEND(p,n) do {if (stack_max - p < (n)) { \
93 av_fill(stack, (p - stack_base) + (n) + 128); \
94 sp = AvARRAY(stack) + (sp - stack_base); \
95 mark = AvARRAY(stack) + (mark - stack_base); \
96 stack_base = AvARRAY(stack); \
97 stack_max = stack_base + AvMAX(stack) - 1; \
100 #define PUSHs(s) (*++sp = (s))
101 #define PUSHTARG do { SvSETMAGIC(TARG); PUSHs(TARG); } while (0)
102 #define PUSHp(p,l) do { sv_setpvn(TARG, (p), (l)); PUSHTARG; } while (0)
103 #define PUSHn(n) do { sv_setnv(TARG, (n)); PUSHTARG; } while (0)
104 #define PUSHi(i) do { sv_setiv(TARG, (i)); PUSHTARG; } while (0)
106 #define XPUSHs(s) do { EXTEND(sp,1); (*++sp = (s)); } while (0)
107 #define XPUSHTARG do { SvSETMAGIC(TARG); XPUSHs(TARG); } while (0)
108 #define XPUSHp(p,l) do { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } while (0)
109 #define XPUSHn(n) do { sv_setnv(TARG, (n)); XPUSHTARG; } while (0)
110 #define XPUSHi(i) do { sv_setiv(TARG, (i)); XPUSHTARG; } while (0)
112 #define MXPUSHs(s) do { MEXTEND(sp,1); (*++sp = (s)); } while (0)
113 #define MXPUSHTARG do { SvSETMAGIC(TARG); XPUSHs(TARG); } while (0)
114 #define MXPUSHp(p,l) do { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } while (0)
115 #define MXPUSHn(n) do { sv_setnv(TARG, (n)); XPUSHTARG; } while (0)
116 #define MXPUSHi(i) do { sv_setiv(TARG, (i)); XPUSHTARG; } while (0)
118 #define SETs(s) (*sp = s)
119 #define SETTARG do { SvSETMAGIC(TARG); SETs(TARG); } while (0)
120 #define SETp(p,l) do { sv_setpvn(TARG, (p), (l)); SETTARG; } while (0)
121 #define SETn(n) do { sv_setnv(TARG, (n)); SETTARG; } while (0)
122 #define SETi(i) do { sv_setiv(TARG, (i)); SETTARG; } while (0)
124 #define dTOPss SV *sv = TOPs
125 #define dPOPss SV *sv = POPs
126 #define dTOPnv double value = TOPn
127 #define dPOPnv double value = POPn
128 #define dTOPiv I32 value = TOPi
129 #define dPOPiv I32 value = POPi
131 #define dPOPPOPssrl SV *rstr = POPs; SV *lstr = POPs
132 #define dPOPPOPnnrl double right = POPn; double left = POPn
133 #define dPOPPOPiirl I32 right = POPi; I32 left = POPi
135 #define dPOPTOPssrl SV *rstr = POPs; SV *lstr = TOPs
136 #define dPOPTOPnnrl double right = POPn; double left = TOPn
137 #define dPOPTOPiirl I32 right = POPi; I32 left = TOPi
139 #define RETPUSHYES RETURNX(PUSHs(&sv_yes))
140 #define RETPUSHNO RETURNX(PUSHs(&sv_no))
141 #define RETPUSHUNDEF RETURNX(PUSHs(&sv_undef))
143 #define RETSETYES RETURNX(SETs(&sv_yes))
144 #define RETSETNO RETURNX(SETs(&sv_no))
145 #define RETSETUNDEF RETURNX(SETs(&sv_undef))
147 #define ARGTARG op->op_targ
148 #define MAXARG op->op_private
150 #define SWITCHSTACK(f,t) AvFILL(f) = sp - stack_base; \
151 stack_base = AvARRAY(t); \
152 stack_max = stack_base + AvMAX(t); \
153 sp = stack_base + AvFILL(t); \
156 /* XXX need to diffentiate on marked operators? */
157 #define FETCH_GV(s) PUTBACK, s = fetch_gv(op,1), SPAGAIN
158 #define FETCH_GV1(s) PUTBACK, s = fetch_gv(op,1), SPAGAIN
159 #define FETCH_GV2(s) PUTBACK, s = fetch_gv(op,2), SPAGAIN
160 #define FETCH_IO(s) PUTBACK, s = fetch_io(op,1), SPAGAIN
161 #define FETCH_IO1(s) PUTBACK, s = fetch_io(op,1), SPAGAIN
162 #define FETCH_IO2(s) PUTBACK, s = fetch_io(op,2), SPAGAIN
164 #define ENTER push_scope()
165 #define LEAVE pop_scope()
167 #define SAVEINT(i) save_int((int*)(&i));
168 #define SAVEI32(i) save_int((I32*)(&i));
169 #define SAVELONG(l) save_int((long*)(&l));
170 #define SAVESPTR(s) save_sptr((SV**)(&s))
171 #define SAVETMPS save_int(&tmps_floor), tmps_floor = tmps_ix
172 #define SAVEFREESV(s) save_freesv((SV*)(s))
173 #define SAVEFREEOP(o) save_freeop((OP*)(o))
174 #define SAVEFREEPV(p) save_freepv((char*)(p))
175 #define SAVECLEARSV(sv) save_clearsv((SV**)(&sv))
176 #define SAVEDELETE(h,k,l) save_delete((HV*)(h), (char*)(k), (I32)l)