ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro.xs
(Generate patch)

Comparing Coro/Coro.xs (file contents):
Revision 1.1 by root, Tue Jul 3 02:53:34 2001 UTC vs.
Revision 1.5 by root, Fri Jul 13 13:05:38 2001 UTC

1#include "EXTERN.h" 1#include "EXTERN.h"
2#include "perl.h" 2#include "perl.h"
3#include "XSUB.h" 3#include "XSUB.h"
4 4
5typedef struct coro { 5typedef struct coro {
6 U8 dowarn;
7
6 PERL_SI *curstackinfo; 8 PERL_SI *curstackinfo;
7 AV *curstack; 9 AV *curstack;
8 AV *mainstack; 10 AV *mainstack;
11 SV **stack_sp;
12 SV **curpad;
9 SV **stack_base; 13 SV **stack_base;
10 SV **stack_sp;
11 SV **stack_max; 14 SV **stack_max;
12 SV **tmps_stack; 15 SV **tmps_stack;
13 I32 tmps_floor; 16 I32 tmps_floor;
14 I32 tmps_ix; 17 I32 tmps_ix;
15 I32 tmps_max; 18 I32 tmps_max;
28 31
29 SV *proc; 32 SV *proc;
30} *Coro; 33} *Coro;
31 34
32#define SAVE(c) \ 35#define SAVE(c) \
36 c->dowarn = PL_dowarn; \
33 c->curstackinfo = PL_curstackinfo; \ 37 c->curstackinfo = PL_curstackinfo; \
34 c->curstack = PL_curstack; \ 38 c->curstack = PL_curstack; \
35 c->mainstack = PL_mainstack; \ 39 c->mainstack = PL_mainstack; \
40 c->stack_sp = PL_stack_sp; \
41 c->curpad = PL_curpad; \
36 c->stack_base = PL_stack_base; \ 42 c->stack_base = PL_stack_base; \
37 c->stack_sp = PL_stack_sp; \
38 c->stack_max = PL_stack_max; \ 43 c->stack_max = PL_stack_max; \
39 c->tmps_stack = PL_tmps_stack; \ 44 c->tmps_stack = PL_tmps_stack; \
40 c->tmps_floor = PL_tmps_floor; \ 45 c->tmps_floor = PL_tmps_floor; \
41 c->tmps_ix = PL_tmps_ix; \ 46 c->tmps_ix = PL_tmps_ix; \
42 c->tmps_max = PL_tmps_max; \ 47 c->tmps_max = PL_tmps_max; \
43 c->markstack = PL_markstack; \ 48 c->markstack = PL_markstack; \
44 c->markstack_ptr = PL_markstack_ptr; \ 49 c->markstack_ptr = PL_markstack_ptr; \
45 c->markstack_max = PL_markstack_max; \ 50 c->markstack_max = PL_markstack_max; \
46 c->scopestack = PL_scopestack; \ 51 c->scopestack = PL_scopestack; \
47 c->scopestack_ix = PL_scopestack_ix; \ 52 c->scopestack_ix = PL_scopestack_ix; \
48 c->scopestack_max = PL_scopestack_max; \ 53 c->scopestack_max = PL_scopestack_max;\
49 c->savestack = PL_savestack; \ 54 c->savestack = PL_savestack; \
50 c->savestack_ix = PL_savestack_ix; \ 55 c->savestack_ix = PL_savestack_ix; \
51 c->savestack_max = PL_savestack_max; \ 56 c->savestack_max = PL_savestack_max; \
52 c->retstack = PL_retstack; \ 57 c->retstack = PL_retstack; \
53 c->retstack_ix = PL_retstack_ix; \ 58 c->retstack_ix = PL_retstack_ix; \
54 c->retstack_max = PL_retstack_max; 59 c->retstack_max = PL_retstack_max;
55 60
56#define LOAD(c) \ 61#define LOAD(c) \
62 PL_dowarn = c->dowarn; \
57 PL_curstackinfo = c->curstackinfo; \ 63 PL_curstackinfo = c->curstackinfo; \
58 PL_curstack = c->curstack; \ 64 PL_curstack = c->curstack; \
59 PL_mainstack = c->mainstack; \ 65 PL_mainstack = c->mainstack; \
66 PL_stack_sp = c->stack_sp; \
67 PL_curpad = c->curpad; \
60 PL_stack_base = c->stack_base; \ 68 PL_stack_base = c->stack_base; \
61 PL_stack_sp = c->stack_sp; \
62 PL_stack_max = c->stack_max; \ 69 PL_stack_max = c->stack_max; \
63 PL_tmps_stack = c->tmps_stack; \ 70 PL_tmps_stack = c->tmps_stack; \
64 PL_tmps_floor = c->tmps_floor; \ 71 PL_tmps_floor = c->tmps_floor; \
65 PL_tmps_ix = c->tmps_ix; \ 72 PL_tmps_ix = c->tmps_ix; \
66 PL_tmps_max = c->tmps_max; \ 73 PL_tmps_max = c->tmps_max; \
67 PL_markstack = c->markstack; \ 74 PL_markstack = c->markstack; \
68 PL_markstack_ptr = c->markstack_ptr; \ 75 PL_markstack_ptr = c->markstack_ptr; \
69 PL_markstack_max = c->markstack_max; \ 76 PL_markstack_max = c->markstack_max; \
70 PL_scopestack = c->scopestack; \ 77 PL_scopestack = c->scopestack; \
71 PL_scopestack_ix = c->scopestack_ix; \ 78 PL_scopestack_ix = c->scopestack_ix; \
72 PL_scopestack_max = c->scopestack_max; \ 79 PL_scopestack_max = c->scopestack_max;\
73 PL_savestack = c->savestack; \ 80 PL_savestack = c->savestack; \
74 PL_savestack_ix = c->savestack_ix; \ 81 PL_savestack_ix = c->savestack_ix; \
75 PL_savestack_max = c->savestack_max; \ 82 PL_savestack_max = c->savestack_max; \
76 PL_retstack = c->retstack; \ 83 PL_retstack = c->retstack; \
77 PL_retstack_ix = c->retstack_ix; \ 84 PL_retstack_ix = c->retstack_ix; \
116 RETVAL = coro; 123 RETVAL = coro;
117 OUTPUT: 124 OUTPUT:
118 RETVAL 125 RETVAL
119 126
120void 127void
121_transfer(old,new) 128_transfer(prev,next)
122 Coro old 129 Coro prev
123 Coro new 130 Coro next
124 CODE: 131 CODE:
125 132
126 PUTBACK; 133 PUTBACK;
127 SAVE (old); 134 SAVE (prev);
128 135
129 if (new->mainstack) /* this is, in theory, unnecessary overhead */ 136 if (next->mainstack) /* this is, in theory, unnecessary overhead */
130 { 137 {
131 LOAD (new); 138 LOAD (next);
132 SPAGAIN; 139 SPAGAIN;
133 } 140 }
134 else 141 else
135 { 142 {
136 init_stacks (); 143 init_stacks ();
137 144
145 ERRSV = newSVsv(&PL_sv_undef);
146 DEFSV = newSVsv(&PL_sv_undef);
147
138 SPAGAIN; 148 SPAGAIN;
139 PUSHMARK(SP); 149 PUSHMARK(SP);
140 PUTBACK; 150 PUTBACK;
141 call_sv (new->proc, G_VOID | G_DISCARD | G_EVAL); 151 call_sv (next->proc, G_VOID | G_DISCARD | G_EVAL);
142 152
143 exit (0); 153 exit (0);
144 154
145 SPAGAIN; 155 /*SPAGAIN;
146 SAVE (new); 156 SAVE (next);
147 157
148 LOAD (old); 158 LOAD (prev);
149 SPAGAIN; 159 SPAGAIN;*/
150 } 160 }
151 161
152void 162void
153DESTROY(coro) 163DESTROY(coro)
154 Coro coro 164 Coro coro
159 struct coro temp; 169 struct coro temp;
160 170
161 PUTBACK; 171 PUTBACK;
162 SAVE((&temp)); 172 SAVE((&temp));
163 LOAD(coro); 173 LOAD(coro);
174
164 S_nuke_stacks (); 175 S_nuke_stacks ();
176 SvREFCNT_dec (ERRSV);
177 SvREFCNT_dec (DEFSV);
178
165 LOAD((&temp)); 179 LOAD((&temp));
166 SPAGAIN; 180 SPAGAIN;
167 } 181 }
168 182
169 SvREFCNT_dec (coro->proc); 183 SvREFCNT_dec (coro->proc);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines