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

Comparing Coro/Coro/State.xs (file contents):
Revision 1.400 by root, Thu May 12 23:55:39 2011 UTC vs.
Revision 1.402 by root, Sun May 22 13:07:23 2011 UTC

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 */
975static int 975static int
976coro_sigelem_get (pTHX_ SV *sv, MAGIC *mg) 976coro_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
1737static int 1737static int
1738coro_state_free (pTHX_ SV *sv, MAGIC *mg) 1738coro_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
2058static void 2058static void
2059coro_push_on_destroy (aTHX_ struct coro *coro, SV *cb) 2059coro_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}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines