home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 7: Programming / CDAT7.iso / Share / Editores / Perl5 / perl / lib / CORE / scope.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-10  |  4.1 KB  |  122 lines

  1. #define SAVEt_ITEM    0
  2. #define SAVEt_SV    1
  3. #define SAVEt_AV    2
  4. #define SAVEt_HV    3
  5. #define SAVEt_INT    4
  6. #define SAVEt_LONG    5
  7. #define SAVEt_I32    6
  8. #define SAVEt_IV    7
  9. #define SAVEt_SPTR    8
  10. #define SAVEt_APTR    9
  11. #define SAVEt_HPTR    10
  12. #define SAVEt_PPTR    11
  13. #define SAVEt_NSTAB    12
  14. #define SAVEt_SVREF    13
  15. #define SAVEt_GP    14
  16. #define SAVEt_FREESV    15
  17. #define SAVEt_FREEOP    16
  18. #define SAVEt_FREEPV    17
  19. #define SAVEt_CLEARSV    18
  20. #define SAVEt_DELETE    19
  21. #define SAVEt_DESTRUCTOR 20
  22. #define SAVEt_REGCONTEXT 21
  23. #define SAVEt_STACK_POS  22
  24. #define SAVEt_I16    23
  25.  
  26. #define SSCHECK(need) if (savestack_ix + need > savestack_max) savestack_grow()
  27. #define SSPUSHINT(i) (savestack[savestack_ix++].any_i32 = (I32)(i))
  28. #define SSPUSHLONG(i) (savestack[savestack_ix++].any_long = (long)(i))
  29. #define SSPUSHIV(i) (savestack[savestack_ix++].any_iv = (IV)(i))
  30. #define SSPUSHPTR(p) (savestack[savestack_ix++].any_ptr = (void*)(p))
  31. #define SSPUSHDPTR(p) (savestack[savestack_ix++].any_dptr = (p))
  32. #define SSPOPINT (savestack[--savestack_ix].any_i32)
  33. #define SSPOPLONG (savestack[--savestack_ix].any_long)
  34. #define SSPOPIV (savestack[--savestack_ix].any_iv)
  35. #define SSPOPPTR (savestack[--savestack_ix].any_ptr)
  36. #define SSPOPDPTR (savestack[--savestack_ix].any_dptr)
  37.  
  38. #define SAVETMPS save_int((int*)&tmps_floor), tmps_floor = tmps_ix
  39. #define FREETMPS if (tmps_ix > tmps_floor) free_tmps()
  40. #ifdef DEPRECATED
  41. #define FREE_TMPS() FREETMPS
  42. #endif
  43.  
  44. #define ENTER push_scope()
  45. #define LEAVE pop_scope()
  46. #define LEAVE_SCOPE(old) if (savestack_ix > old) leave_scope(old)
  47.  
  48. /*
  49.  * Not using SOFT_CAST on SAVEFREESV and SAVEFREESV
  50.  * because these are used for several kinds of pointer values
  51.  */
  52. #define SAVEI16(i)    save_I16(SOFT_CAST(I16*)&(i))
  53. #define SAVEI32(i)    save_I32(SOFT_CAST(I32*)&(i))
  54. #define SAVEINT(i)    save_int(SOFT_CAST(int*)&(i))
  55. #define SAVEIV(i)    save_iv(SOFT_CAST(IV*)&(i))
  56. #define SAVELONG(l)    save_long(SOFT_CAST(long*)&(l))
  57. #define SAVESPTR(s)    save_sptr((SV**)&(s))
  58. #define SAVEPPTR(s)    save_pptr(SOFT_CAST(char**)&(s))
  59. #define SAVEFREESV(s)    save_freesv((SV*)(s))
  60. #define SAVEFREEOP(o)    save_freeop(SOFT_CAST(OP*)(o))
  61. #define SAVEFREEPV(p)    save_freepv(SOFT_CAST(char*)(p))
  62. #define SAVECLEARSV(sv)    save_clearsv(SOFT_CAST(SV**)&(sv))
  63. #define SAVEDELETE(h,k,l) \
  64.       save_delete(SOFT_CAST(HV*)(h), SOFT_CAST(char*)(k), (I32)(l))
  65. #define SAVEDESTRUCTOR(f,p) \
  66.       save_destructor(SOFT_CAST(void(*)_((void*)))(f),SOFT_CAST(void*)(p))
  67. #define SAVESTACK_POS() STMT_START {    \
  68.     SSCHECK(2);                \
  69.     SSPUSHINT(stack_sp - stack_base);    \
  70.     SSPUSHINT(SAVEt_STACK_POS);        \
  71.  } STMT_END
  72.  
  73.  
  74. /* A jmpenv packages the state required to perform a proper non-local jump.
  75.  * Note that there is a start_env initialized when perl starts, and top_env
  76.  * points to this initially, so top_env should always be non-null.
  77.  *
  78.  * Existence of a non-null top_env->je_prev implies it is valid to call
  79.  * longjmp() at that runlevel (we make sure start_env.je_prev is always
  80.  * null to ensure this).
  81.  *
  82.  * je_mustcatch, when set at any runlevel to TRUE, means eval ops must
  83.  * establish a local jmpenv to handle exception traps.  Care must be taken
  84.  * to restore the previous value of je_mustcatch before exiting the
  85.  * stack frame iff JMPENV_PUSH was not called in that stack frame.
  86.  * GSAR 97-03-27
  87.  */
  88.  
  89. struct jmpenv {
  90.     struct jmpenv *    je_prev;
  91.     Sigjmp_buf        je_buf;        
  92.     int            je_ret;        /* return value of last setjmp() */
  93.     bool        je_mustcatch;    /* longjmp()s must be caught locally */
  94. };
  95.  
  96. typedef struct jmpenv JMPENV;
  97.  
  98. #define dJMPENV        JMPENV cur_env
  99. #define JMPENV_PUSH(v) \
  100.     STMT_START {                    \
  101.     cur_env.je_prev = top_env;            \
  102.     cur_env.je_ret = Sigsetjmp(cur_env.je_buf, 1);    \
  103.     top_env = &cur_env;                \
  104.     cur_env.je_mustcatch = FALSE;            \
  105.     (v) = cur_env.je_ret;                \
  106.     } STMT_END
  107. #define JMPENV_POP \
  108.     STMT_START { top_env = cur_env.je_prev; } STMT_END
  109. #define JMPENV_JUMP(v) \
  110.     STMT_START {                        \
  111.     if (top_env->je_prev)                    \
  112.         Siglongjmp(top_env->je_buf, (v));            \
  113.     if ((v) == 2)                        \
  114.         exit(STATUS_NATIVE_EXPORT);                \
  115.     PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");    \
  116.     exit(1);                        \
  117.     } STMT_END
  118.    
  119. #define CATCH_GET    (top_env->je_mustcatch)
  120. #define CATCH_SET(v)    (top_env->je_mustcatch = (v))
  121.    
  122.