source: trunk/third/perl/scope.h @ 10724

Revision 10724, 4.1 KB checked in by ghudson, 27 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r10723, which included commits to RCS files with non-trunk default branches.
Line 
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
89struct 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
96typedef 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   
Note: See TracBrowser for help on using the repository browser.