--- Guard/Guard.xs 2008/12/13 19:14:58 1.3 +++ Guard/Guard.xs 2009/01/13 23:30:38 1.8 @@ -24,27 +24,36 @@ { dSP; SV *saveerr = SvOK (ERRSV) ? sv_mortalcopy (ERRSV) : 0; + SV *savedie = PL_diehook; + + PL_diehook = 0; PUSHSTACKi (PERLSI_DESTROY); PUSHMARK (SP); PUTBACK; call_sv (cb, G_VOID | G_DISCARD | G_EVAL); - SPAGAIN; if (SvTRUE (ERRSV)) { + SPAGAIN; + PUSHMARK (SP); PUTBACK; call_sv (get_sv ("Guard::DIED", 1), G_VOID | G_DISCARD | G_EVAL | G_KEEPERR); - SPAGAIN; - sv_setsv (ERRSV, &PL_sv_undef); + sv_setpvn (ERRSV, "", 0); } if (saveerr) sv_setsv (ERRSV, saveerr); + { + SV *oldhook = PL_diehook; + PL_diehook = savedie; + SvREFCNT_dec (oldhook); + } + POPSTACK; } @@ -58,6 +67,8 @@ guard_free (pTHX_ SV *cv, MAGIC *mg) { exec_guard_cb (aTHX_ mg->mg_obj); + + return 0; } static MGVTBL guard_vtbl = { @@ -71,12 +82,6 @@ guard_stash = gv_stashpv ("Guard", 1); void -CLONE (...) - PROTOTYPE: @ - CODE: - guard_stash = gv_stashpv ("Guard", 1); - -void scope_guard (SV *block) PROTOTYPE: & CODE: