… | |
… | |
496 | MAGIC *mg; |
496 | MAGIC *mg; |
497 | |
497 | |
498 | if (SvROK (coro)) |
498 | if (SvROK (coro)) |
499 | coro = SvRV (coro); |
499 | coro = SvRV (coro); |
500 | |
500 | |
501 | mg = SvSTATEhv_p (coro); |
501 | mg = SvSTATEhv_p (aTHX_ coro); |
502 | if (!mg) |
502 | if (!mg) |
503 | croak ("Coro::State object required"); |
503 | croak ("Coro::State object required"); |
504 | |
504 | |
505 | return (struct coro *)mg->mg_ptr; |
505 | return (struct coro *)mg->mg_ptr; |
506 | } |
506 | } |
… | |
… | |
967 | #endif |
967 | #endif |
968 | |
968 | |
969 | /* |
969 | /* |
970 | * This overrides the default magic get method of %SIG elements. |
970 | * This overrides the default magic get method of %SIG elements. |
971 | * The original one doesn't provide for reading back of PL_diehook/PL_warnhook |
971 | * The original one doesn't provide for reading back of PL_diehook/PL_warnhook |
972 | * and instead of trying to save and restore the hash elements, we just provide |
972 | * and instead of trying to save and restore the hash elements (extremely slow), |
973 | * readback here. |
973 | * we just provide our own readback here. |
974 | */ |
974 | */ |
975 | static int |
975 | static int |
976 | coro_sigelem_get (pTHX_ SV *sv, MAGIC *mg) |
976 | coro_sigelem_get (pTHX_ SV *sv, MAGIC *mg) |
977 | { |
977 | { |
978 | const char *s = MgPV_nolen_const (mg); |
978 | const char *s = MgPV_nolen_const (mg); |
… | |
… | |
1086 | PL_parser = 0; |
1086 | PL_parser = 0; |
1087 | #endif |
1087 | #endif |
1088 | PL_hints = 0; |
1088 | PL_hints = 0; |
1089 | |
1089 | |
1090 | /* recreate the die/warn hooks */ |
1090 | /* recreate the die/warn hooks */ |
1091 | PL_diehook = 0; SvSetMagicSV (*hv_fetch (hv_sig, "__DIE__" , sizeof ("__DIE__" ) - 1, 1), rv_diehook ); |
1091 | PL_diehook = SvREFCNT_inc (rv_diehook); |
1092 | PL_warnhook = 0; SvSetMagicSV (*hv_fetch (hv_sig, "__WARN__", sizeof ("__WARN__") - 1, 1), rv_warnhook); |
1092 | PL_warnhook = SvREFCNT_inc (rv_warnhook); |
1093 | |
1093 | |
1094 | GvSV (PL_defgv) = newSV (0); |
1094 | GvSV (PL_defgv) = newSV (0); |
1095 | GvAV (PL_defgv) = coro->args; coro->args = 0; |
1095 | GvAV (PL_defgv) = coro->args; coro->args = 0; |
1096 | GvSV (PL_errgv) = newSV (0); |
1096 | GvSV (PL_errgv) = newSV (0); |
1097 | GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0); |
1097 | GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0); |
… | |
… | |
1727 | SvREFCNT_dec (coro->startcv); |
1727 | SvREFCNT_dec (coro->startcv); |
1728 | SvREFCNT_dec (coro->args); |
1728 | SvREFCNT_dec (coro->args); |
1729 | SvREFCNT_dec (coro->swap_sv); |
1729 | SvREFCNT_dec (coro->swap_sv); |
1730 | SvREFCNT_dec (CORO_THROW); |
1730 | SvREFCNT_dec (CORO_THROW); |
1731 | |
1731 | |
1732 | coro_call_on_destroy (coro); |
1732 | coro_call_on_destroy (aTHX_ coro); |
1733 | |
1733 | |
1734 | /* more destruction mayhem in coro_state_free */ |
1734 | /* more destruction mayhem in coro_state_free */ |
1735 | } |
1735 | } |
1736 | |
1736 | |
1737 | static int |
1737 | static int |
1738 | coro_state_free (pTHX_ SV *sv, MAGIC *mg) |
1738 | coro_state_free (pTHX_ SV *sv, MAGIC *mg) |
1739 | { |
1739 | { |
1740 | struct coro *coro = (struct coro *)mg->mg_ptr; |
1740 | struct coro *coro = (struct coro *)mg->mg_ptr; |
1741 | mg->mg_ptr = 0; |
1741 | mg->mg_ptr = 0; |
1742 | |
1742 | |
1743 | coro_state_destroy (coro); |
1743 | coro_state_destroy (aTHX_ coro); |
1744 | SvREFCNT_dec (coro->on_destroy); |
1744 | SvREFCNT_dec (coro->on_destroy); |
1745 | SvREFCNT_dec (coro->status); |
1745 | SvREFCNT_dec (coro->status); |
1746 | |
1746 | |
1747 | Safefree (coro); |
1747 | Safefree (coro); |
1748 | |
1748 | |
… | |
… | |
2054 | PUTBACK; |
2054 | PUTBACK; |
2055 | } |
2055 | } |
2056 | } |
2056 | } |
2057 | |
2057 | |
2058 | static void |
2058 | static void |
2059 | coro_push_on_destroy (aTHX_ struct coro *coro, SV *cb) |
2059 | coro_push_on_destroy (pTHX_ struct coro *coro, SV *cb) |
2060 | { |
2060 | { |
2061 | if (!coro->on_destroy) |
2061 | if (!coro->on_destroy) |
2062 | coro->on_destroy = newAV (); |
2062 | coro->on_destroy = newAV (); |
2063 | |
2063 | |
2064 | av_push (coro->on_destroy, cb); |
2064 | av_push (coro->on_destroy, cb); |
… | |
… | |
2078 | if (!coro->status) |
2078 | if (!coro->status) |
2079 | return 1; |
2079 | return 1; |
2080 | |
2080 | |
2081 | frame->destroy = 0; |
2081 | frame->destroy = 0; |
2082 | |
2082 | |
2083 | coro_push_av (coro->status, GIMME_V); |
2083 | coro_push_av (aTHX_ coro->status, GIMME_V); |
2084 | |
2084 | |
2085 | SvREFCNT_dec ((SV *)coro->hv); |
2085 | SvREFCNT_dec ((SV *)coro->hv); |
2086 | |
2086 | |
2087 | return 0; |
2087 | return 0; |
2088 | } |
2088 | } |