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 | |
5 | typedef struct coro { |
5 | typedef 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 | |
120 | void |
127 | void |
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 | |
152 | void |
162 | void |
153 | DESTROY(coro) |
163 | DESTROY(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); |