perl/scope.h
<<
>>
Prefs
   1/*    scope.h
   2 *
   3 *    Copyright (C) 1993, 1994, 1996, 1997, 1998, 1999,
   4 *    2000, 2001, 2002, 2004, 2005, 2006, 2007 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#define SAVEt_ITEM              0
  12#define SAVEt_SV                1
  13#define SAVEt_AV                2
  14#define SAVEt_HV                3
  15#define SAVEt_INT               4
  16#define SAVEt_LONG              5
  17#define SAVEt_I32               6
  18#define SAVEt_IV                7
  19#define SAVEt_SPTR              8
  20#define SAVEt_APTR              9
  21#define SAVEt_HPTR              10
  22#define SAVEt_PPTR              11
  23#define SAVEt_NSTAB             12
  24#define SAVEt_SVREF             13
  25#define SAVEt_GP                14
  26#define SAVEt_FREESV            15
  27#define SAVEt_FREEOP            16
  28#define SAVEt_FREEPV            17
  29#define SAVEt_CLEARSV           18
  30#define SAVEt_DELETE            19
  31#define SAVEt_DESTRUCTOR        20
  32#define SAVEt_REGCONTEXT        21
  33#define SAVEt_STACK_POS         22
  34#define SAVEt_I16               23
  35#define SAVEt_AELEM             24
  36#define SAVEt_HELEM             25
  37#define SAVEt_OP                26
  38#define SAVEt_HINTS             27
  39#define SAVEt_ALLOC             28
  40#define SAVEt_GENERIC_SVREF     29
  41#define SAVEt_DESTRUCTOR_X      30
  42#define SAVEt_VPTR              31
  43#define SAVEt_I8                32
  44#define SAVEt_COMPPAD           33
  45#define SAVEt_GENERIC_PVREF     34
  46#define SAVEt_PADSV             35
  47#define SAVEt_MORTALIZESV       36
  48#define SAVEt_SHARED_PVREF      37
  49#define SAVEt_BOOL              38
  50#define SAVEt_SET_SVFLAGS       39
  51#define SAVEt_SAVESWITCHSTACK   40
  52#define SAVEt_COP_ARYBASE       41
  53#define SAVEt_RE_STATE          42
  54#define SAVEt_COMPILE_WARNINGS  43
  55#define SAVEt_STACK_CXPOS       44
  56#define SAVEt_PARSER            45
  57
  58#ifndef SCOPE_SAVES_SIGNAL_MASK
  59#define SCOPE_SAVES_SIGNAL_MASK 0
  60#endif
  61
  62#define SSCHECK(need) if (PL_savestack_ix + (I32)(need) > PL_savestack_max) savestack_grow()
  63#define SSGROW(need) if (PL_savestack_ix + (I32)(need) > PL_savestack_max) savestack_grow_cnt(need)
  64#define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
  65#define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
  66#define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p))
  67#define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i))
  68#define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p))
  69#define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p))
  70#define SSPUSHDXPTR(p) (PL_savestack[PL_savestack_ix++].any_dxptr = (p))
  71#define SSPOPINT (PL_savestack[--PL_savestack_ix].any_i32)
  72#define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long)
  73#define SSPOPBOOL (PL_savestack[--PL_savestack_ix].any_bool)
  74#define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv)
  75#define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr)
  76#define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr)
  77#define SSPOPDXPTR (PL_savestack[--PL_savestack_ix].any_dxptr)
  78
  79/*
  80=head1 Callback Functions
  81
  82=for apidoc Ams||SAVETMPS
  83Opening bracket for temporaries on a callback.  See C<FREETMPS> and
  84L<perlcall>.
  85
  86=for apidoc Ams||FREETMPS
  87Closing bracket for temporaries on a callback.  See C<SAVETMPS> and
  88L<perlcall>.
  89
  90=for apidoc Ams||ENTER
  91Opening bracket on a callback.  See C<LEAVE> and L<perlcall>.
  92
  93=for apidoc Ams||LEAVE
  94Closing bracket on a callback.  See C<ENTER> and L<perlcall>.
  95
  96=cut
  97*/
  98
  99#define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tmps_ix
 100#define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps()
 101
 102#ifdef DEBUGGING
 103#define ENTER                                                   \
 104    STMT_START {                                                \
 105        push_scope();                                           \
 106        DEBUG_SCOPE("ENTER")                                    \
 107    } STMT_END
 108#define LEAVE                                                   \
 109    STMT_START {                                                \
 110        DEBUG_SCOPE("LEAVE")                                    \
 111        pop_scope();                                            \
 112    } STMT_END
 113#else
 114#define ENTER push_scope()
 115#define LEAVE pop_scope()
 116#endif
 117#define LEAVE_SCOPE(old) if (PL_savestack_ix > old) leave_scope(old)
 118
 119#define SAVEI8(i)       save_I8((I8*)&(i))
 120#define SAVEI16(i)      save_I16((I16*)&(i))
 121#define SAVEI32(i)      save_I32((I32*)&(i))
 122#define SAVEINT(i)      save_int((int*)&(i))
 123#define SAVEIV(i)       save_iv((IV*)&(i))
 124#define SAVELONG(l)     save_long((long*)&(l))
 125#define SAVEBOOL(b)     save_bool((bool*)&(b))
 126#define SAVESPTR(s)     save_sptr((SV**)&(s))
 127#define SAVEPPTR(s)     save_pptr((char**)&(s))
 128#define SAVEVPTR(s)     save_vptr((void*)&(s))
 129#define SAVEPADSV(s)    save_padsv(s)
 130#define SAVEFREESV(s)   save_freesv((SV*)(s))
 131#define SAVEMORTALIZESV(s)      save_mortalizesv((SV*)(s))
 132#define SAVEFREEOP(o)   save_freeop((OP*)(o))
 133#define SAVEFREEPV(p)   save_freepv((char*)(p))
 134#define SAVECLEARSV(sv) save_clearsv((SV**)&(sv))
 135#define SAVEGENERICSV(s)        save_generic_svref((SV**)&(s))
 136#define SAVEGENERICPV(s)        save_generic_pvref((char**)&(s))
 137#define SAVESHAREDPV(s)         save_shared_pvref((char**)&(s))
 138#define SAVESETSVFLAGS(sv,mask,val)     save_set_svflags(sv,mask,val)
 139#define SAVEDELETE(h,k,l) \
 140          save_delete((HV*)(h), (char*)(k), (I32)(l))
 141#define SAVEDESTRUCTOR(f,p) \
 142          save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), (void*)(p))
 143
 144#define SAVEDESTRUCTOR_X(f,p) \
 145          save_destructor_x((DESTRUCTORFUNC_t)(f), (void*)(p))
 146
 147#define SAVESTACK_POS() \
 148    STMT_START {                                \
 149        SSCHECK(2);                             \
 150        SSPUSHINT(PL_stack_sp - PL_stack_base); \
 151        SSPUSHINT(SAVEt_STACK_POS);             \
 152    } STMT_END
 153
 154#define SAVEOP()        save_op()
 155
 156#define SAVEHINTS() \
 157    STMT_START {                                        \
 158        SSCHECK(4);                                     \
 159        if (PL_hints & HINT_LOCALIZE_HH) {              \
 160            SSPUSHPTR(GvHV(PL_hintgv));                 \
 161            GvHV(PL_hintgv) = Perl_hv_copy_hints_hv(aTHX_ GvHV(PL_hintgv)); \
 162        }                                               \
 163        if (PL_compiling.cop_hints_hash) {              \
 164            HINTS_REFCNT_LOCK;                          \
 165            PL_compiling.cop_hints_hash->refcounted_he_refcnt++;        \
 166            HINTS_REFCNT_UNLOCK;                        \
 167        }                                               \
 168        SSPUSHPTR(PL_compiling.cop_hints_hash);         \
 169        SSPUSHINT(PL_hints);                            \
 170        SSPUSHINT(SAVEt_HINTS);                         \
 171    } STMT_END
 172
 173#define SAVECOMPPAD() \
 174    STMT_START {                                                \
 175        SSCHECK(2);                                             \
 176        SSPUSHPTR((SV*)PL_comppad);                             \
 177        SSPUSHINT(SAVEt_COMPPAD);                               \
 178    } STMT_END
 179
 180#define SAVESWITCHSTACK(f,t) \
 181    STMT_START {                                        \
 182        SSCHECK(3);                                     \
 183        SSPUSHPTR((SV*)(f));                            \
 184        SSPUSHPTR((SV*)(t));                            \
 185        SSPUSHINT(SAVEt_SAVESWITCHSTACK);               \
 186        SWITCHSTACK((f),(t));                           \
 187        PL_curstackinfo->si_stack = (t);                \
 188    } STMT_END
 189
 190#define SAVECOPARYBASE(c) \
 191    STMT_START {                                        \
 192        SSCHECK(3);                                     \
 193        SSPUSHINT(CopARYBASE_get(c));                   \
 194        SSPUSHPTR(c);                                   \
 195        SSPUSHINT(SAVEt_COP_ARYBASE);                   \
 196    } STMT_END
 197
 198/* Need to do the cop warnings like this, rather than a "SAVEFREESHAREDPV",
 199   because realloc() means that the value can actually change. Possibly
 200   could have done savefreesharedpvREF, but this way actually seems cleaner,
 201   as it simplifies the code that does the saves, and reduces the load on the
 202   save stack.  */
 203#define SAVECOMPILEWARNINGS() \
 204    STMT_START {                                        \
 205        SSCHECK(2);                                     \
 206        SSPUSHPTR(PL_compiling.cop_warnings);           \
 207        SSPUSHINT(SAVEt_COMPILE_WARNINGS);              \
 208    } STMT_END
 209
 210#define SAVESTACK_CXPOS() \
 211    STMT_START {                                  \
 212        SSCHECK(3);                               \
 213        SSPUSHINT(cxstack[cxstack_ix].blk_oldsp); \
 214        SSPUSHINT(cxstack_ix);                    \
 215        SSPUSHINT(SAVEt_STACK_CXPOS);             \
 216    } STMT_END
 217
 218#define SAVEPARSER(p) \
 219    STMT_START {                                  \
 220        SSCHECK(2);                               \
 221        SSPUSHPTR(p);                             \
 222        SSPUSHINT(SAVEt_PARSER);                  \
 223    } STMT_END
 224
 225#ifdef USE_ITHREADS
 226#  define SAVECOPSTASH(c)       SAVEPPTR(CopSTASHPV(c))
 227#  define SAVECOPSTASH_FREE(c)  SAVESHAREDPV(CopSTASHPV(c))
 228#  define SAVECOPFILE(c)        SAVEPPTR(CopFILE(c))
 229#  define SAVECOPFILE_FREE(c)   SAVESHAREDPV(CopFILE(c))
 230#  define SAVECOPLABEL(c)       SAVEPPTR(CopLABEL(c))
 231#  define SAVECOPLABEL_FREE(c)  SAVESHAREDPV(CopLABEL(c))
 232#else
 233#  define SAVECOPSTASH(c)       SAVESPTR(CopSTASH(c))
 234#  define SAVECOPSTASH_FREE(c)  SAVECOPSTASH(c) /* XXX not refcounted */
 235#  define SAVECOPFILE(c)        SAVESPTR(CopFILEGV(c))
 236#  define SAVECOPFILE_FREE(c)   SAVEGENERICSV(CopFILEGV(c))
 237#  define SAVECOPLABEL(c)       SAVEPPTR(CopLABEL(c))
 238#  define SAVECOPLABEL_FREE(c)  SAVEPPTR(CopLABEL(c))
 239#endif
 240
 241#define SAVECOPLINE(c)          SAVEI32(CopLINE(c))
 242
 243/* SSNEW() temporarily allocates a specified number of bytes of data on the
 244 * savestack.  It returns an integer index into the savestack, because a
 245 * pointer would get broken if the savestack is moved on reallocation.
 246 * SSNEWa() works like SSNEW(), but also aligns the data to the specified
 247 * number of bytes.  MEM_ALIGNBYTES is perhaps the most useful.  The
 248 * alignment will be preserved therough savestack reallocation *only* if
 249 * realloc returns data aligned to a size divisible by "align"!
 250 *
 251 * SSPTR() converts the index returned by SSNEW/SSNEWa() into a pointer.
 252 */
 253
 254#define SSNEW(size)             Perl_save_alloc(aTHX_ (size), 0)
 255#define SSNEWt(n,t)             SSNEW((n)*sizeof(t))
 256#define SSNEWa(size,align)      Perl_save_alloc(aTHX_ (size), \
 257    (align - ((int)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align)
 258#define SSNEWat(n,t,align)      SSNEWa((n)*sizeof(t), align)
 259
 260#define SSPTR(off,type)         ((type)  ((char*)PL_savestack + off))
 261#define SSPTRt(off,type)        ((type*) ((char*)PL_savestack + off))
 262
 263
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.