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