… | |
… | |
56 | |
56 | |
57 | /* optionally saved, might be zero */ |
57 | /* optionally saved, might be zero */ |
58 | AV *defav; |
58 | AV *defav; |
59 | SV *defsv; |
59 | SV *defsv; |
60 | SV *errsv; |
60 | SV *errsv; |
61 | /* TODO: PL_pmop might be nice && effortless to save. */ |
|
|
62 | |
61 | |
63 | /* saved global state not related to stacks */ |
62 | /* saved global state not related to stacks */ |
64 | U8 dowarn; |
63 | U8 dowarn; |
65 | I32 in_eval; |
64 | I32 in_eval; |
66 | |
65 | |
… | |
… | |
88 | I32 savestack_max; |
87 | I32 savestack_max; |
89 | OP **retstack; |
88 | OP **retstack; |
90 | I32 retstack_ix; |
89 | I32 retstack_ix; |
91 | I32 retstack_max; |
90 | I32 retstack_max; |
92 | COP *curcop; |
91 | COP *curcop; |
|
|
92 | PMOP *curpm; |
93 | JMPENV *top_env; |
93 | JMPENV *top_env; |
94 | |
94 | |
95 | /* data associated with this coroutine (initial args) */ |
95 | /* data associated with this coroutine (initial args) */ |
96 | AV *args; |
96 | AV *args; |
97 | }; |
97 | }; |
… | |
… | |
598 | dSP; |
598 | dSP; |
599 | Coro__State ctx = (Coro__State)arg; |
599 | Coro__State ctx = (Coro__State)arg; |
600 | SV *sub_init = (SV*)get_cv(SUB_INIT, FALSE); |
600 | SV *sub_init = (SV*)get_cv(SUB_INIT, FALSE); |
601 | |
601 | |
602 | coro_init_stacks (aTHX); |
602 | coro_init_stacks (aTHX); |
|
|
603 | PL_curpm = 0; /* segfault on first access */ |
603 | /*PL_curcop = 0;*/ |
604 | /*PL_curcop = 0;*/ |
604 | /*PL_in_eval = PL_in_eval;*/ /* inherit */ |
605 | /*PL_in_eval = PL_in_eval;*/ /* inherit */ |
605 | SvREFCNT_dec (GvAV (PL_defgv)); |
606 | SvREFCNT_dec (GvAV (PL_defgv)); |
606 | GvAV (PL_defgv) = ctx->args; |
607 | GvAV (PL_defgv) = ctx->args; |
607 | |
608 | |
… | |
… | |
868 | next = coro_deq (PRIO_MIN); |
869 | next = coro_deq (PRIO_MIN); |
869 | |
870 | |
870 | if (!next) |
871 | if (!next) |
871 | next = SvREFCNT_inc (SvRV (GvSV (coro_idle))); |
872 | next = SvREFCNT_inc (SvRV (GvSV (coro_idle))); |
872 | |
873 | |
|
|
874 | /* free this only after the transfer */ |
873 | coro_mortal = prev; |
875 | coro_mortal = prev; |
874 | SV_CORO (prev, "Coro::schedule"); |
876 | SV_CORO (prev, "Coro::schedule"); |
875 | |
877 | |
876 | SvRV (GvSV (coro_current)) = next; |
878 | SvRV (GvSV (coro_current)) = next; |
877 | |
879 | |
… | |
… | |
900 | coro_state_stash = gv_stashpv ("Coro::State", TRUE); |
902 | coro_state_stash = gv_stashpv ("Coro::State", TRUE); |
901 | |
903 | |
902 | newCONSTSUB (coro_state_stash, "SAVE_DEFAV", newSViv (TRANSFER_SAVE_DEFAV)); |
904 | newCONSTSUB (coro_state_stash, "SAVE_DEFAV", newSViv (TRANSFER_SAVE_DEFAV)); |
903 | newCONSTSUB (coro_state_stash, "SAVE_DEFSV", newSViv (TRANSFER_SAVE_DEFSV)); |
905 | newCONSTSUB (coro_state_stash, "SAVE_DEFSV", newSViv (TRANSFER_SAVE_DEFSV)); |
904 | newCONSTSUB (coro_state_stash, "SAVE_ERRSV", newSViv (TRANSFER_SAVE_ERRSV)); |
906 | newCONSTSUB (coro_state_stash, "SAVE_ERRSV", newSViv (TRANSFER_SAVE_ERRSV)); |
|
|
907 | newCONSTSUB (coro_state_stash, "SAVE_CURPM", newSViv (TRANSFER_SAVE_CURPM)); |
905 | newCONSTSUB (coro_state_stash, "SAVE_CCTXT", newSViv (TRANSFER_SAVE_CCTXT)); |
908 | newCONSTSUB (coro_state_stash, "SAVE_CCTXT", newSViv (TRANSFER_SAVE_CCTXT)); |
906 | |
909 | |
907 | if (!padlist_cache) |
910 | if (!padlist_cache) |
908 | padlist_cache = newHV (); |
911 | padlist_cache = newHV (); |
909 | |
912 | |