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

Comparing Guard/Guard.xs (file contents):
Revision 1.3 by root, Sat Dec 13 19:14:58 2008 UTC vs.
Revision 1.9 by root, Sat Apr 11 04:42:29 2009 UTC

22static void 22static void
23exec_guard_cb (pTHX_ SV *cb) 23exec_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;
32 call_sv (cb, G_VOID | G_DISCARD | G_EVAL); 35 call_sv (cb, G_VOID | G_DISCARD | G_EVAL);
33 SPAGAIN;
34 36
35 if (SvTRUE (ERRSV)) 37 if (SvTRUE (ERRSV))
36 { 38 {
39 SPAGAIN;
40
37 PUSHMARK (SP); 41 PUSHMARK (SP);
38 PUTBACK; 42 PUTBACK;
39 call_sv (get_sv ("Guard::DIED", 1), G_VOID | G_DISCARD | G_EVAL | G_KEEPERR); 43 call_sv (get_sv ("Guard::DIED", 1), G_VOID | G_DISCARD | G_EVAL | G_KEEPERR);
40 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);
50
51 {
52 SV *oldhook = PL_diehook;
53 PL_diehook = savedie;
54 SvREFCNT_dec (oldhook);
55 }
47 56
48 POPSTACK; 57 POPSTACK;
49} 58}
50 59
51static void 60static void
56 65
57static int 66static int
58guard_free (pTHX_ SV *cv, MAGIC *mg) 67guard_free (pTHX_ SV *cv, MAGIC *mg)
59{ 68{
60 exec_guard_cb (aTHX_ mg->mg_obj); 69 exec_guard_cb (aTHX_ mg->mg_obj);
70
71 return 0;
61} 72}
62 73
63static MGVTBL guard_vtbl = { 74static MGVTBL guard_vtbl = {
64 0, 0, 0, 0, 75 0, 0, 0, 0,
65 guard_free 76 guard_free
67 78
68MODULE = Guard PACKAGE = Guard 79MODULE = Guard PACKAGE = Guard
69 80
70BOOT: 81BOOT:
71 guard_stash = gv_stashpv ("Guard", 1); 82 guard_stash = gv_stashpv ("Guard", 1);
72 83 CvNODEBUG_on (get_cv ("Guard::scope_guard", 0)); /* otherwise calling scope can be the debugger */
73void
74CLONE (...)
75 PROTOTYPE: @
76 CODE:
77 guard_stash = gv_stashpv ("Guard", 1);
78 84
79void 85void
80scope_guard (SV *block) 86scope_guard (SV *block)
81 PROTOTYPE: & 87 PROTOTYPE: &
82 CODE: 88 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines