home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / perl / 5.10.0 / CORE / scope.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-06-26  |  8.6 KB  |  263 lines

  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
  83. Opening bracket for temporaries on a callback.  See C<FREETMPS> and
  84. L<perlcall>.
  85.  
  86. =for apidoc Ams||FREETMPS
  87. Closing bracket for temporaries on a callback.  See C<SAVETMPS> and
  88. L<perlcall>.
  89.  
  90. =for apidoc Ams||ENTER
  91. Opening bracket on a callback.  See C<LEAVE> and L<perlcall>.
  92.  
  93. =for apidoc Ams||LEAVE
  94. Closing 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.