This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
gv_fetchpvn_flags ranks highly in the profile, and the ::/' scanning
[perl5.git] / cop.h
CommitLineData
a0d0e21e 1/* cop.h
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
acde74e1 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a3985cdc 9 * Control ops (cops) are one of the three ops OP_NEXTSTATE, OP_DBSTATE,
3ffa1527
JH
10 * and OP_SETSTATE that (loosely speaking) are separate statements.
11 * They hold information important for lexical state and error reporting.
12 * At run time, PL_curcop is set to point to the most recently executed cop,
a3985cdc 13 * and thus can be used to determine our current state.
79072805
LW
14 */
15
0d2925a6
DM
16/* A jmpenv packages the state required to perform a proper non-local jump.
17 * Note that there is a start_env initialized when perl starts, and top_env
18 * points to this initially, so top_env should always be non-null.
19 *
20 * Existence of a non-null top_env->je_prev implies it is valid to call
21 * longjmp() at that runlevel (we make sure start_env.je_prev is always
22 * null to ensure this).
23 *
24 * je_mustcatch, when set at any runlevel to TRUE, means eval ops must
25 * establish a local jmpenv to handle exception traps. Care must be taken
26 * to restore the previous value of je_mustcatch before exiting the
27 * stack frame iff JMPENV_PUSH was not called in that stack frame.
28 * GSAR 97-03-27
29 */
30
31struct jmpenv {
32 struct jmpenv * je_prev;
33 Sigjmp_buf je_buf; /* only for use if !je_throw */
34 int je_ret; /* last exception thrown */
35 bool je_mustcatch; /* need to call longjmp()? */
36};
37
38typedef struct jmpenv JMPENV;
39
40#ifdef OP_IN_REGISTER
41#define OP_REG_TO_MEM PL_opsave = op
42#define OP_MEM_TO_REG op = PL_opsave
43#else
44#define OP_REG_TO_MEM NOOP
45#define OP_MEM_TO_REG NOOP
46#endif
47
48/*
49 * How to build the first jmpenv.
50 *
51 * top_env needs to be non-zero. It points to an area
52 * in which longjmp() stuff is stored, as C callstack
53 * info there at least is thread specific this has to
54 * be per-thread. Otherwise a 'die' in a thread gives
55 * that thread the C stack of last thread to do an eval {}!
56 */
57
58#define JMPENV_BOOTSTRAP \
59 STMT_START { \
60 Zero(&PL_start_env, 1, JMPENV); \
61 PL_start_env.je_ret = -1; \
62 PL_start_env.je_mustcatch = TRUE; \
63 PL_top_env = &PL_start_env; \
64 } STMT_END
65
66/*
67 * PERL_FLEXIBLE_EXCEPTIONS
68 *
69 * All the flexible exceptions code has been removed.
70 * See the following threads for details:
71 *
72 * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2004-07/msg00378.html
73 *
74 * Joshua's original patches (which weren't applied) and discussion:
75 *
76 * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01396.html
77 * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01489.html
78 * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01491.html
79 * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01608.html
80 * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg02144.html
81 * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg02998.html
82 *
83 * Chip's reworked patch and discussion:
84 *
85 * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1999-03/msg00520.html
86 *
87 * The flaw in these patches (which went unnoticed at the time) was
88 * that they moved some code that could potentially die() out of the
89 * region protected by the setjmp()s. This caused exceptions within
90 * END blocks and such to not be handled by the correct setjmp().
91 *
92 * The original patches that introduces flexible exceptions were:
93 *
94 * http://public.activestate.com/cgi-bin/perlbrowse?patch=3386
95 * http://public.activestate.com/cgi-bin/perlbrowse?patch=5162
96 */
97
98#define dJMPENV JMPENV cur_env
99
100#define JMPENV_PUSH(v) \
101 STMT_START { \
102 DEBUG_l(Perl_deb(aTHX_ "Setting up jumplevel %p, was %p\n", \
103 &cur_env, PL_top_env)); \
104 cur_env.je_prev = PL_top_env; \
105 OP_REG_TO_MEM; \
106 cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK); \
107 OP_MEM_TO_REG; \
108 PL_top_env = &cur_env; \
109 cur_env.je_mustcatch = FALSE; \
110 (v) = cur_env.je_ret; \
111 } STMT_END
112
113#define JMPENV_POP \
114 STMT_START { \
115 DEBUG_l(Perl_deb(aTHX_ "popping jumplevel was %p, now %p\n", \
116 PL_top_env, cur_env.je_prev)); \
117 PL_top_env = cur_env.je_prev; \
118 } STMT_END
119
120#define JMPENV_JUMP(v) \
121 STMT_START { \
122 OP_REG_TO_MEM; \
123 if (PL_top_env->je_prev) \
124 PerlProc_longjmp(PL_top_env->je_buf, (v)); \
125 if ((v) == 2) \
37038d91 126 PerlProc_exit(STATUS_EXIT); \
0d2925a6
DM
127 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n"); \
128 PerlProc_exit(1); \
129 } STMT_END
130
131#define CATCH_GET (PL_top_env->je_mustcatch)
132#define CATCH_SET(v) (PL_top_env->je_mustcatch = (v))
133
134
135
79072805
LW
136struct cop {
137 BASEOP
a0d0e21e 138 char * cop_label; /* label for this construct */
57843af0 139#ifdef USE_ITHREADS
11faa288 140 char * cop_stashpv; /* package line was compiled in */
57843af0
GS
141 char * cop_file; /* file name the following line # is from */
142#else
11faa288 143 HV * cop_stash; /* package line was compiled in */
79072805 144 GV * cop_filegv; /* file the following line # is from */
57843af0 145#endif
a0d0e21e
LW
146 U32 cop_seq; /* parse sequence number */
147 I32 cop_arybase; /* array base this line was compiled with */
79072805 148 line_t cop_line; /* line # of this command */
599cee73 149 SV * cop_warnings; /* lexical warnings bitmask */
ac27b0f5 150 SV * cop_io; /* lexical IO defaults */
79072805
LW
151};
152
153#define Nullcop Null(COP*)
154
57843af0
GS
155#ifdef USE_ITHREADS
156# define CopFILE(c) ((c)->cop_file)
157# define CopFILEGV(c) (CopFILE(c) \
158 ? gv_fetchfile(CopFILE(c)) : Nullgv)
083fcd59 159
7e4e8c89
NC
160# ifdef NETWARE
161# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv))
162# else
163# define CopFILE_set(c,pv) ((c)->cop_file = savesharedpv(pv))
164# endif
083fcd59 165
57843af0
GS
166# define CopFILESV(c) (CopFILE(c) \
167 ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
168# define CopFILEAV(c) (CopFILE(c) \
7d49f689 169 ? GvAV(gv_fetchfile(CopFILE(c))) : NULL)
8688788e
SH
170# ifdef DEBUGGING
171# define CopFILEAVx(c) (assert(CopFILE(c)), \
36c7798d 172 GvAV(gv_fetchfile(CopFILE(c))))
8688788e
SH
173# else
174# define CopFILEAVx(c) (GvAV(gv_fetchfile(CopFILE(c))))
175# endif
57843af0 176# define CopSTASHPV(c) ((c)->cop_stashpv)
083fcd59 177
7e4e8c89
NC
178# ifdef NETWARE
179# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
180# else
181# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = savesharedpv(pv))
182# endif
083fcd59 183
11faa288 184# define CopSTASH(c) (CopSTASHPV(c) \
5c284bb0 185 ? gv_stashpv(CopSTASHPV(c),GV_ADD) : NULL)
4ba4de04 186# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME_get(hv) : Nullch)
ed221c57 187# define CopSTASH_eq(c,hv) ((hv) && stashpv_hvname_match(c,hv))
7e4e8c89
NC
188# ifdef NETWARE
189# define CopSTASH_free(c) SAVECOPSTASH_FREE(c)
7e4e8c89
NC
190# define CopFILE_free(c) SAVECOPFILE_FREE(c)
191# else
ed221c57
AL
192# define CopSTASH_free(c) PerlMemShared_free(CopSTASHPV(c))
193# define CopFILE_free(c) (PerlMemShared_free(CopFILE(c)),(CopFILE(c) = Nullch))
7e4e8c89 194# endif
57843af0
GS
195#else
196# define CopFILEGV(c) ((c)->cop_filegv)
f4dd75d9
GS
197# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
198# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv))
57843af0 199# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
7d49f689 200# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : NULL)
8688788e
SH
201# ifdef DEBUGGING
202# define CopFILEAVx(c) (assert(CopFILEGV(c)), GvAV(CopFILEGV(c)))
203# else
204# define CopFILEAVx(c) (GvAV(CopFILEGV(c)))
205# endif
57843af0
GS
206# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
207# define CopSTASH(c) ((c)->cop_stash)
f4dd75d9 208# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv))
4ba4de04 209# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME_get(CopSTASH(c)) : Nullch)
f4dd75d9
GS
210 /* cop_stash is not refcounted */
211# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
212# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv))
05ec9bb3
NIS
213# define CopSTASH_free(c)
214# define CopFILE_free(c) (SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = Nullgv))
215
57843af0
GS
216#endif /* USE_ITHREADS */
217
ed094faf 218#define CopSTASH_ne(c,hv) (!CopSTASH_eq(c,hv))
cc49e20b 219#define CopLINE(c) ((c)->cop_line)
57843af0
GS
220#define CopLINE_inc(c) (++CopLINE(c))
221#define CopLINE_dec(c) (--CopLINE(c))
222#define CopLINE_set(c,l) (CopLINE(c) = (l))
cc49e20b 223
248c2a4d
CN
224/* OutCopFILE() is CopFILE for output (caller, die, warn, etc.) */
225#ifdef MACOS_TRADITIONAL
226# define OutCopFILE(c) MacPerl_MPWFileName(CopFILE(c))
227#else
228# define OutCopFILE(c) CopFILE(c)
229#endif
230
79072805
LW
231/*
232 * Here we have some enormously heavy (or at least ponderous) wizardry.
233 */
234
235/* subroutine context */
236struct block_sub {
237 CV * cv;
238 GV * gv;
463ee0b2 239 GV * dfoutgv;
79072805
LW
240 AV * savearray;
241 AV * argarray;
b8f55b69 242 long olddepth;
79072805 243 U8 hasargs;
cd06dffe 244 U8 lval; /* XXX merge lval and hasargs? */
f3548bdc 245 PAD *oldcomppad;
f39bc417 246 OP * retop; /* op to execute on exit from sub */
79072805
LW
247};
248
b36bdeca
DM
249/* base for the next two macros. Don't use directly.
250 * Note that the refcnt of the cv is incremented twice; The CX one is
251 * decremented by LEAVESUB, the other by LEAVE. */
252
ee98a1d6 253#define PUSHSUB_BASE(cx) \
79072805 254 cx->blk_sub.cv = cv; \
b8f55b69 255 cx->blk_sub.olddepth = CvDEPTH(cv); \
b36bdeca 256 cx->blk_sub.hasargs = hasargs; \
f39bc417 257 cx->blk_sub.retop = Nullop; \
b36bdeca
DM
258 if (!CvDEPTH(cv)) { \
259 (void)SvREFCNT_inc(cv); \
260 (void)SvREFCNT_inc(cv); \
261 SAVEFREESV(cv); \
262 }
263
ee98a1d6
DM
264
265#define PUSHSUB(cx) \
266 PUSHSUB_BASE(cx) \
cd06dffe
GS
267 cx->blk_sub.lval = PL_op->op_private & \
268 (OPpLVAL_INTRO|OPpENTERSUB_INARGS);
79072805 269
ee98a1d6
DM
270/* variant for use by OP_DBSTATE, where op_private holds hint bits */
271#define PUSHSUB_DB(cx) \
272 PUSHSUB_BASE(cx) \
273 cx->blk_sub.lval = 0;
274
275
79072805
LW
276#define PUSHFORMAT(cx) \
277 cx->blk_sub.cv = cv; \
278 cx->blk_sub.gv = gv; \
f39bc417 279 cx->blk_sub.retop = Nullop; \
4633a7c4 280 cx->blk_sub.hasargs = 0; \
3280af22 281 cx->blk_sub.dfoutgv = PL_defoutgv; \
4633a7c4 282 (void)SvREFCNT_inc(cx->blk_sub.dfoutgv)
79072805 283
3db8f154 284#define POP_SAVEARRAY() \
6d4ff0d2 285 STMT_START { \
3280af22 286 SvREFCNT_dec(GvAV(PL_defgv)); \
a8bba7fa 287 GvAV(PL_defgv) = cx->blk_sub.savearray; \
6d4ff0d2 288 } STMT_END
6d4ff0d2 289
ecf8e9dd 290/* junk in @_ spells trouble when cloning CVs and in pp_caller(), so don't
8e09340b
GS
291 * leave any (a fast av_clear(ary), basically) */
292#define CLEAR_ARGARRAY(ary) \
293 STMT_START { \
294 AvMAX(ary) += AvARRAY(ary) - AvALLOC(ary); \
f880fe2f 295 SvPV_set(ary, (char*)AvALLOC(ary)); \
8e09340b
GS
296 AvFILLp(ary) = -1; \
297 } STMT_END
7766f137 298
b0d9ce38
GS
299#define POPSUB(cx,sv) \
300 STMT_START { \
a8bba7fa 301 if (cx->blk_sub.hasargs) { \
7766f137 302 POP_SAVEARRAY(); \
d8b46c1b 303 /* abandon @_ if it got reified */ \
a8bba7fa
GS
304 if (AvREAL(cx->blk_sub.argarray)) { \
305 SSize_t fill = AvFILLp(cx->blk_sub.argarray); \
306 SvREFCNT_dec(cx->blk_sub.argarray); \
307 cx->blk_sub.argarray = newAV(); \
308 av_extend(cx->blk_sub.argarray, fill); \
11ca45c0 309 AvREIFY_only(cx->blk_sub.argarray); \
dd2155a4 310 CX_CURPAD_SV(cx->blk_sub, 0) = (SV*)cx->blk_sub.argarray; \
d8b46c1b 311 } \
7766f137 312 else { \
8e09340b 313 CLEAR_ARGARRAY(cx->blk_sub.argarray); \
7766f137 314 } \
79072805 315 } \
b0d9ce38
GS
316 sv = (SV*)cx->blk_sub.cv; \
317 if (sv && (CvDEPTH((CV*)sv) = cx->blk_sub.olddepth)) \
318 sv = Nullsv; \
319 } STMT_END
320
321#define LEAVESUB(sv) \
322 STMT_START { \
323 if (sv) \
324 SvREFCNT_dec(sv); \
325 } STMT_END
79072805
LW
326
327#define POPFORMAT(cx) \
4633a7c4
LW
328 setdefout(cx->blk_sub.dfoutgv); \
329 SvREFCNT_dec(cx->blk_sub.dfoutgv);
79072805
LW
330
331/* eval context */
332struct block_eval {
333 I32 old_in_eval;
334 I32 old_op_type;
0f79a09d 335 SV * old_namesv;
79072805 336 OP * old_eval_root;
748a9306 337 SV * cur_text;
2090ab20 338 CV * cv;
f39bc417 339 OP * retop; /* op to execute on exit from eval */
abd70938 340 JMPENV * cur_top_env; /* value of PL_top_env when eval CX created */
79072805
LW
341};
342
8990e307 343#define PUSHEVAL(cx,n,fgv) \
0f79a09d 344 STMT_START { \
3280af22 345 cx->blk_eval.old_in_eval = PL_in_eval; \
a8bba7fa 346 cx->blk_eval.old_op_type = PL_op->op_type; \
0f79a09d 347 cx->blk_eval.old_namesv = (n ? newSVpv(n,0) : Nullsv); \
a8bba7fa 348 cx->blk_eval.old_eval_root = PL_eval_root; \
0f79a09d 349 cx->blk_eval.cur_text = PL_linestr; \
2090ab20 350 cx->blk_eval.cv = Nullcv; /* set by doeval(), as applicable */ \
f39bc417 351 cx->blk_eval.retop = Nullop; \
abd70938 352 cx->blk_eval.cur_top_env = PL_top_env; \
0f79a09d 353 } STMT_END
79072805
LW
354
355#define POPEVAL(cx) \
0f79a09d 356 STMT_START { \
3280af22 357 PL_in_eval = cx->blk_eval.old_in_eval; \
79072805 358 optype = cx->blk_eval.old_op_type; \
7766f137 359 PL_eval_root = cx->blk_eval.old_eval_root; \
0f79a09d
GS
360 if (cx->blk_eval.old_namesv) \
361 sv_2mortal(cx->blk_eval.old_namesv); \
362 } STMT_END
79072805
LW
363
364/* loop context */
365struct block_loop {
366 char * label;
367 I32 resetsp;
368 OP * redo_op;
369 OP * next_op;
370 OP * last_op;
7766f137
GS
371#ifdef USE_ITHREADS
372 void * iterdata;
f3548bdc 373 PAD *oldcomppad;
7766f137 374#else
79072805 375 SV ** itervar;
7766f137 376#endif
79072805 377 SV * itersave;
5f05dabc 378 SV * iterlval;
79072805 379 AV * iterary;
89ea2908
GA
380 IV iterix;
381 IV itermax;
79072805
LW
382};
383
7766f137
GS
384#ifdef USE_ITHREADS
385# define CxITERVAR(c) \
386 ((c)->blk_loop.iterdata \
387 ? (CxPADLOOP(cx) \
dd2155a4
DM
388 ? &CX_CURPAD_SV( (c)->blk_loop, \
389 INT2PTR(PADOFFSET, (c)->blk_loop.iterdata)) \
7766f137
GS
390 : &GvSV((GV*)(c)->blk_loop.iterdata)) \
391 : (SV**)NULL)
392# define CX_ITERDATA_SET(cx,idata) \
dd2155a4 393 CX_CURPAD_SAVE(cx->blk_loop); \
155aba94 394 if ((cx->blk_loop.iterdata = (idata))) \
d10edb75
KC
395 cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx)); \
396 else \
397 cx->blk_loop.itersave = Nullsv;
7766f137
GS
398#else
399# define CxITERVAR(c) ((c)->blk_loop.itervar)
400# define CX_ITERDATA_SET(cx,ivar) \
155aba94 401 if ((cx->blk_loop.itervar = (SV**)(ivar))) \
d10edb75
KC
402 cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx)); \
403 else \
404 cx->blk_loop.itersave = Nullsv;
7766f137
GS
405#endif
406
407#define PUSHLOOP(cx, dat, s) \
38a230cb
GS
408 cx->blk_loop.label = PL_curcop->cop_label; \
409 cx->blk_loop.resetsp = s - PL_stack_base; \
79072805
LW
410 cx->blk_loop.redo_op = cLOOP->op_redoop; \
411 cx->blk_loop.next_op = cLOOP->op_nextop; \
412 cx->blk_loop.last_op = cLOOP->op_lastop; \
44a8e56a 413 cx->blk_loop.iterlval = Nullsv; \
7d49f689 414 cx->blk_loop.iterary = NULL; \
7766f137
GS
415 cx->blk_loop.iterix = -1; \
416 CX_ITERDATA_SET(cx,dat);
79072805
LW
417
418#define POPLOOP(cx) \
a8bba7fa 419 SvREFCNT_dec(cx->blk_loop.iterlval); \
7766f137 420 if (CxITERVAR(cx)) { \
21401c75
CH
421 if (SvPADMY(cx->blk_loop.itersave)) { \
422 SV **s_v_p = CxITERVAR(cx); \
423 sv_2mortal(*s_v_p); \
424 *s_v_p = cx->blk_loop.itersave; \
425 } \
426 else { \
427 SvREFCNT_dec(cx->blk_loop.itersave); \
428 } \
44a8e56a 429 } \
a8bba7fa
GS
430 if (cx->blk_loop.iterary && cx->blk_loop.iterary != PL_curstack)\
431 SvREFCNT_dec(cx->blk_loop.iterary);
79072805 432
0d863452
RH
433/* given/when context */
434struct block_givwhen {
435 OP *leave_op;
436};
437
438#define PUSHGIVEN(cx) \
439 cx->blk_givwhen.leave_op = cLOGOP->op_other;
440
441#define PUSHWHEN PUSHGIVEN
442
79072805
LW
443/* context common to subroutines, evals and loops */
444struct block {
445 I32 blku_oldsp; /* stack pointer to copy stuff down to */
446 COP * blku_oldcop; /* old curcop pointer */
79072805
LW
447 I32 blku_oldmarksp; /* mark stack index */
448 I32 blku_oldscopesp; /* scope stack index */
449 PMOP * blku_oldpm; /* values of pattern match vars */
450 U8 blku_gimme; /* is this block running in list context? */
451
452 union {
453 struct block_sub blku_sub;
454 struct block_eval blku_eval;
455 struct block_loop blku_loop;
0d863452 456 struct block_givwhen blku_givwhen;
79072805
LW
457 } blk_u;
458};
459#define blk_oldsp cx_u.cx_blk.blku_oldsp
460#define blk_oldcop cx_u.cx_blk.blku_oldcop
79072805
LW
461#define blk_oldmarksp cx_u.cx_blk.blku_oldmarksp
462#define blk_oldscopesp cx_u.cx_blk.blku_oldscopesp
463#define blk_oldpm cx_u.cx_blk.blku_oldpm
464#define blk_gimme cx_u.cx_blk.blku_gimme
465#define blk_sub cx_u.cx_blk.blk_u.blku_sub
466#define blk_eval cx_u.cx_blk.blk_u.blku_eval
467#define blk_loop cx_u.cx_blk.blk_u.blku_loop
0d863452 468#define blk_givwhen cx_u.cx_blk.blk_u.blku_givwhen
79072805
LW
469
470/* Enter a block. */
8990e307 471#define PUSHBLOCK(cx,t,sp) CXINC, cx = &cxstack[cxstack_ix], \
79072805 472 cx->cx_type = t, \
3280af22
NIS
473 cx->blk_oldsp = sp - PL_stack_base, \
474 cx->blk_oldcop = PL_curcop, \
1aff0e91 475 cx->blk_oldmarksp = PL_markstack_ptr - PL_markstack, \
3280af22 476 cx->blk_oldscopesp = PL_scopestack_ix, \
3280af22 477 cx->blk_oldpm = PL_curpm, \
eb160463 478 cx->blk_gimme = (U8)gimme; \
bf49b057 479 DEBUG_l( PerlIO_printf(Perl_debug_log, "Entering block %ld, type %s\n", \
1aff0e91 480 (long)cxstack_ix, PL_block_type[CxTYPE(cx)]); )
79072805
LW
481
482/* Exit a block (RETURN and LAST). */
a0d0e21e 483#define POPBLOCK(cx,pm) cx = &cxstack[cxstack_ix--], \
1aff0e91 484 newsp = PL_stack_base + cx->blk_oldsp, \
3280af22
NIS
485 PL_curcop = cx->blk_oldcop, \
486 PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \
487 PL_scopestack_ix = cx->blk_oldscopesp, \
3280af22
NIS
488 pm = cx->blk_oldpm, \
489 gimme = cx->blk_gimme; \
b4ab917c 490 DEBUG_SCOPE("POPBLOCK"); \
bf49b057 491 DEBUG_l( PerlIO_printf(Perl_debug_log, "Leaving block %ld, type %s\n", \
22c35a8c 492 (long)cxstack_ix+1,PL_block_type[CxTYPE(cx)]); )
79072805
LW
493
494/* Continue a block elsewhere (NEXT and REDO). */
3280af22 495#define TOPBLOCK(cx) cx = &cxstack[cxstack_ix], \
1aff0e91 496 PL_stack_sp = PL_stack_base + cx->blk_oldsp, \
3280af22
NIS
497 PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \
498 PL_scopestack_ix = cx->blk_oldscopesp, \
b4ab917c
DM
499 PL_curpm = cx->blk_oldpm; \
500 DEBUG_SCOPE("TOPBLOCK");
79072805
LW
501
502/* substitution context */
503struct subst {
504 I32 sbu_iters;
505 I32 sbu_maxiters;
22e551b9 506 I32 sbu_rflags;
4633a7c4 507 I32 sbu_oldsave;
71be2cbc
PP
508 bool sbu_once;
509 bool sbu_rxtainted;
79072805
LW
510 char * sbu_orig;
511 SV * sbu_dstr;
512 SV * sbu_targ;
513 char * sbu_s;
514 char * sbu_m;
515 char * sbu_strend;
c90c0ff4 516 void * sbu_rxres;
c07a80fd 517 REGEXP * sbu_rx;
79072805
LW
518};
519#define sb_iters cx_u.cx_subst.sbu_iters
520#define sb_maxiters cx_u.cx_subst.sbu_maxiters
22e551b9 521#define sb_rflags cx_u.cx_subst.sbu_rflags
4633a7c4 522#define sb_oldsave cx_u.cx_subst.sbu_oldsave
71be2cbc
PP
523#define sb_once cx_u.cx_subst.sbu_once
524#define sb_rxtainted cx_u.cx_subst.sbu_rxtainted
79072805
LW
525#define sb_orig cx_u.cx_subst.sbu_orig
526#define sb_dstr cx_u.cx_subst.sbu_dstr
527#define sb_targ cx_u.cx_subst.sbu_targ
528#define sb_s cx_u.cx_subst.sbu_s
529#define sb_m cx_u.cx_subst.sbu_m
530#define sb_strend cx_u.cx_subst.sbu_strend
c90c0ff4 531#define sb_rxres cx_u.cx_subst.sbu_rxres
c07a80fd 532#define sb_rx cx_u.cx_subst.sbu_rx
79072805
LW
533
534#define PUSHSUBST(cx) CXINC, cx = &cxstack[cxstack_ix], \
535 cx->sb_iters = iters, \
536 cx->sb_maxiters = maxiters, \
22e551b9 537 cx->sb_rflags = r_flags, \
4633a7c4 538 cx->sb_oldsave = oldsave, \
71be2cbc
PP
539 cx->sb_once = once, \
540 cx->sb_rxtainted = rxtainted, \
79072805
LW
541 cx->sb_orig = orig, \
542 cx->sb_dstr = dstr, \
543 cx->sb_targ = targ, \
544 cx->sb_s = s, \
545 cx->sb_m = m, \
546 cx->sb_strend = strend, \
c90c0ff4 547 cx->sb_rxres = Null(void*), \
c07a80fd 548 cx->sb_rx = rx, \
c90c0ff4
PP
549 cx->cx_type = CXt_SUBST; \
550 rxres_save(&cx->sb_rxres, rx)
79072805 551
c90c0ff4
PP
552#define POPSUBST(cx) cx = &cxstack[cxstack_ix--]; \
553 rxres_free(&cx->sb_rxres)
79072805
LW
554
555struct context {
6b35e009 556 U32 cx_type; /* what kind of context this is */
79072805
LW
557 union {
558 struct block cx_blk;
559 struct subst cx_subst;
560 } cx_u;
561};
6b35e009
GS
562
563#define CXTYPEMASK 0xff
79072805
LW
564#define CXt_NULL 0
565#define CXt_SUB 1
566#define CXt_EVAL 2
567#define CXt_LOOP 3
568#define CXt_SUBST 4
569#define CXt_BLOCK 5
7766f137 570#define CXt_FORMAT 6
0d863452
RH
571#define CXt_GIVEN 7
572#define CXt_WHEN 8
79072805 573
9850bf21
RH
574/* private flags for CXt_SUB and CXt_NULL */
575#define CXp_MULTICALL 0x00000400 /* part of a multicall (so don't
576 tear down context on exit). */
577
6b35e009
GS
578/* private flags for CXt_EVAL */
579#define CXp_REAL 0x00000100 /* truly eval'', not a lookalike */
1d76a5c3 580#define CXp_TRYBLOCK 0x00000200 /* eval{}, not eval'' or similar */
6b35e009 581
7766f137 582/* private flags for CXt_LOOP */
0d863452
RH
583#define CXp_FOREACH 0x00000200 /* a foreach loop */
584#define CXp_FOR_DEF 0x00000400 /* foreach using $_ */
585#ifdef USE_ITHREADS
7766f137
GS
586# define CXp_PADVAR 0x00000100 /* itervar lives on pad, iterdata
587 has pad offset; if not set,
588 iterdata holds GV* */
589# define CxPADLOOP(c) (((c)->cx_type & (CXt_LOOP|CXp_PADVAR)) \
590 == (CXt_LOOP|CXp_PADVAR))
591#endif
592
6b35e009 593#define CxTYPE(c) ((c)->cx_type & CXTYPEMASK)
9850bf21
RH
594#define CxMULTICALL(c) (((c)->cx_type & CXp_MULTICALL) \
595 == CXp_MULTICALL)
7766f137
GS
596#define CxREALEVAL(c) (((c)->cx_type & (CXt_EVAL|CXp_REAL)) \
597 == (CXt_EVAL|CXp_REAL))
1d76a5c3
GS
598#define CxTRYBLOCK(c) (((c)->cx_type & (CXt_EVAL|CXp_TRYBLOCK)) \
599 == (CXt_EVAL|CXp_TRYBLOCK))
0d863452
RH
600#define CxFOREACH(c) (((c)->cx_type & (CXt_LOOP|CXp_FOREACH)) \
601 == (CXt_LOOP|CXp_FOREACH))
602#define CxFOREACHDEF(c) (((c)->cx_type & (CXt_LOOP|CXp_FOREACH|CXp_FOR_DEF))\
603 == (CXt_LOOP|CXp_FOREACH|CXp_FOR_DEF))
6b35e009 604
79072805
LW
605#define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc()))
606
ccfc67b7
JH
607/*
608=head1 "Gimme" Values
609*/
954c1994
GS
610
611/*
612=for apidoc AmU||G_SCALAR
613Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and
614L<perlcall>.
615
616=for apidoc AmU||G_ARRAY
91e74348 617Used to indicate list context. See C<GIMME_V>, C<GIMME> and
954c1994
GS
618L<perlcall>.
619
620=for apidoc AmU||G_VOID
621Used to indicate void context. See C<GIMME_V> and L<perlcall>.
622
623=for apidoc AmU||G_DISCARD
624Indicates that arguments returned from a callback should be discarded. See
625L<perlcall>.
626
627=for apidoc AmU||G_EVAL
628
629Used to force a Perl C<eval> wrapper around a callback. See
630L<perlcall>.
631
632=for apidoc AmU||G_NOARGS
633
634Indicates that no arguments are being sent to a callback. See
635L<perlcall>.
636
637=cut
638*/
639
a0d0e21e
LW
640#define G_SCALAR 0
641#define G_ARRAY 1
54310121 642#define G_VOID 128 /* skip this bit when adding flags below */
79072805 643
864dbfa3 644/* extra flags for Perl_call_* routines */
a0d0e21e
LW
645#define G_DISCARD 2 /* Call FREETMPS. */
646#define G_EVAL 4 /* Assume eval {} around subroutine call. */
647#define G_NOARGS 8 /* Don't construct a @_ array. */
54310121 648#define G_KEEPERR 16 /* Append errors to $@, don't overwrite it */
491527d0 649#define G_NODEBUG 32 /* Disable debugging at toplevel. */
968b3946 650#define G_METHOD 64 /* Calling method. */
e336de0d 651
faef0170
HS
652/* flag bits for PL_in_eval */
653#define EVAL_NULL 0 /* not in an eval */
654#define EVAL_INEVAL 1 /* some enclosing scope is an eval */
655#define EVAL_WARNONLY 2 /* used by yywarn() when calling yyerror() */
864dbfa3 656#define EVAL_KEEPERR 4 /* set by Perl_call_sv if G_KEEPERR */
6dc8a9e4 657#define EVAL_INREQUIRE 8 /* The code is being required. */
faef0170 658
e336de0d
GS
659/* Support for switching (stack and block) contexts.
660 * This ensures magic doesn't invalidate local stack and cx pointers.
661 */
662
e788e7d3
GS
663#define PERLSI_UNKNOWN -1
664#define PERLSI_UNDEF 0
665#define PERLSI_MAIN 1
666#define PERLSI_MAGIC 2
667#define PERLSI_SORT 3
668#define PERLSI_SIGNAL 4
669#define PERLSI_OVERLOAD 5
670#define PERLSI_DESTROY 6
671#define PERLSI_WARNHOOK 7
672#define PERLSI_DIEHOOK 8
673#define PERLSI_REQUIRE 9
e336de0d
GS
674
675struct stackinfo {
676 AV * si_stack; /* stack for current runlevel */
677 PERL_CONTEXT * si_cxstack; /* context stack for runlevel */
678 I32 si_cxix; /* current context index */
679 I32 si_cxmax; /* maximum allocated index */
680 I32 si_type; /* type of runlevel */
681 struct stackinfo * si_prev;
682 struct stackinfo * si_next;
ce2f7c3b 683 I32 si_markoff; /* offset where markstack begins for us.
e336de0d
GS
684 * currently used only with DEBUGGING,
685 * but not #ifdef-ed for bincompat */
686};
687
688typedef struct stackinfo PERL_SI;
689
3280af22
NIS
690#define cxstack (PL_curstackinfo->si_cxstack)
691#define cxstack_ix (PL_curstackinfo->si_cxix)
692#define cxstack_max (PL_curstackinfo->si_cxmax)
e336de0d
GS
693
694#ifdef DEBUGGING
ce2f7c3b
GS
695# define SET_MARK_OFFSET \
696 PL_curstackinfo->si_markoff = PL_markstack_ptr - PL_markstack
e336de0d 697#else
ce2f7c3b 698# define SET_MARK_OFFSET NOOP
e336de0d
GS
699#endif
700
d3acc0f7 701#define PUSHSTACKi(type) \
e336de0d 702 STMT_START { \
3280af22 703 PERL_SI *next = PL_curstackinfo->si_next; \
e336de0d
GS
704 if (!next) { \
705 next = new_stackinfo(32, 2048/sizeof(PERL_CONTEXT) - 1); \
3280af22
NIS
706 next->si_prev = PL_curstackinfo; \
707 PL_curstackinfo->si_next = next; \
e336de0d
GS
708 } \
709 next->si_type = type; \
710 next->si_cxix = -1; \
711 AvFILLp(next->si_stack) = 0; \
3280af22
NIS
712 SWITCHSTACK(PL_curstack,next->si_stack); \
713 PL_curstackinfo = next; \
ce2f7c3b 714 SET_MARK_OFFSET; \
e336de0d
GS
715 } STMT_END
716
e788e7d3 717#define PUSHSTACK PUSHSTACKi(PERLSI_UNKNOWN)
d3acc0f7 718
3095d977
GS
719/* POPSTACK works with PL_stack_sp, so it may need to be bracketed by
720 * PUTBACK/SPAGAIN to flush/refresh any local SP that may be active */
d3acc0f7 721#define POPSTACK \
e336de0d 722 STMT_START { \
39644a26 723 dSP; \
c4420975 724 PERL_SI * const prev = PL_curstackinfo->si_prev; \
e336de0d 725 if (!prev) { \
bf49b057 726 PerlIO_printf(Perl_error_log, "panic: POPSTACK\n"); \
e336de0d
GS
727 my_exit(1); \
728 } \
3280af22 729 SWITCHSTACK(PL_curstack,prev->si_stack); \
e336de0d 730 /* don't free prev here, free them all at the END{} */ \
3280af22 731 PL_curstackinfo = prev; \
e336de0d
GS
732 } STMT_END
733
734#define POPSTACK_TO(s) \
735 STMT_START { \
3280af22 736 while (PL_curstack != s) { \
bac4b2ad 737 dounwind(-1); \
d3acc0f7 738 POPSTACK; \
bac4b2ad 739 } \
e336de0d 740 } STMT_END
923e4eb5
JH
741
742#define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling)
743#define IN_PERL_RUNTIME (PL_curcop != &PL_compiling)
744
9850bf21
RH
745/*
746=head1 Multicall Functions
747
748=for apidoc Ams||dMULTICALL
749Declare local variables for a multicall. See L<perlcall/Lightweight Callbacks>.
750
751=for apidoc Ams||PUSH_MULTICALL
752Opening bracket for a lightweight callback.
753See L<perlcall/Lightweight Callbacks>.
754
755=for apidoc Ams||MULTICALL
756Make a lightweight callback. See L<perlcall/Lightweight Callbacks>.
757
758=for apidoc Ams||POP_MULTICALL
759Closing bracket for a lightweight callback.
760See L<perlcall/Lightweight Callbacks>.
761
762=cut
763*/
764
765#define dMULTICALL \
766 SV **newsp; /* set by POPBLOCK */ \
767 PERL_CONTEXT *cx; \
82f35e8b 768 CV *multicall_cv; \
9850bf21
RH
769 OP *multicall_cop; \
770 bool multicall_oldcatch; \
771 U8 hasargs = 0 /* used by PUSHSUB */
772
82f35e8b 773#define PUSH_MULTICALL(the_cv) \
9850bf21 774 STMT_START { \
0bcc34c2
AL
775 CV * const _nOnclAshIngNamE_ = the_cv; \
776 CV * const cv = _nOnclAshIngNamE_; \
777 AV * const padlist = CvPADLIST(cv); \
9850bf21
RH
778 ENTER; \
779 multicall_oldcatch = CATCH_GET; \
780 SAVETMPS; SAVEVPTR(PL_op); \
781 CATCH_SET(TRUE); \
782 PUSHBLOCK(cx, CXt_SUB|CXp_MULTICALL, PL_stack_sp); \
783 PUSHSUB(cx); \
784 if (++CvDEPTH(cv) >= 2) { \
785 PERL_STACK_OVERFLOW_CHECK(); \
786 Perl_pad_push(aTHX_ padlist, CvDEPTH(cv)); \
787 } \
788 SAVECOMPPAD(); \
789 PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv)); \
82f35e8b 790 multicall_cv = cv; \
9850bf21
RH
791 multicall_cop = CvSTART(cv); \
792 } STMT_END
793
794#define MULTICALL \
795 STMT_START { \
796 PL_op = multicall_cop; \
797 CALLRUNOPS(aTHX); \
798 } STMT_END
799
800#define POP_MULTICALL \
801 STMT_START { \
82f35e8b
RH
802 LEAVESUB(multicall_cv); \
803 CvDEPTH(multicall_cv)--; \
9850bf21
RH
804 POPBLOCK(cx,PL_curpm); \
805 CATCH_SET(multicall_oldcatch); \
806 LEAVE; \
807 } STMT_END