This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #117855] Store CopFILEGV in a pad under ithreads
[perl5.git] / scope.h
1 /*    scope.h
2  *
3  *    Copyright (C) 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
4  *    2002, 2004, 2005, 2006, 2007, 2008 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  */
10
11 /* *** these are ordered by number of of auto-popped args */
12
13 /* zero args */
14
15 #define SAVEt_ALLOC             0
16 #define SAVEt_CLEARPADRANGE     1
17 #define SAVEt_CLEARSV           2
18 #define SAVEt_REGCONTEXT        3
19 /*** SPARE                      4 ***/
20
21 #define SAVEt_ARG0_MAX          4
22
23 /* one arg */
24
25 #define SAVEt_BOOL              5
26 #define SAVEt_COMPILE_WARNINGS  6
27 #define SAVEt_COMPPAD           7
28 #define SAVEt_FREECOPHH         8
29 #define SAVEt_FREEOP            9
30 #define SAVEt_FREEPV            10
31 #define SAVEt_FREESV            11
32 #define SAVEt_I16               12
33 #define SAVEt_I32_SMALL         13
34 #define SAVEt_I8                14
35 #define SAVEt_INT_SMALL         15
36 #define SAVEt_MORTALIZESV       16
37 #define SAVEt_NSTAB             17
38 #define SAVEt_OP                18
39 #define SAVEt_PARSER            19
40 #define SAVEt_STACK_POS         20
41 #define SAVEt_READONLY_OFF      21
42 #ifdef USE_ITHREADS
43 # define SAVEt_COPFILEFREE      22
44 #endif
45
46 #define SAVEt_ARG1_MAX          22
47
48 /* two args */
49
50 #define SAVEt_AV                23
51 #define SAVEt_DESTRUCTOR        24
52 #define SAVEt_DESTRUCTOR_X      25
53 #define SAVEt_GENERIC_PVREF     26
54 #define SAVEt_GENERIC_SVREF     27
55 #define SAVEt_GP                28
56 #define SAVEt_GVSV              29
57 #define SAVEt_HINTS             30
58 #define SAVEt_HPTR              31
59 #define SAVEt_HV                32
60 #define SAVEt_I32               33
61 #define SAVEt_INT               34
62 #define SAVEt_ITEM              35
63 #define SAVEt_IV                36
64 #define SAVEt_LONG              37
65 #define SAVEt_PPTR              38
66 #define SAVEt_SAVESWITCHSTACK   39
67 #define SAVEt_SHARED_PVREF      40
68 #define SAVEt_SPTR              41
69 #define SAVEt_STACK_CXPOS       42
70 #define SAVEt_SV                43
71 #define SAVEt_SVREF             44
72 #define SAVEt_VPTR              45
73 #define SAVEt_ADELETE           46
74 #define SAVEt_APTR              47
75
76 #define SAVEt_ARG2_MAX          47
77
78 /* three args */
79
80 #define SAVEt_HELEM             48
81 #define SAVEt_PADSV_AND_MORTALIZE 49
82 #define SAVEt_SET_SVFLAGS       50
83 #define SAVEt_GVSLOT            51
84 #define SAVEt_AELEM             52
85 #define SAVEt_DELETE            53
86
87 #define SAVEf_SETMAGIC          1
88 #define SAVEf_KEEPOLDELEM       2
89
90 #define SAVE_TIGHT_SHIFT        6
91 #define SAVE_MASK               0x3F
92
93 #define save_aelem(av,idx,sptr) save_aelem_flags(av,idx,sptr,SAVEf_SETMAGIC)
94 #define save_helem(hv,key,sptr) save_helem_flags(hv,key,sptr,SAVEf_SETMAGIC)
95
96 #ifndef SCOPE_SAVES_SIGNAL_MASK
97 #define SCOPE_SAVES_SIGNAL_MASK 0
98 #endif
99
100 /* the maximum number of entries that might be pushed using the SS_ADD*
101  * macros */
102 #define SS_MAXPUSH 4
103
104 #define SSCHECK(need) if (PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max) savestack_grow()
105 #define SSGROW(need) if (PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max) savestack_grow_cnt(need + SS_MAXPUSH)
106 #define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
107 #define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
108 #define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p))
109 #define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i))
110 #define SSPUSHUV(u) (PL_savestack[PL_savestack_ix++].any_uv = (UV)(u))
111 #define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p))
112 #define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p))
113 #define SSPUSHDXPTR(p) (PL_savestack[PL_savestack_ix++].any_dxptr = (p))
114
115 /* SS_ADD*: newer, faster versions of the above. Don't mix the two sets of
116  * macros. These are fast because they save reduce accesses to the PL_
117  * vars and move the size check to the end. Doing the check last means
118  * that values in registers will have been pushed and no longer needed, so
119  * don't need saving around the call to grow. Also, tail-call elimination
120  * of the grow() can be done. These changes reduce the code of something
121  * like save_pushptrptr() to half its former size.
122  * Of course, doing the size check *after* pushing means we must always
123  * ensure there are SS_MAXPUSH free slots on the savestack
124  *
125  * These are for internal core use only and are subject to change */
126
127 #define dSS_ADD \
128     I32 ix = PL_savestack_ix;     \
129     ANY *ssp = &PL_savestack[ix];
130
131 #define SS_ADD_END(need) \
132     assert((need) <= SS_MAXPUSH);                               \
133     ix += (need);                                               \
134     PL_savestack_ix = ix;                                       \
135     assert(ix <= PL_savestack_max);                             \
136     if ((ix + SS_MAXPUSH) > PL_savestack_max) savestack_grow(); \
137     assert(PL_savestack_ix + SS_MAXPUSH <= PL_savestack_max);
138
139 #define SS_ADD_INT(i)   ((ssp++)->any_i32 = (I32)(i))
140 #define SS_ADD_LONG(i)  ((ssp++)->any_long = (long)(i))
141 #define SS_ADD_BOOL(p)  ((ssp++)->any_bool = (p))
142 #define SS_ADD_IV(i)    ((ssp++)->any_iv = (IV)(i))
143 #define SS_ADD_UV(u)    ((ssp++)->any_uv = (UV)(u))
144 #define SS_ADD_PTR(p)   ((ssp++)->any_ptr = (void*)(p))
145 #define SS_ADD_DPTR(p)  ((ssp++)->any_dptr = (p))
146 #define SS_ADD_DXPTR(p) ((ssp++)->any_dxptr = (p))
147
148 #define SSPOPINT (PL_savestack[--PL_savestack_ix].any_i32)
149 #define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long)
150 #define SSPOPBOOL (PL_savestack[--PL_savestack_ix].any_bool)
151 #define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv)
152 #define SSPOPUV (PL_savestack[--PL_savestack_ix].any_uv)
153 #define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr)
154 #define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr)
155 #define SSPOPDXPTR (PL_savestack[--PL_savestack_ix].any_dxptr)
156
157
158 /*
159 =head1 Callback Functions
160
161 =for apidoc Ams||SAVETMPS
162 Opening bracket for temporaries on a callback.  See C<FREETMPS> and
163 L<perlcall>.
164
165 =for apidoc Ams||FREETMPS
166 Closing bracket for temporaries on a callback.  See C<SAVETMPS> and
167 L<perlcall>.
168
169 =for apidoc Ams||ENTER
170 Opening bracket on a callback.  See C<LEAVE> and L<perlcall>.
171
172 =for apidoc Ams||LEAVE
173 Closing bracket on a callback.  See C<ENTER> and L<perlcall>.
174
175 =over
176
177 =item ENTER_with_name(name)
178
179 Same as C<ENTER>, but when debugging is enabled it also associates the
180 given literal string with the new scope.
181
182 =item LEAVE_with_name(name)
183
184 Same as C<LEAVE>, but when debugging is enabled it first checks that the
185 scope has the given name. Name must be a literal string.
186
187 =back
188
189 =cut
190 */
191
192 #define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tmps_ix
193 #define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps()
194
195 #ifdef DEBUGGING
196 #define ENTER                                                   \
197     STMT_START {                                                \
198         push_scope();                                           \
199         DEBUG_SCOPE("ENTER")                                    \
200     } STMT_END
201 #define LEAVE                                                   \
202     STMT_START {                                                \
203         DEBUG_SCOPE("LEAVE")                                    \
204         pop_scope();                                            \
205     } STMT_END
206 #define ENTER_with_name(name)                                           \
207     STMT_START {                                                        \
208         push_scope();                                                   \
209         if (PL_scopestack_name)                                         \
210             PL_scopestack_name[PL_scopestack_ix-1] = name;              \
211         DEBUG_SCOPE("ENTER \"" name "\"")                               \
212     } STMT_END
213 #define LEAVE_with_name(name)                                           \
214     STMT_START {                                                        \
215         DEBUG_SCOPE("LEAVE \"" name "\"")                               \
216         if (PL_scopestack_name) {                                       \
217             assert(((char*)PL_scopestack_name[PL_scopestack_ix-1]       \
218                         == (char*)name)                                 \
219                     || strEQ(PL_scopestack_name[PL_scopestack_ix-1], name));        \
220         }                                                               \
221         pop_scope();                                                    \
222     } STMT_END
223 #else
224 #define ENTER push_scope()
225 #define LEAVE pop_scope()
226 #define ENTER_with_name(name) ENTER
227 #define LEAVE_with_name(name) LEAVE
228 #endif
229 #define LEAVE_SCOPE(old) STMT_START { \
230         if (PL_savestack_ix > old) leave_scope(old); \
231     } STMT_END
232
233 #define SAVEI8(i)       save_I8((I8*)&(i))
234 #define SAVEI16(i)      save_I16((I16*)&(i))
235 #define SAVEI32(i)      save_I32((I32*)&(i))
236 #define SAVEINT(i)      save_int((int*)&(i))
237 #define SAVEIV(i)       save_iv((IV*)&(i))
238 #define SAVELONG(l)     save_long((long*)&(l))
239 #define SAVEBOOL(b)     save_bool(&(b))
240 #define SAVESPTR(s)     save_sptr((SV**)&(s))
241 #define SAVEPPTR(s)     save_pptr((char**)&(s))
242 #define SAVEVPTR(s)     save_vptr((void*)&(s))
243 #define SAVEPADSVANDMORTALIZE(s)        save_padsv_and_mortalize(s)
244 #define SAVEFREESV(s)   save_freesv(MUTABLE_SV(s))
245 #define SAVEMORTALIZESV(s)      save_mortalizesv(MUTABLE_SV(s))
246 #define SAVEFREEOP(o)   save_freeop((OP*)(o))
247 #define SAVEFREEPV(p)   save_freepv((char*)(p))
248 #define SAVECLEARSV(sv) save_clearsv((SV**)&(sv))
249 #define SAVEGENERICSV(s)        save_generic_svref((SV**)&(s))
250 #define SAVEGENERICPV(s)        save_generic_pvref((char**)&(s))
251 #define SAVESHAREDPV(s)         save_shared_pvref((char**)&(s))
252 #define SAVESETSVFLAGS(sv,mask,val)     save_set_svflags(sv,mask,val)
253 #define SAVEFREECOPHH(h)        save_pushptr((void *)(h), SAVEt_FREECOPHH)
254 #define SAVEDELETE(h,k,l) \
255           save_delete(MUTABLE_HV(h), (char*)(k), (I32)(l))
256 #define SAVEHDELETE(h,s) \
257           save_hdelete(MUTABLE_HV(h), (s))
258 #define SAVEADELETE(a,k) \
259           save_adelete(MUTABLE_AV(a), (I32)(k))
260 #define SAVEDESTRUCTOR(f,p) \
261           save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), (void*)(p))
262
263 #define SAVEDESTRUCTOR_X(f,p) \
264           save_destructor_x((DESTRUCTORFUNC_t)(f), (void*)(p))
265
266 #define SAVESTACK_POS() \
267     STMT_START {                                   \
268         dSS_ADD;                                   \
269         SS_ADD_INT(PL_stack_sp - PL_stack_base);   \
270         SS_ADD_UV(SAVEt_STACK_POS);                \
271         SS_ADD_END(2);                             \
272     } STMT_END
273
274 #define SAVEOP()        save_op()
275
276 #define SAVEHINTS()     save_hints()
277
278 #define SAVECOMPPAD() save_pushptr(MUTABLE_SV(PL_comppad), SAVEt_COMPPAD)
279
280 #define SAVESWITCHSTACK(f,t) \
281     STMT_START {                                        \
282         save_pushptrptr(MUTABLE_SV(f), MUTABLE_SV(t), SAVEt_SAVESWITCHSTACK); \
283         SWITCHSTACK((f),(t));                           \
284         PL_curstackinfo->si_stack = (t);                \
285     } STMT_END
286
287 /* Need to do the cop warnings like this, rather than a "SAVEFREESHAREDPV",
288    because realloc() means that the value can actually change. Possibly
289    could have done savefreesharedpvREF, but this way actually seems cleaner,
290    as it simplifies the code that does the saves, and reduces the load on the
291    save stack.  */
292 #define SAVECOMPILEWARNINGS() save_pushptr(PL_compiling.cop_warnings, SAVEt_COMPILE_WARNINGS)
293
294 #define SAVESTACK_CXPOS() \
295     STMT_START {                                   \
296         dSS_ADD;                                   \
297         SS_ADD_INT(cxstack[cxstack_ix].blk_oldsp); \
298         SS_ADD_INT(cxstack_ix);                    \
299         SS_ADD_UV(SAVEt_STACK_CXPOS);              \
300         SS_ADD_END(3);                             \
301     } STMT_END
302
303 #define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER)
304
305 #ifdef USE_ITHREADS
306 #  define SAVECOPSTASH_FREE(c)  SAVEIV((c)->cop_stashoff)
307 #  define SAVECOPFILE(c)        SAVEIV((c)->cop_filegvoff)
308 #  define SAVECOPFILE_FREE(c) ( \
309         SAVEIV((c)->cop_filegvoff),                     \
310         save_pushptr((void *)(c), SAVEt_COPFILEFREE)    \
311     )
312 #else
313 #  /* XXX not refcounted */
314 #  define SAVECOPSTASH_FREE(c)  SAVESPTR(CopSTASH(c))
315 #  define SAVECOPFILE(c)        SAVESPTR(CopFILEGV(c))
316 #  define SAVECOPFILE_FREE(c)   SAVEGENERICSV(CopFILEGV(c))
317 #endif
318
319 #define SAVECOPLINE(c)          SAVEI32(CopLINE(c))
320
321 /* SSNEW() temporarily allocates a specified number of bytes of data on the
322  * savestack.  It returns an integer index into the savestack, because a
323  * pointer would get broken if the savestack is moved on reallocation.
324  * SSNEWa() works like SSNEW(), but also aligns the data to the specified
325  * number of bytes.  MEM_ALIGNBYTES is perhaps the most useful.  The
326  * alignment will be preserved through savestack reallocation *only* if
327  * realloc returns data aligned to a size divisible by "align"!
328  *
329  * SSPTR() converts the index returned by SSNEW/SSNEWa() into a pointer.
330  */
331
332 #define SSNEW(size)             Perl_save_alloc(aTHX_ (size), 0)
333 #define SSNEWt(n,t)             SSNEW((n)*sizeof(t))
334 #define SSNEWa(size,align)      Perl_save_alloc(aTHX_ (size), \
335     (I32)(align - ((size_t)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align)
336 #define SSNEWat(n,t,align)      SSNEWa((n)*sizeof(t), align)
337
338 #define SSPTR(off,type)         ((type)  ((char*)PL_savestack + off))
339 #define SSPTRt(off,type)        ((type*) ((char*)PL_savestack + off))
340
341 #define save_freesv(op)         save_pushptr((void *)(op), SAVEt_FREESV)
342 #define save_mortalizesv(op)    save_pushptr((void *)(op), SAVEt_MORTALIZESV)
343
344 # define save_freeop(op)                    \
345 STMT_START {                                 \
346       OP * const _o = (OP *)(op);             \
347       assert(!_o->op_savefree);               \
348       _o->op_savefree = 1;                     \
349       save_pushptr((void *)(_o), SAVEt_FREEOP); \
350     } STMT_END
351 #define save_freepv(pv)         save_pushptr((void *)(pv), SAVEt_FREEPV)
352 #define save_op()               save_pushptr((void *)(PL_op), SAVEt_OP)
353
354 /*
355  * Local variables:
356  * c-indentation-style: bsd
357  * c-basic-offset: 4
358  * indent-tabs-mode: nil
359  * End:
360  *
361  * ex: set ts=8 sts=4 sw=4 et:
362  */