1 | #define PERL_NO_GET_CONTEXT |
1 | #define PERL_NO_GET_CONTEXT |
2 | |
2 | |
3 | #include "EXTERN.h" |
3 | #include "EXTERN.h" |
4 | #include "perl.h" |
4 | #include "perl.h" |
5 | #include "XSUB.h" |
5 | #include "XSUB.h" |
|
|
6 | |
|
|
7 | static HV *guard_stash; |
6 | |
8 | |
7 | static SV * |
9 | static SV * |
8 | guard_get_cv (pTHX_ SV *cb_sv) |
10 | guard_get_cv (pTHX_ SV *cb_sv) |
9 | { |
11 | { |
10 | HV *st; |
12 | HV *st; |
… | |
… | |
63 | guard_free |
65 | guard_free |
64 | }; |
66 | }; |
65 | |
67 | |
66 | MODULE = Guard PACKAGE = Guard |
68 | MODULE = Guard PACKAGE = Guard |
67 | |
69 | |
|
|
70 | BOOT: |
|
|
71 | guard_stash = gv_stashpv ("Guard", 1); |
|
|
72 | |
|
|
73 | void |
|
|
74 | CLONE (...) |
|
|
75 | PROTOTYPE: @ |
|
|
76 | CODE: |
|
|
77 | guard_stash = gv_stashpv ("Guard", 1); |
|
|
78 | |
68 | void |
79 | void |
69 | scope_guard (SV *block) |
80 | scope_guard (SV *block) |
70 | PROTOTYPE: & |
81 | PROTOTYPE: & |
71 | CODE: |
82 | CODE: |
72 | LEAVE; /* unfortunately, perl sandwiches XS calls into ENTER/LEAVE */ |
83 | LEAVE; /* unfortunately, perl sandwiches XS calls into ENTER/LEAVE */ |
… | |
… | |
81 | SV *cv = guard_get_cv (aTHX_ block); |
92 | SV *cv = guard_get_cv (aTHX_ block); |
82 | SV *guard = NEWSV (0, 0); |
93 | SV *guard = NEWSV (0, 0); |
83 | SvUPGRADE (guard, SVt_PVMG); |
94 | SvUPGRADE (guard, SVt_PVMG); |
84 | sv_magicext (guard, cv, PERL_MAGIC_ext, &guard_vtbl, 0, 0); |
95 | sv_magicext (guard, cv, PERL_MAGIC_ext, &guard_vtbl, 0, 0); |
85 | RETVAL = newRV_noinc (guard); |
96 | RETVAL = newRV_noinc (guard); |
|
|
97 | SvOBJECT_on (guard); |
|
|
98 | ++PL_sv_objcount; |
|
|
99 | SvSTASH_set (guard, (HV*)SvREFCNT_inc ((SV *)guard_stash)); |
86 | } |
100 | } |
87 | OUTPUT: |
101 | OUTPUT: |
88 | RETVAL |
102 | RETVAL |
89 | |
103 | |
90 | void |
104 | void |