… | |
… | |
177 | |
177 | |
178 | /* optionally saved, might be zero */ |
178 | /* optionally saved, might be zero */ |
179 | AV *defav; /* @_ */ |
179 | AV *defav; /* @_ */ |
180 | SV *defsv; /* $_ */ |
180 | SV *defsv; /* $_ */ |
181 | SV *errsv; /* $@ */ |
181 | SV *errsv; /* $@ */ |
|
|
182 | GV *deffh; /* default filehandle */ |
182 | SV *irssv; /* $/ */ |
183 | SV *irssv; /* $/ */ |
183 | SV *irssv_sv; /* real $/ cache */ |
184 | SV *irssv_sv; /* real $/ cache */ |
184 | |
185 | |
185 | #define VAR(name,type) type name; |
186 | #define VAR(name,type) type name; |
186 | # include "state.h" |
187 | # include "state.h" |
… | |
… | |
341 | #undef VAR |
342 | #undef VAR |
342 | |
343 | |
343 | if (c->defav) REPLACE_SV (GvAV (PL_defgv), c->defav); |
344 | if (c->defav) REPLACE_SV (GvAV (PL_defgv), c->defav); |
344 | if (c->defsv) REPLACE_SV (DEFSV , c->defsv); |
345 | if (c->defsv) REPLACE_SV (DEFSV , c->defsv); |
345 | if (c->errsv) REPLACE_SV (ERRSV , c->errsv); |
346 | if (c->errsv) REPLACE_SV (ERRSV , c->errsv); |
|
|
347 | if (c->deffh) REPLACE_SV (PL_defoutgv , c->deffh); |
|
|
348 | |
346 | if (c->irssv) |
349 | if (c->irssv) |
347 | { |
350 | { |
348 | if (c->irssv == PL_rs || sv_eq (PL_rs, c->irssv)) |
351 | if (c->irssv == PL_rs || sv_eq (PL_rs, c->irssv)) |
|
|
352 | { |
349 | SvREFCNT_dec (c->irssv); |
353 | SvREFCNT_dec (c->irssv); |
|
|
354 | c->irssv = 0; |
|
|
355 | } |
350 | else |
356 | else |
351 | { |
357 | { |
352 | REPLACE_SV (PL_rs, c->irssv); |
358 | REPLACE_SV (PL_rs, c->irssv); |
353 | if (!c->irssv_sv) c->irssv_sv = get_sv ("/", 0); |
359 | if (!c->irssv_sv) c->irssv_sv = get_sv ("/", 0); |
354 | sv_setsv (c->irssv_sv, PL_rs); |
360 | sv_setsv (c->irssv_sv, PL_rs); |
… | |
… | |
425 | } |
431 | } |
426 | |
432 | |
427 | c->defav = c->save & CORO_SAVE_DEFAV ? (AV *)SvREFCNT_inc (GvAV (PL_defgv)) : 0; |
433 | c->defav = c->save & CORO_SAVE_DEFAV ? (AV *)SvREFCNT_inc (GvAV (PL_defgv)) : 0; |
428 | c->defsv = c->save & CORO_SAVE_DEFSV ? SvREFCNT_inc (DEFSV) : 0; |
434 | c->defsv = c->save & CORO_SAVE_DEFSV ? SvREFCNT_inc (DEFSV) : 0; |
429 | c->errsv = c->save & CORO_SAVE_ERRSV ? SvREFCNT_inc (ERRSV) : 0; |
435 | c->errsv = c->save & CORO_SAVE_ERRSV ? SvREFCNT_inc (ERRSV) : 0; |
|
|
436 | c->deffh = c->save & CORO_SAVE_DEFFH ? (GV *)SvREFCNT_inc (PL_defoutgv) : 0; |
430 | c->irssv = c->save & CORO_SAVE_IRSSV ? SvREFCNT_inc (PL_rs) : 0; |
437 | c->irssv = c->save & CORO_SAVE_IRSSV ? SvREFCNT_inc (PL_rs) : 0; |
431 | |
438 | |
432 | #define VAR(name,type)c->name = PL_ ## name; |
439 | #define VAR(name,type)c->name = PL_ ## name; |
433 | # include "state.h" |
440 | # include "state.h" |
434 | #undef VAR |
441 | #undef VAR |
… | |
… | |
860 | struct coro temp; |
867 | struct coro temp; |
861 | |
868 | |
862 | assert (!(coro->flags & CF_RUNNING)); |
869 | assert (!(coro->flags & CF_RUNNING)); |
863 | |
870 | |
864 | Zero (&temp, 1, struct coro); |
871 | Zero (&temp, 1, struct coro); |
865 | temp.save = CORO_SAVE_ALL; |
872 | temp.save = CORO_SAVE_DEF; |
866 | |
873 | |
867 | if (coro->flags & CF_RUNNING) |
874 | if (coro->flags & CF_RUNNING) |
868 | croak ("FATAL: tried to destroy currently running coroutine"); |
875 | croak ("FATAL: tried to destroy currently running coroutine"); |
869 | |
876 | |
870 | save_perl (aTHX_ &temp); |
877 | save_perl (aTHX_ &temp); |
… | |
… | |
1163 | |
1170 | |
1164 | newCONSTSUB (coro_state_stash, "SAVE_DEFAV", newSViv (CORO_SAVE_DEFAV)); |
1171 | newCONSTSUB (coro_state_stash, "SAVE_DEFAV", newSViv (CORO_SAVE_DEFAV)); |
1165 | newCONSTSUB (coro_state_stash, "SAVE_DEFSV", newSViv (CORO_SAVE_DEFSV)); |
1172 | newCONSTSUB (coro_state_stash, "SAVE_DEFSV", newSViv (CORO_SAVE_DEFSV)); |
1166 | newCONSTSUB (coro_state_stash, "SAVE_ERRSV", newSViv (CORO_SAVE_ERRSV)); |
1173 | newCONSTSUB (coro_state_stash, "SAVE_ERRSV", newSViv (CORO_SAVE_ERRSV)); |
1167 | newCONSTSUB (coro_state_stash, "SAVE_IRSSV", newSViv (CORO_SAVE_IRSSV)); |
1174 | newCONSTSUB (coro_state_stash, "SAVE_IRSSV", newSViv (CORO_SAVE_IRSSV)); |
|
|
1175 | newCONSTSUB (coro_state_stash, "SAVE_DEFFH", newSViv (CORO_SAVE_DEFFH)); |
|
|
1176 | newCONSTSUB (coro_state_stash, "SAVE_DEF", newSViv (CORO_SAVE_DEF)); |
1168 | newCONSTSUB (coro_state_stash, "SAVE_ALL", newSViv (CORO_SAVE_ALL)); |
1177 | newCONSTSUB (coro_state_stash, "SAVE_ALL", newSViv (CORO_SAVE_ALL)); |
1169 | |
1178 | |
1170 | main_mainstack = PL_mainstack; |
1179 | main_mainstack = PL_mainstack; |
1171 | |
1180 | |
1172 | coroapi.ver = CORO_API_VERSION; |
1181 | coroapi.ver = CORO_API_VERSION; |
… | |
… | |
1183 | HV *hv; |
1192 | HV *hv; |
1184 | int i; |
1193 | int i; |
1185 | |
1194 | |
1186 | Newz (0, coro, 1, struct coro); |
1195 | Newz (0, coro, 1, struct coro); |
1187 | coro->args = newAV (); |
1196 | coro->args = newAV (); |
1188 | coro->save = CORO_SAVE_ALL; |
1197 | coro->save = CORO_SAVE_DEF; |
1189 | coro->flags = CF_NEW; |
1198 | coro->flags = CF_NEW; |
1190 | |
1199 | |
1191 | hv = newHV (); |
1200 | hv = newHV (); |
1192 | sv_magicext ((SV *)hv, 0, PERL_MAGIC_ext, &coro_state_vtbl, (char *)coro, 0)->mg_flags |= MGf_DUP; |
1201 | sv_magicext ((SV *)hv, 0, PERL_MAGIC_ext, &coro_state_vtbl, (char *)coro, 0)->mg_flags |= MGf_DUP; |
1193 | RETVAL = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); |
1202 | RETVAL = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); |
… | |
… | |
1200 | |
1209 | |
1201 | int |
1210 | int |
1202 | save (SV *coro, int new_save = -1) |
1211 | save (SV *coro, int new_save = -1) |
1203 | CODE: |
1212 | CODE: |
1204 | RETVAL = api_save (coro, new_save); |
1213 | RETVAL = api_save (coro, new_save); |
|
|
1214 | OUTPUT: |
|
|
1215 | RETVAL |
|
|
1216 | |
|
|
1217 | int |
|
|
1218 | save_also (SV *coro_sv, int save_also) |
|
|
1219 | CODE: |
|
|
1220 | { |
|
|
1221 | struct coro *coro = SvSTATE (coro_sv); |
|
|
1222 | RETVAL = coro->save; |
|
|
1223 | coro->save |= save_also; |
|
|
1224 | } |
1205 | OUTPUT: |
1225 | OUTPUT: |
1206 | RETVAL |
1226 | RETVAL |
1207 | |
1227 | |
1208 | void |
1228 | void |
1209 | _set_stacklevel (...) |
1229 | _set_stacklevel (...) |