… | |
… | |
22 | static void |
22 | static void |
23 | exec_guard_cb (pTHX_ SV *cb) |
23 | exec_guard_cb (pTHX_ SV *cb) |
24 | { |
24 | { |
25 | dSP; |
25 | dSP; |
26 | SV *saveerr = SvOK (ERRSV) ? sv_mortalcopy (ERRSV) : 0; |
26 | SV *saveerr = SvOK (ERRSV) ? sv_mortalcopy (ERRSV) : 0; |
|
|
27 | SV *savedie = PL_diehook; |
|
|
28 | |
|
|
29 | PL_diehook = 0; |
27 | |
30 | |
28 | PUSHSTACKi (PERLSI_DESTROY); |
31 | PUSHSTACKi (PERLSI_DESTROY); |
29 | |
32 | |
30 | PUSHMARK (SP); |
33 | PUSHMARK (SP); |
31 | PUTBACK; |
34 | PUTBACK; |
… | |
… | |
37 | PUSHMARK (SP); |
40 | PUSHMARK (SP); |
38 | PUTBACK; |
41 | PUTBACK; |
39 | call_sv (get_sv ("Guard::DIED", 1), G_VOID | G_DISCARD | G_EVAL | G_KEEPERR); |
42 | call_sv (get_sv ("Guard::DIED", 1), G_VOID | G_DISCARD | G_EVAL | G_KEEPERR); |
40 | SPAGAIN; |
43 | SPAGAIN; |
41 | |
44 | |
42 | sv_setsv (ERRSV, &PL_sv_undef); |
45 | sv_setpvn (ERRSV, "", 0); |
43 | } |
46 | } |
44 | |
47 | |
45 | if (saveerr) |
48 | if (saveerr) |
46 | sv_setsv (ERRSV, saveerr); |
49 | sv_setsv (ERRSV, saveerr); |
47 | |
50 | |
|
|
51 | { |
|
|
52 | SV *oldhook = PL_diehook; |
|
|
53 | PL_diehook = savedie; |
|
|
54 | SvREFCNT_dec (oldhook); |
|
|
55 | } |
|
|
56 | |
48 | POPSTACK; |
57 | POPSTACK; |
|
|
58 | PUTBACK; |
49 | } |
59 | } |
50 | |
60 | |
51 | static void |
61 | static void |
52 | scope_guard_cb (pTHX_ void *cv) |
62 | scope_guard_cb (pTHX_ void *cv) |
53 | { |
63 | { |