home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Database Designers / Rational Rose 2000 / Rational Setup.EXE / common / lib / MSWin32-x86 / CORE / scope.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-01-26  |  5.5 KB  |  172 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. #define SAVEt_AELEM     24
  26. #define SAVEt_HELEM     25
  27. #define SAVEt_OP    26
  28. #define SAVEt_HINTS    27
  29.  
  30. #define SSCHECK(need) if (PL_savestack_ix + need > PL_savestack_max) savestack_grow()
  31. #define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
  32. #define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
  33. #define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i))
  34. #define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p))
  35. #define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p))
  36. #define SSPOPINT (PL_savestack[--PL_savestack_ix].any_i32)
  37. #define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long)
  38. #define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv)
  39. #define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr)
  40. #define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr)
  41.  
  42. #define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tmps_ix
  43. #define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps()
  44.  
  45. #ifdef DEBUGGING
  46. #define ENTER                            \
  47.     STMT_START {                        \
  48.     push_scope();                        \
  49.     DEBUG_l(WITH_THR(deb("ENTER scope %ld at %s:%d\n",    \
  50.             PL_scopestack_ix, __FILE__, __LINE__)));    \
  51.     } STMT_END
  52. #define LEAVE                            \
  53.     STMT_START {                        \
  54.     DEBUG_l(WITH_THR(deb("LEAVE scope %ld at %s:%d\n",    \
  55.             PL_scopestack_ix, __FILE__, __LINE__)));    \
  56.     pop_scope();                        \
  57.     } STMT_END
  58. #else
  59. #define ENTER push_scope()
  60. #define LEAVE pop_scope()
  61. #endif
  62. #define LEAVE_SCOPE(old) if (PL_savestack_ix > old) leave_scope(old)
  63.  
  64. /*
  65.  * Not using SOFT_CAST on SAVEFREESV and SAVEFREESV
  66.  * because these are used for several kinds of pointer values
  67.  */
  68. #define SAVEI16(i)    save_I16(SOFT_CAST(I16*)&(i))
  69. #define SAVEI32(i)    save_I32(SOFT_CAST(I32*)&(i))
  70. #define SAVEINT(i)    save_int(SOFT_CAST(int*)&(i))
  71. #define SAVEIV(i)    save_iv(SOFT_CAST(IV*)&(i))
  72. #define SAVELONG(l)    save_long(SOFT_CAST(long*)&(l))
  73. #define SAVESPTR(s)    save_sptr((SV**)&(s))
  74. #define SAVEPPTR(s)    save_pptr(SOFT_CAST(char**)&(s))
  75. #define SAVEFREESV(s)    save_freesv((SV*)(s))
  76. #define SAVEFREEOP(o)    save_freeop(SOFT_CAST(OP*)(o))
  77. #define SAVEFREEPV(p)    save_freepv(SOFT_CAST(char*)(p))
  78. #define SAVECLEARSV(sv)    save_clearsv(SOFT_CAST(SV**)&(sv))
  79. #define SAVEDELETE(h,k,l) \
  80.       save_delete(SOFT_CAST(HV*)(h), SOFT_CAST(char*)(k), (I32)(l))
  81. #ifdef PERL_OBJECT
  82. #define CALLDESTRUCTOR this->*SSPOPDPTR
  83. #define SAVEDESTRUCTOR(f,p) \
  84.       save_destructor((DESTRUCTORFUNC)(FUNC_NAME_TO_PTR(f)),    \
  85.               SOFT_CAST(void*)(p))
  86. #else
  87. #define CALLDESTRUCTOR *SSPOPDPTR
  88. #define SAVEDESTRUCTOR(f,p) \
  89.       save_destructor(SOFT_CAST(void(*)_((void*)))(FUNC_NAME_TO_PTR(f)), \
  90.               SOFT_CAST(void*)(p))
  91. #endif
  92.  
  93. #define SAVESTACK_POS() \
  94.     STMT_START {                \
  95.     SSCHECK(2);                \
  96.     SSPUSHINT(PL_stack_sp - PL_stack_base);    \
  97.     SSPUSHINT(SAVEt_STACK_POS);        \
  98.     } STMT_END
  99.  
  100. #define SAVEOP()    save_op()
  101.  
  102. #define SAVEHINTS() \
  103.     STMT_START {                \
  104.     if (PL_hints & HINT_LOCALIZE_HH)    \
  105.         save_hints();            \
  106.     else {                    \
  107.         SSCHECK(2);                \
  108.         SSPUSHINT(PL_hints);        \
  109.         SSPUSHINT(SAVEt_HINTS);        \
  110.     }                    \
  111.     } STMT_END
  112.  
  113. /* A jmpenv packages the state required to perform a proper non-local jump.
  114.  * Note that there is a start_env initialized when perl starts, and top_env
  115.  * points to this initially, so top_env should always be non-null.
  116.  *
  117.  * Existence of a non-null top_env->je_prev implies it is valid to call
  118.  * longjmp() at that runlevel (we make sure start_env.je_prev is always
  119.  * null to ensure this).
  120.  *
  121.  * je_mustcatch, when set at any runlevel to TRUE, means eval ops must
  122.  * establish a local jmpenv to handle exception traps.  Care must be taken
  123.  * to restore the previous value of je_mustcatch before exiting the
  124.  * stack frame iff JMPENV_PUSH was not called in that stack frame.
  125.  * GSAR 97-03-27
  126.  */
  127.  
  128. struct jmpenv {
  129.     struct jmpenv *    je_prev;
  130.     Sigjmp_buf        je_buf;        
  131.     int            je_ret;        /* return value of last setjmp() */
  132.     bool        je_mustcatch;    /* longjmp()s must be caught locally */
  133. };
  134.  
  135. typedef struct jmpenv JMPENV;
  136.  
  137. #ifdef OP_IN_REGISTER
  138. #define OP_REG_TO_MEM    PL_opsave = op
  139. #define OP_MEM_TO_REG    op = PL_opsave
  140. #else
  141. #define OP_REG_TO_MEM    NOOP
  142. #define OP_MEM_TO_REG    NOOP
  143. #endif
  144.  
  145. #define dJMPENV        JMPENV cur_env
  146. #define JMPENV_PUSH(v) \
  147.     STMT_START {                    \
  148.     cur_env.je_prev = PL_top_env;            \
  149.     OP_REG_TO_MEM;                    \
  150.     cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, 1);    \
  151.     OP_MEM_TO_REG;                    \
  152.     PL_top_env = &cur_env;                \
  153.     cur_env.je_mustcatch = FALSE;            \
  154.     (v) = cur_env.je_ret;                \
  155.     } STMT_END
  156. #define JMPENV_POP \
  157.     STMT_START { PL_top_env = cur_env.je_prev; } STMT_END
  158. #define JMPENV_JUMP(v) \
  159.     STMT_START {                        \
  160.     OP_REG_TO_MEM;                        \
  161.     if (PL_top_env->je_prev)                    \
  162.         PerlProc_longjmp(PL_top_env->je_buf, (v));            \
  163.     if ((v) == 2)                        \
  164.         PerlProc_exit(STATUS_NATIVE_EXPORT);                \
  165.     PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");    \
  166.     PerlProc_exit(1);                        \
  167.     } STMT_END
  168.    
  169. #define CATCH_GET    (PL_top_env->je_mustcatch)
  170. #define CATCH_SET(v)    (PL_top_env->je_mustcatch = (v))
  171.    
  172.