… | |
… | |
683 | |
683 | |
684 | /** coroutine stack handling ************************************************/ |
684 | /** coroutine stack handling ************************************************/ |
685 | |
685 | |
686 | static int (*orig_sigelem_get) (pTHX_ SV *sv, MAGIC *mg); |
686 | static int (*orig_sigelem_get) (pTHX_ SV *sv, MAGIC *mg); |
687 | static int (*orig_sigelem_set) (pTHX_ SV *sv, MAGIC *mg); |
687 | static int (*orig_sigelem_set) (pTHX_ SV *sv, MAGIC *mg); |
|
|
688 | static int (*orig_sigelem_clr) (pTHX_ SV *sv, MAGIC *mg); |
688 | |
689 | |
689 | /* apparently < 5.8.8 */ |
690 | /* apparently < 5.8.8 */ |
690 | #undef MgPV_nolen_const |
691 | #undef MgPV_nolen_const |
691 | #ifndef MgPV_nolen_const |
692 | #ifndef MgPV_nolen_const |
692 | #define MgPV_nolen_const(mg) (((((int)(mg)->mg_len)) == HEf_SVKEY) ? \ |
693 | #define MgPV_nolen_const(mg) (((((int)(mg)->mg_len)) == HEf_SVKEY) ? \ |
… | |
… | |
708 | { |
709 | { |
709 | const char *s = MgPV_nolen_const (mg); |
710 | const char *s = MgPV_nolen_const (mg); |
710 | |
711 | |
711 | if (*s == '_') |
712 | if (*s == '_') |
712 | { |
713 | { |
713 | if (strEQ (s, "__DIE__" ) && PL_diehook ) return sv_setsv (sv, PL_diehook ), 0; |
714 | SV **svp = 0; |
714 | if (strEQ (s, "__WARN__") && PL_warnhook) return sv_setsv (sv, PL_warnhook), 0; |
715 | |
|
|
716 | if (strEQ (s, "__DIE__" )) svp = &PL_diehook; |
|
|
717 | if (strEQ (s, "__WARN__")) svp = &PL_warnhook; |
|
|
718 | |
|
|
719 | if (svp) |
|
|
720 | { |
|
|
721 | sv_setsv (sv, *svp ? *svp : &PL_sv_undef); |
|
|
722 | return 0; |
|
|
723 | } |
715 | } |
724 | } |
716 | |
725 | |
717 | return orig_sigelem_get ? orig_sigelem_get (aTHX_ sv, mg) : 0; |
726 | return orig_sigelem_get ? orig_sigelem_get (aTHX_ sv, mg) : 0; |
|
|
727 | } |
|
|
728 | |
|
|
729 | static int |
|
|
730 | coro_sigelem_clr (pTHX_ SV *sv, MAGIC *mg) |
|
|
731 | { |
|
|
732 | const char *s = MgPV_nolen_const (mg); |
|
|
733 | |
|
|
734 | if (*s == '_') |
|
|
735 | { |
|
|
736 | SV **svp = 0; |
|
|
737 | |
|
|
738 | if (strEQ (s, "__DIE__" )) svp = &PL_diehook; |
|
|
739 | if (strEQ (s, "__WARN__")) svp = &PL_warnhook; |
|
|
740 | |
|
|
741 | if (svp) |
|
|
742 | { |
|
|
743 | SV *old = *svp; |
|
|
744 | *svp = 0; |
|
|
745 | SvREFCNT_dec (old); |
|
|
746 | return 0; |
|
|
747 | } |
|
|
748 | } |
|
|
749 | |
|
|
750 | return orig_sigelem_clr ? orig_sigelem_clr (aTHX_ sv, mg) : 0; |
718 | } |
751 | } |
719 | |
752 | |
720 | static int |
753 | static int |
721 | coro_sigelem_set (pTHX_ SV *sv, MAGIC *mg) |
754 | coro_sigelem_set (pTHX_ SV *sv, MAGIC *mg) |
722 | { |
755 | { |
… | |
… | |
1605 | BOOT_PAGESIZE; |
1638 | BOOT_PAGESIZE; |
1606 | |
1639 | |
1607 | irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV); |
1640 | irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV); |
1608 | stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO); |
1641 | stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO); |
1609 | |
1642 | |
1610 | orig_sigelem_get = PL_vtbl_sigelem.svt_get; |
1643 | orig_sigelem_get = PL_vtbl_sigelem.svt_get; PL_vtbl_sigelem.svt_get = coro_sigelem_get; |
1611 | PL_vtbl_sigelem.svt_get = coro_sigelem_get; |
1644 | orig_sigelem_set = PL_vtbl_sigelem.svt_set; PL_vtbl_sigelem.svt_set = coro_sigelem_set; |
1612 | orig_sigelem_set = PL_vtbl_sigelem.svt_set; |
1645 | orig_sigelem_clr = PL_vtbl_sigelem.svt_clear; PL_vtbl_sigelem.svt_clear = coro_sigelem_clr; |
1613 | PL_vtbl_sigelem.svt_set = coro_sigelem_set; |
|
|
1614 | |
1646 | |
1615 | hv_sig = coro_get_hv (aTHX_ "SIG", TRUE); |
1647 | hv_sig = coro_get_hv (aTHX_ "SIG", TRUE); |
1616 | rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV)); |
1648 | rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV)); |
1617 | rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV)); |
1649 | rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV)); |
1618 | |
1650 | |