threads 1.67
[p5sagit/p5-mst-13.2.git] / cop.h
1 /*    cop.h
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others
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  *
9  * Control ops (cops) are one of the three ops OP_NEXTSTATE, OP_DBSTATE,
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,
13  * and thus can be used to determine our current state.
14  */
15
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
31 struct 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
38 typedef 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                          (void*)&cur_env, (void*)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                          (void*)PL_top_env, (void*)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)                                           \
126             PerlProc_exit(STATUS_EXIT);                         \
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
136 struct cop {
137     BASEOP
138     /* On LP64 putting this here takes advantage of the fact that BASEOP isn't
139        an exact multiple of 8 bytes to save structure padding.  */
140     line_t      cop_line;       /* line # of this command */
141     char *      cop_label;      /* label for this construct */
142 #ifdef USE_ITHREADS
143     char *      cop_stashpv;    /* package line was compiled in */
144     char *      cop_file;       /* file name the following line # is from */
145 #else
146     HV *        cop_stash;      /* package line was compiled in */
147     GV *        cop_filegv;     /* file the following line # is from */
148 #endif
149     U32         cop_hints;      /* hints bits from pragmata */
150     U32         cop_seq;        /* parse sequence number */
151     /* Beware. mg.c and warnings.pl assume the type of this is STRLEN *:  */
152     STRLEN *    cop_warnings;   /* lexical warnings bitmask */
153     /* compile time state of %^H.  See the comment in op.c for how this is
154        used to recreate a hash to return from caller.  */
155     struct refcounted_he * cop_hints_hash;
156 };
157
158 #ifdef USE_ITHREADS
159 #  define CopFILE(c)            ((c)->cop_file)
160 #  define CopFILEGV(c)          (CopFILE(c) \
161                                  ? gv_fetchfile(CopFILE(c)) : NULL)
162                                  
163 #  ifdef NETWARE
164 #    define CopFILE_set(c,pv)   ((c)->cop_file = savepv(pv))
165 #    define CopFILE_setn(c,pv,l)  ((c)->cop_file = savepv((pv),(l)))
166 #  else
167 #    define CopFILE_set(c,pv)   ((c)->cop_file = savesharedpv(pv))
168 #    define CopFILE_setn(c,pv,l)  ((c)->cop_file = savesharedpvn((pv),(l)))
169 #  endif
170
171 #  define CopFILESV(c)          (CopFILE(c) \
172                                  ? GvSV(gv_fetchfile(CopFILE(c))) : NULL)
173 #  define CopFILEAV(c)          (CopFILE(c) \
174                                  ? GvAV(gv_fetchfile(CopFILE(c))) : NULL)
175 #  ifdef DEBUGGING
176 #    define CopFILEAVx(c)       (assert(CopFILE(c)), \
177                                    GvAV(gv_fetchfile(CopFILE(c))))
178 #  else
179 #    define CopFILEAVx(c)       (GvAV(gv_fetchfile(CopFILE(c))))
180 #  endif
181 #  define CopSTASHPV(c)         ((c)->cop_stashpv)
182
183 #  ifdef NETWARE
184 #    define CopSTASHPV_set(c,pv)        ((c)->cop_stashpv = ((pv) ? savepv(pv) : NULL))
185 #  else
186 #    define CopSTASHPV_set(c,pv)        ((c)->cop_stashpv = savesharedpv(pv))
187 #  endif
188
189 #  define CopSTASH(c)           (CopSTASHPV(c) \
190                                  ? gv_stashpv(CopSTASHPV(c),GV_ADD) : NULL)
191 #  define CopSTASH_set(c,hv)    CopSTASHPV_set(c, (hv) ? HvNAME_get(hv) : NULL)
192 #  define CopSTASH_eq(c,hv)     ((hv) && stashpv_hvname_match(c,hv))
193 #  define CopLABEL(c)           ((c)->cop_label)
194 #  define CopLABEL_set(c,pv)    (CopLABEL(c) = (pv))
195 #  ifdef NETWARE
196 #    define CopSTASH_free(c) SAVECOPSTASH_FREE(c)
197 #    define CopFILE_free(c) SAVECOPFILE_FREE(c)
198 #    define CopLABEL_free(c) SAVECOPLABEL_FREE(c)
199 #    define CopLABEL_alloc(pv)  ((pv)?savepv(pv):NULL)
200 #  else
201 #    define CopSTASH_free(c)    PerlMemShared_free(CopSTASHPV(c))
202 #    define CopFILE_free(c)     (PerlMemShared_free(CopFILE(c)),(CopFILE(c) = NULL))
203 #    define CopLABEL_free(c)    (PerlMemShared_free(CopLABEL(c)),(CopLABEL(c) = NULL))
204 #    define CopLABEL_alloc(pv)  ((pv)?savesharedpv(pv):NULL)
205 #  endif
206 #else
207 #  define CopFILEGV(c)          ((c)->cop_filegv)
208 #  define CopFILEGV_set(c,gv)   ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
209 #  define CopFILE_set(c,pv)     CopFILEGV_set((c), gv_fetchfile(pv))
210 #  define CopFILE_setn(c,pv,l)  CopFILEGV_set((c), gv_fetchfile_flags((pv),(l),0))
211 #  define CopFILESV(c)          (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : NULL)
212 #  define CopFILEAV(c)          (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : NULL)
213 #  ifdef DEBUGGING
214 #    define CopFILEAVx(c)       (assert(CopFILEGV(c)), GvAV(CopFILEGV(c)))
215 #  else
216 #    define CopFILEAVx(c)       (GvAV(CopFILEGV(c)))
217 # endif
218 #  define CopFILE(c)            (CopFILEGV(c) && GvSV(CopFILEGV(c)) \
219                                     ? SvPVX(GvSV(CopFILEGV(c))) : NULL)
220 #  define CopSTASH(c)           ((c)->cop_stash)
221 #  define CopLABEL(c)           ((c)->cop_label)
222 #  define CopSTASH_set(c,hv)    ((c)->cop_stash = (hv))
223 #  define CopSTASHPV(c)         (CopSTASH(c) ? HvNAME_get(CopSTASH(c)) : NULL)
224    /* cop_stash is not refcounted */
225 #  define CopSTASHPV_set(c,pv)  CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
226 #  define CopSTASH_eq(c,hv)     (CopSTASH(c) == (hv))
227 #  define CopLABEL_alloc(pv)    ((pv)?savepv(pv):NULL)
228 #  define CopLABEL_set(c,pv)    (CopLABEL(c) = (pv))
229 #  define CopSTASH_free(c)      
230 #  define CopFILE_free(c)       (SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = NULL))
231 #  define CopLABEL_free(c)      (Safefree(CopLABEL(c)),(CopLABEL(c) = NULL))
232
233 #endif /* USE_ITHREADS */
234
235 #define CopSTASH_ne(c,hv)       (!CopSTASH_eq(c,hv))
236 #define CopLINE(c)              ((c)->cop_line)
237 #define CopLINE_inc(c)          (++CopLINE(c))
238 #define CopLINE_dec(c)          (--CopLINE(c))
239 #define CopLINE_set(c,l)        (CopLINE(c) = (l))
240
241 /* OutCopFILE() is CopFILE for output (caller, die, warn, etc.) */
242 #ifdef MACOS_TRADITIONAL
243 #  define OutCopFILE(c) MacPerl_MPWFileName(CopFILE(c))
244 #else
245 #  define OutCopFILE(c) CopFILE(c)
246 #endif
247
248 /* If $[ is non-zero, it's stored in cop_hints under the key "$[", and
249    HINT_ARYBASE is set to indicate this.
250    Setting it is ineficient due to the need to create 2 mortal SVs, but as
251    using $[ is highly discouraged, no sane Perl code will be using it.  */
252 #define CopARYBASE_get(c)       \
253         ((CopHINTS_get(c) & HINT_ARYBASE)                               \
254          ? SvIV(Perl_refcounted_he_fetch(aTHX_ (c)->cop_hints_hash, 0,  \
255                                          "$[", 2, 0, 0))                \
256          : 0)
257 #define CopARYBASE_set(c, b) STMT_START { \
258         if (b || ((c)->cop_hints & HINT_ARYBASE)) {                     \
259             (c)->cop_hints |= HINT_ARYBASE;                             \
260             if ((c) == &PL_compiling)                                   \
261                 PL_hints |= HINT_LOCALIZE_HH | HINT_ARYBASE;            \
262             (c)->cop_hints_hash                                         \
263                = Perl_refcounted_he_new(aTHX_ (c)->cop_hints_hash,      \
264                                         sv_2mortal(newSVpvs("$[")),     \
265                                         sv_2mortal(newSViv(b)));        \
266         }                                                               \
267     } STMT_END
268
269 /* FIXME NATIVE_HINTS if this is changed from op_private (see perl.h)  */
270 #define CopHINTS_get(c)         ((c)->cop_hints + 0)
271 #define CopHINTS_set(c, h)      STMT_START {                            \
272                                     (c)->cop_hints = (h);               \
273                                 } STMT_END
274
275 /*
276  * Here we have some enormously heavy (or at least ponderous) wizardry.
277  */
278
279 /* subroutine context */
280 struct block_sub {
281     CV *        cv;
282     GV *        gv;
283     GV *        dfoutgv;
284     AV *        savearray;
285     AV *        argarray;
286     I32         olddepth;
287     U8          hasargs;
288     U8          lval;           /* XXX merge lval and hasargs? */
289     PAD         *oldcomppad;
290     OP *        retop;  /* op to execute on exit from sub */
291 };
292
293 /* base for the next two macros. Don't use directly.
294  * Note that the refcnt of the cv is incremented twice;  The CX one is
295  * decremented by LEAVESUB, the other by LEAVE. */
296
297 #define PUSHSUB_BASE(cx)                                                \
298         cx->blk_sub.cv = cv;                                            \
299         cx->blk_sub.olddepth = CvDEPTH(cv);                             \
300         cx->blk_sub.hasargs = hasargs;                                  \
301         cx->blk_sub.retop = NULL;                                       \
302         if (!CvDEPTH(cv)) {                                             \
303             SvREFCNT_inc_simple_void_NN(cv);                            \
304             SvREFCNT_inc_simple_void_NN(cv);                            \
305             SAVEFREESV(cv);                                             \
306         }
307
308
309 #define PUSHSUB(cx)                                                     \
310         PUSHSUB_BASE(cx)                                                \
311         cx->blk_sub.lval = PL_op->op_private &                          \
312                               (OPpLVAL_INTRO|OPpENTERSUB_INARGS);
313
314 /* variant for use by OP_DBSTATE, where op_private holds hint bits */
315 #define PUSHSUB_DB(cx)                                                  \
316         PUSHSUB_BASE(cx)                                                \
317         cx->blk_sub.lval = 0;
318
319
320 #define PUSHFORMAT(cx)                                                  \
321         cx->blk_sub.cv = cv;                                            \
322         cx->blk_sub.gv = gv;                                            \
323         cx->blk_sub.retop = NULL;                                       \
324         cx->blk_sub.hasargs = 0;                                        \
325         cx->blk_sub.dfoutgv = PL_defoutgv;                              \
326         SvREFCNT_inc_void(cx->blk_sub.dfoutgv)
327
328 #define POP_SAVEARRAY()                                         \
329     STMT_START {                                                        \
330         SvREFCNT_dec(GvAV(PL_defgv));                                   \
331         GvAV(PL_defgv) = cx->blk_sub.savearray;                         \
332     } STMT_END
333
334 /* junk in @_ spells trouble when cloning CVs and in pp_caller(), so don't
335  * leave any (a fast av_clear(ary), basically) */
336 #define CLEAR_ARGARRAY(ary) \
337     STMT_START {                                                        \
338         AvMAX(ary) += AvARRAY(ary) - AvALLOC(ary);                      \
339         AvARRAY(ary) = AvALLOC(ary);                                    \
340         AvFILLp(ary) = -1;                                              \
341     } STMT_END
342
343 #define POPSUB(cx,sv)                                                   \
344     STMT_START {                                                        \
345         if (cx->blk_sub.hasargs) {                                      \
346             POP_SAVEARRAY();                                            \
347             /* abandon @_ if it got reified */                          \
348             if (AvREAL(cx->blk_sub.argarray)) {                         \
349                 const SSize_t fill = AvFILLp(cx->blk_sub.argarray);     \
350                 SvREFCNT_dec(cx->blk_sub.argarray);                     \
351                 cx->blk_sub.argarray = newAV();                         \
352                 av_extend(cx->blk_sub.argarray, fill);                  \
353                 AvREIFY_only(cx->blk_sub.argarray);                     \
354                 CX_CURPAD_SV(cx->blk_sub, 0) = (SV*)cx->blk_sub.argarray;       \
355             }                                                           \
356             else {                                                      \
357                 CLEAR_ARGARRAY(cx->blk_sub.argarray);                   \
358             }                                                           \
359         }                                                               \
360         sv = (SV*)cx->blk_sub.cv;                                       \
361         if (sv && (CvDEPTH((CV*)sv) = cx->blk_sub.olddepth))            \
362             sv = NULL;                                          \
363     } STMT_END
364
365 #define LEAVESUB(sv)                                                    \
366     STMT_START {                                                        \
367         if (sv)                                                         \
368             SvREFCNT_dec(sv);                                           \
369     } STMT_END
370
371 #define POPFORMAT(cx)                                                   \
372         setdefout(cx->blk_sub.dfoutgv);                                 \
373         SvREFCNT_dec(cx->blk_sub.dfoutgv);
374
375 /* eval context */
376 struct block_eval {
377     U8          old_in_eval;
378     U16         old_op_type;
379     SV *        old_namesv;
380     OP *        old_eval_root;
381     SV *        cur_text;
382     CV *        cv;
383     OP *        retop;  /* op to execute on exit from eval */
384     JMPENV *    cur_top_env; /* value of PL_top_env when eval CX created */
385 };
386
387 #define PUSHEVAL(cx,n,fgv)                                              \
388     STMT_START {                                                        \
389         cx->blk_eval.old_in_eval = PL_in_eval;                          \
390         cx->blk_eval.old_op_type = PL_op->op_type;                      \
391         cx->blk_eval.old_namesv = (n ? newSVpv(n,0) : NULL);            \
392         cx->blk_eval.old_eval_root = PL_eval_root;                      \
393         cx->blk_eval.cur_text = PL_parser ? PL_parser->linestr : NULL;  \
394         cx->blk_eval.cv = NULL; /* set by doeval(), as applicable */    \
395         cx->blk_eval.retop = NULL;                                      \
396         cx->blk_eval.cur_top_env = PL_top_env;                          \
397     } STMT_END
398
399 #define POPEVAL(cx)                                                     \
400     STMT_START {                                                        \
401         PL_in_eval = cx->blk_eval.old_in_eval;                          \
402         optype = cx->blk_eval.old_op_type;                              \
403         PL_eval_root = cx->blk_eval.old_eval_root;                      \
404         if (cx->blk_eval.old_namesv)                                    \
405             sv_2mortal(cx->blk_eval.old_namesv);                        \
406     } STMT_END
407
408 /* loop context */
409 struct block_loop {
410     char *      label;
411     I32         resetsp;
412     LOOP *      my_op;  /* My op, that contains redo, next and last ops.  */
413     /* (except for non_ithreads we need to modify next_op in pp_ctl.c, hence
414         why next_op is conditionally defined below.)  */
415 #ifdef USE_ITHREADS
416     void *      iterdata;
417     PAD         *oldcomppad;
418 #else
419     OP *        next_op;
420     SV **       itervar;
421 #endif
422     SV *        itersave;
423     /* (from inspection of source code) for a .. range of strings this is the
424        current string.  */
425     SV *        iterlval;
426     /* (from inspection of source code) for a foreach loop this is the array
427        being iterated over. For a .. range of numbers it's the current value.
428        A check is often made on the SvTYPE of iterary to determine whether
429        we are iterating over an array or a range. (numbers or strings)  */
430     AV *        iterary;
431     IV          iterix;
432     /* (from inspection of source code) for a .. range of numbers this is the
433        maximum value.  */
434     IV          itermax;
435 };
436 /* It might be possible to squeeze this structure further. As best I can tell
437    itermax and iterlval are never used at the same time, so it might be possible
438    to make them into a union. However, I'm not confident that there are enough
439    flag bits/NULLable pointers in this structure alone to encode which is
440    active. There is, however, U8 of space free in struct block, which could be
441    used. Right now it may not be worth squeezing this structure further, as it's
442    the largest part of struct block, and currently struct block is 64 bytes on
443    an ILP32 system, which will give good cache alignment.
444 */
445
446 #ifdef USE_ITHREADS
447 #  define CxITERVAR(c)                                                  \
448         ((c)->blk_loop.iterdata                                         \
449          ? (CxPADLOOP(cx)                                               \
450             ? &CX_CURPAD_SV( (c)->blk_loop,                             \
451                     INT2PTR(PADOFFSET, (c)->blk_loop.iterdata))         \
452             : &GvSV((GV*)(c)->blk_loop.iterdata))                       \
453          : (SV**)NULL)
454 #  define CX_ITERDATA_SET(cx,idata)                                     \
455         CX_CURPAD_SAVE(cx->blk_loop);                                   \
456         if ((cx->blk_loop.iterdata = (idata)))                          \
457             cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));       \
458         else                                                            \
459             cx->blk_loop.itersave = NULL;
460 #else
461 #  define CxITERVAR(c)          ((c)->blk_loop.itervar)
462 #  define CX_ITERDATA_SET(cx,ivar)                                      \
463         if ((cx->blk_loop.itervar = (SV**)(ivar)))                      \
464             cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));       \
465         else                                                            \
466             cx->blk_loop.itersave = NULL;
467 #endif
468
469 #ifdef USE_ITHREADS
470 #  define PUSHLOOP_OP_NEXT              /* No need to do anything.  */
471 #  define CX_LOOP_NEXTOP_GET(cx)        ((cx)->blk_loop.my_op->op_nextop + 0)
472 #else
473 #  define PUSHLOOP_OP_NEXT              cx->blk_loop.next_op = cLOOP->op_nextop
474 #  define CX_LOOP_NEXTOP_GET(cx)        ((cx)->blk_loop.next_op + 0)
475 #endif
476
477 #define PUSHLOOP(cx, dat, s)                                            \
478         cx->blk_loop.label = PL_curcop->cop_label;                      \
479         cx->blk_loop.resetsp = s - PL_stack_base;                       \
480         cx->blk_loop.my_op = cLOOP;                                     \
481         PUSHLOOP_OP_NEXT;                                               \
482         cx->blk_loop.iterlval = NULL;                                   \
483         cx->blk_loop.iterary = NULL;                                    \
484         cx->blk_loop.iterix = -1;                                       \
485         CX_ITERDATA_SET(cx,dat);
486
487 #define POPLOOP(cx)                                                     \
488         SvREFCNT_dec(cx->blk_loop.iterlval);                            \
489         if (CxITERVAR(cx)) {                                            \
490             if (SvPADMY(cx->blk_loop.itersave)) {                       \
491                 SV ** const s_v_p = CxITERVAR(cx);                      \
492                 sv_2mortal(*s_v_p);                                     \
493                 *s_v_p = cx->blk_loop.itersave;                         \
494             }                                                           \
495             else {                                                      \
496                 SvREFCNT_dec(cx->blk_loop.itersave);                    \
497             }                                                           \
498         }                                                               \
499         if (cx->blk_loop.iterary && cx->blk_loop.iterary != PL_curstack)\
500             SvREFCNT_dec(cx->blk_loop.iterary);
501
502 /* given/when context */
503 struct block_givwhen {
504         OP *leave_op;
505 };
506
507 #define PUSHGIVEN(cx)                                                   \
508         cx->blk_givwhen.leave_op = cLOGOP->op_other;
509
510 #define PUSHWHEN PUSHGIVEN
511
512 /* context common to subroutines, evals and loops */
513 struct block {
514     U16         blku_type;      /* what kind of context this is */
515     U8          blku_gimme;     /* is this block running in list context? */
516     U8          blku_spare;     /* Padding to match with struct subst */
517     I32         blku_oldsp;     /* stack pointer to copy stuff down to */
518     COP *       blku_oldcop;    /* old curcop pointer */
519     I32         blku_oldmarksp; /* mark stack index */
520     I32         blku_oldscopesp;        /* scope stack index */
521     PMOP *      blku_oldpm;     /* values of pattern match vars */
522
523     union {
524         struct block_sub        blku_sub;
525         struct block_eval       blku_eval;
526         struct block_loop       blku_loop;
527         struct block_givwhen    blku_givwhen;
528     } blk_u;
529 };
530 #define blk_oldsp       cx_u.cx_blk.blku_oldsp
531 #define blk_oldcop      cx_u.cx_blk.blku_oldcop
532 #define blk_oldmarksp   cx_u.cx_blk.blku_oldmarksp
533 #define blk_oldscopesp  cx_u.cx_blk.blku_oldscopesp
534 #define blk_oldpm       cx_u.cx_blk.blku_oldpm
535 #define blk_gimme       cx_u.cx_blk.blku_gimme
536 #define blk_sub         cx_u.cx_blk.blk_u.blku_sub
537 #define blk_eval        cx_u.cx_blk.blk_u.blku_eval
538 #define blk_loop        cx_u.cx_blk.blk_u.blku_loop
539 #define blk_givwhen     cx_u.cx_blk.blk_u.blku_givwhen
540
541 /* Enter a block. */
542 #define PUSHBLOCK(cx,t,sp) CXINC, cx = &cxstack[cxstack_ix],            \
543         cx->cx_type             = t,                                    \
544         cx->blk_oldsp           = sp - PL_stack_base,                   \
545         cx->blk_oldcop          = PL_curcop,                            \
546         cx->blk_oldmarksp       = PL_markstack_ptr - PL_markstack,      \
547         cx->blk_oldscopesp      = PL_scopestack_ix,                     \
548         cx->blk_oldpm           = PL_curpm,                             \
549         cx->blk_gimme           = (U8)gimme;                            \
550         DEBUG_l( PerlIO_printf(Perl_debug_log, "Entering block %ld, type %s\n", \
551                     (long)cxstack_ix, PL_block_type[CxTYPE(cx)]); )
552
553 /* Exit a block (RETURN and LAST). */
554 #define POPBLOCK(cx,pm) cx = &cxstack[cxstack_ix--],                    \
555         newsp            = PL_stack_base + cx->blk_oldsp,               \
556         PL_curcop        = cx->blk_oldcop,                              \
557         PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp,            \
558         PL_scopestack_ix = cx->blk_oldscopesp,                          \
559         pm               = cx->blk_oldpm,                               \
560         gimme            = cx->blk_gimme;                               \
561         DEBUG_SCOPE("POPBLOCK");                                        \
562         DEBUG_l( PerlIO_printf(Perl_debug_log, "Leaving block %ld, type %s\n",          \
563                     (long)cxstack_ix+1,PL_block_type[CxTYPE(cx)]); )
564
565 /* Continue a block elsewhere (NEXT and REDO). */
566 #define TOPBLOCK(cx) cx  = &cxstack[cxstack_ix],                        \
567         PL_stack_sp      = PL_stack_base + cx->blk_oldsp,               \
568         PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp,            \
569         PL_scopestack_ix = cx->blk_oldscopesp,                          \
570         PL_curpm         = cx->blk_oldpm;                               \
571         DEBUG_SCOPE("TOPBLOCK");
572
573 /* substitution context */
574 struct subst {
575     U16         sbu_type;       /* what kind of context this is */
576     U8          sbu_once;       /* Actually both booleans, but U8 to matches */
577     U8          sbu_rxtainted;  /* struct block */
578     I32         sbu_iters;
579     I32         sbu_maxiters;
580     I32         sbu_rflags;
581     I32         sbu_oldsave;
582     char *      sbu_orig;
583     SV *        sbu_dstr;
584     SV *        sbu_targ;
585     char *      sbu_s;
586     char *      sbu_m;
587     char *      sbu_strend;
588     void *      sbu_rxres;
589     REGEXP *    sbu_rx;
590 };
591 #define sb_iters        cx_u.cx_subst.sbu_iters
592 #define sb_maxiters     cx_u.cx_subst.sbu_maxiters
593 #define sb_rflags       cx_u.cx_subst.sbu_rflags
594 #define sb_oldsave      cx_u.cx_subst.sbu_oldsave
595 #define sb_once         cx_u.cx_subst.sbu_once
596 #define sb_rxtainted    cx_u.cx_subst.sbu_rxtainted
597 #define sb_orig         cx_u.cx_subst.sbu_orig
598 #define sb_dstr         cx_u.cx_subst.sbu_dstr
599 #define sb_targ         cx_u.cx_subst.sbu_targ
600 #define sb_s            cx_u.cx_subst.sbu_s
601 #define sb_m            cx_u.cx_subst.sbu_m
602 #define sb_strend       cx_u.cx_subst.sbu_strend
603 #define sb_rxres        cx_u.cx_subst.sbu_rxres
604 #define sb_rx           cx_u.cx_subst.sbu_rx
605
606 #define PUSHSUBST(cx) CXINC, cx = &cxstack[cxstack_ix],                 \
607         cx->sb_iters            = iters,                                \
608         cx->sb_maxiters         = maxiters,                             \
609         cx->sb_rflags           = r_flags,                              \
610         cx->sb_oldsave          = oldsave,                              \
611         cx->sb_once             = once,                                 \
612         cx->sb_rxtainted        = rxtainted,                            \
613         cx->sb_orig             = orig,                                 \
614         cx->sb_dstr             = dstr,                                 \
615         cx->sb_targ             = targ,                                 \
616         cx->sb_s                = s,                                    \
617         cx->sb_m                = m,                                    \
618         cx->sb_strend           = strend,                               \
619         cx->sb_rxres            = NULL,                                 \
620         cx->sb_rx               = rx,                                   \
621         cx->cx_type             = CXt_SUBST;                            \
622         rxres_save(&cx->sb_rxres, rx);                                  \
623         (void)ReREFCNT_inc(rx)
624
625 #define POPSUBST(cx) cx = &cxstack[cxstack_ix--];                       \
626         rxres_free(&cx->sb_rxres);                                      \
627         ReREFCNT_dec(cx->sb_rx)
628
629 struct context {
630     union {
631         struct block    cx_blk;
632         struct subst    cx_subst;
633     } cx_u;
634 };
635 #define cx_type cx_u.cx_subst.sbu_type
636
637 #define CXTYPEMASK      0xff
638 #define CXt_NULL        0
639 #define CXt_SUB         1
640 #define CXt_EVAL        2
641 #define CXt_LOOP        3
642 #define CXt_SUBST       4
643 #define CXt_BLOCK       5
644 #define CXt_FORMAT      6
645 #define CXt_GIVEN       7
646 #define CXt_WHEN        8
647
648 /* private flags for CXt_SUB and CXt_NULL */
649 #define CXp_MULTICALL   0x00000400      /* part of a multicall (so don't
650                                            tear down context on exit). */ 
651
652 /* private flags for CXt_EVAL */
653 #define CXp_REAL        0x00000100      /* truly eval'', not a lookalike */
654 #define CXp_TRYBLOCK    0x00000200      /* eval{}, not eval'' or similar */
655
656 /* private flags for CXt_LOOP */
657 #define CXp_FOREACH     0x00000200      /* a foreach loop */
658 #define CXp_FOR_DEF     0x00000400      /* foreach using $_ */
659 #ifdef USE_ITHREADS
660 #  define CXp_PADVAR    0x00000100      /* itervar lives on pad, iterdata
661                                            has pad offset; if not set,
662                                            iterdata holds GV* */
663 #  define CxPADLOOP(c)  (((c)->cx_type & (CXt_LOOP|CXp_PADVAR))         \
664                          == (CXt_LOOP|CXp_PADVAR))
665 #endif
666
667 #define CxTYPE(c)       ((c)->cx_type & CXTYPEMASK)
668 #define CxMULTICALL(c)  (((c)->cx_type & CXp_MULTICALL)                 \
669                          == CXp_MULTICALL)
670 #define CxREALEVAL(c)   (((c)->cx_type & (CXt_EVAL|CXp_REAL))           \
671                          == (CXt_EVAL|CXp_REAL))
672 #define CxTRYBLOCK(c)   (((c)->cx_type & (CXt_EVAL|CXp_TRYBLOCK))       \
673                          == (CXt_EVAL|CXp_TRYBLOCK))
674 #define CxFOREACH(c)    (((c)->cx_type & (CXt_LOOP|CXp_FOREACH))        \
675                          == (CXt_LOOP|CXp_FOREACH))
676 #define CxFOREACHDEF(c) (((c)->cx_type & (CXt_LOOP|CXp_FOREACH|CXp_FOR_DEF))\
677                          == (CXt_LOOP|CXp_FOREACH|CXp_FOR_DEF))
678
679 #define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc()))
680
681 /* 
682 =head1 "Gimme" Values
683 */
684
685 /*
686 =for apidoc AmU||G_SCALAR
687 Used to indicate scalar context.  See C<GIMME_V>, C<GIMME>, and
688 L<perlcall>.
689
690 =for apidoc AmU||G_ARRAY
691 Used to indicate list context.  See C<GIMME_V>, C<GIMME> and
692 L<perlcall>.
693
694 =for apidoc AmU||G_VOID
695 Used to indicate void context.  See C<GIMME_V> and L<perlcall>.
696
697 =for apidoc AmU||G_DISCARD
698 Indicates that arguments returned from a callback should be discarded.  See
699 L<perlcall>.
700
701 =for apidoc AmU||G_EVAL
702
703 Used to force a Perl C<eval> wrapper around a callback.  See
704 L<perlcall>.
705
706 =for apidoc AmU||G_NOARGS
707
708 Indicates that no arguments are being sent to a callback.  See
709 L<perlcall>.
710
711 =cut
712 */
713
714 #define G_SCALAR        0
715 #define G_ARRAY         1
716 #define G_VOID          128     /* skip this bit when adding flags below */
717
718 /* extra flags for Perl_call_* routines */
719 #define G_DISCARD       2       /* Call FREETMPS. */
720 #define G_EVAL          4       /* Assume eval {} around subroutine call. */
721 #define G_NOARGS        8       /* Don't construct a @_ array. */
722 #define G_KEEPERR      16       /* Append errors to $@, don't overwrite it */
723 #define G_NODEBUG      32       /* Disable debugging at toplevel.  */
724 #define G_METHOD       64       /* Calling method. */
725 #define G_FAKINGEVAL  256       /* Faking an eval context for call_sv or
726                                    fold_constants. */
727
728 /* flag bits for PL_in_eval */
729 #define EVAL_NULL       0       /* not in an eval */
730 #define EVAL_INEVAL     1       /* some enclosing scope is an eval */
731 #define EVAL_WARNONLY   2       /* used by yywarn() when calling yyerror() */
732 #define EVAL_KEEPERR    4       /* set by Perl_call_sv if G_KEEPERR */
733 #define EVAL_INREQUIRE  8       /* The code is being required. */
734
735 /* Support for switching (stack and block) contexts.
736  * This ensures magic doesn't invalidate local stack and cx pointers.
737  */
738
739 #define PERLSI_UNKNOWN          -1
740 #define PERLSI_UNDEF            0
741 #define PERLSI_MAIN             1
742 #define PERLSI_MAGIC            2
743 #define PERLSI_SORT             3
744 #define PERLSI_SIGNAL           4
745 #define PERLSI_OVERLOAD         5
746 #define PERLSI_DESTROY          6
747 #define PERLSI_WARNHOOK         7
748 #define PERLSI_DIEHOOK          8
749 #define PERLSI_REQUIRE          9
750
751 struct stackinfo {
752     AV *                si_stack;       /* stack for current runlevel */
753     PERL_CONTEXT *      si_cxstack;     /* context stack for runlevel */
754     struct stackinfo *  si_prev;
755     struct stackinfo *  si_next;
756     I32                 si_cxix;        /* current context index */
757     I32                 si_cxmax;       /* maximum allocated index */
758     I32                 si_type;        /* type of runlevel */
759     I32                 si_markoff;     /* offset where markstack begins for us.
760                                          * currently used only with DEBUGGING,
761                                          * but not #ifdef-ed for bincompat */
762 };
763
764 typedef struct stackinfo PERL_SI;
765
766 #define cxstack         (PL_curstackinfo->si_cxstack)
767 #define cxstack_ix      (PL_curstackinfo->si_cxix)
768 #define cxstack_max     (PL_curstackinfo->si_cxmax)
769
770 #ifdef DEBUGGING
771 #  define       SET_MARK_OFFSET \
772     PL_curstackinfo->si_markoff = PL_markstack_ptr - PL_markstack
773 #else
774 #  define       SET_MARK_OFFSET NOOP
775 #endif
776
777 #define PUSHSTACKi(type) \
778     STMT_START {                                                        \
779         PERL_SI *next = PL_curstackinfo->si_next;                       \
780         if (!next) {                                                    \
781             next = new_stackinfo(32, 2048/sizeof(PERL_CONTEXT) - 1);    \
782             next->si_prev = PL_curstackinfo;                            \
783             PL_curstackinfo->si_next = next;                            \
784         }                                                               \
785         next->si_type = type;                                           \
786         next->si_cxix = -1;                                             \
787         AvFILLp(next->si_stack) = 0;                                    \
788         SWITCHSTACK(PL_curstack,next->si_stack);                        \
789         PL_curstackinfo = next;                                         \
790         SET_MARK_OFFSET;                                                \
791     } STMT_END
792
793 #define PUSHSTACK PUSHSTACKi(PERLSI_UNKNOWN)
794
795 /* POPSTACK works with PL_stack_sp, so it may need to be bracketed by
796  * PUTBACK/SPAGAIN to flush/refresh any local SP that may be active */
797 #define POPSTACK \
798     STMT_START {                                                        \
799         dSP;                                                            \
800         PERL_SI * const prev = PL_curstackinfo->si_prev;                \
801         if (!prev) {                                                    \
802             PerlIO_printf(Perl_error_log, "panic: POPSTACK\n");         \
803             my_exit(1);                                                 \
804         }                                                               \
805         SWITCHSTACK(PL_curstack,prev->si_stack);                        \
806         /* don't free prev here, free them all at the END{} */          \
807         PL_curstackinfo = prev;                                         \
808     } STMT_END
809
810 #define POPSTACK_TO(s) \
811     STMT_START {                                                        \
812         while (PL_curstack != s) {                                      \
813             dounwind(-1);                                               \
814             POPSTACK;                                                   \
815         }                                                               \
816     } STMT_END
817
818 #define IN_PERL_COMPILETIME     (PL_curcop == &PL_compiling)
819 #define IN_PERL_RUNTIME         (PL_curcop != &PL_compiling)
820
821 /*
822 =head1 Multicall Functions
823
824 =for apidoc Ams||dMULTICALL
825 Declare local variables for a multicall. See L<perlcall/Lightweight Callbacks>.
826
827 =for apidoc Ams||PUSH_MULTICALL
828 Opening bracket for a lightweight callback.
829 See L<perlcall/Lightweight Callbacks>.
830
831 =for apidoc Ams||MULTICALL
832 Make a lightweight callback. See L<perlcall/Lightweight Callbacks>.
833
834 =for apidoc Ams||POP_MULTICALL
835 Closing bracket for a lightweight callback.
836 See L<perlcall/Lightweight Callbacks>.
837
838 =cut
839 */
840
841 #define dMULTICALL \
842     SV **newsp;                 /* set by POPBLOCK */                   \
843     PERL_CONTEXT *cx;                                                   \
844     CV *multicall_cv;                                                   \
845     OP *multicall_cop;                                                  \
846     bool multicall_oldcatch;                                            \
847     U8 hasargs = 0              /* used by PUSHSUB */
848
849 #define PUSH_MULTICALL(the_cv) \
850     STMT_START {                                                        \
851         CV * const _nOnclAshIngNamE_ = the_cv;                          \
852         CV * const cv = _nOnclAshIngNamE_;                              \
853         AV * const padlist = CvPADLIST(cv);                             \
854         ENTER;                                                          \
855         multicall_oldcatch = CATCH_GET;                                 \
856         SAVETMPS; SAVEVPTR(PL_op);                                      \
857         CATCH_SET(TRUE);                                                \
858         PUSHBLOCK(cx, CXt_SUB|CXp_MULTICALL, PL_stack_sp);              \
859         PUSHSUB(cx);                                                    \
860         if (++CvDEPTH(cv) >= 2) {                                       \
861             PERL_STACK_OVERFLOW_CHECK();                                \
862             Perl_pad_push(aTHX_ padlist, CvDEPTH(cv));                  \
863         }                                                               \
864         SAVECOMPPAD();                                                  \
865         PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));                       \
866         multicall_cv = cv;                                              \
867         multicall_cop = CvSTART(cv);                                    \
868     } STMT_END
869
870 #define MULTICALL \
871     STMT_START {                                                        \
872         PL_op = multicall_cop;                                          \
873         CALLRUNOPS(aTHX);                                               \
874     } STMT_END
875
876 #define POP_MULTICALL \
877     STMT_START {                                                        \
878         LEAVESUB(multicall_cv);                                         \
879         CvDEPTH(multicall_cv)--;                                        \
880         POPBLOCK(cx,PL_curpm);                                          \
881         CATCH_SET(multicall_oldcatch);                                  \
882         LEAVE;                                                          \
883     } STMT_END
884
885 /*
886  * Local variables:
887  * c-indentation-style: bsd
888  * c-basic-offset: 4
889  * indent-tabs-mode: t
890  * End:
891  *
892  * ex: set ts=8 sts=4 sw=4 noet:
893  */