X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=indirect.xs;h=db563796e6ce7681e03aabfafd9bd516c66c4cdd;hp=de41fa61802e60fff95101fd70cea563d3328313;hb=refs%2Ftags%2Frt99083;hpb=3ce3f8f7be47150f9d727ef67cb8bb7be039e68d diff --git a/indirect.xs b/indirect.xs index de41fa6..db56379 100644 --- a/indirect.xs +++ b/indirect.xs @@ -323,8 +323,6 @@ STATIC void indirect_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) { ptable_hints_store(ud->tbl, ent->key, h2); } -#include "reap.h" - STATIC void indirect_thread_cleanup(pTHX_ void *ud) { dMY_CXT; @@ -333,6 +331,29 @@ STATIC void indirect_thread_cleanup(pTHX_ void *ud) { ptable_hints_free(MY_CXT.tbl); } +STATIC int indirect_endav_free(pTHX_ SV *sv, MAGIC *mg) { + SAVEDESTRUCTOR_X(indirect_thread_cleanup, NULL); + + return 0; +} + +STATIC MGVTBL indirect_endav_vtbl = { + 0, + 0, + 0, + 0, + indirect_endav_free +#if MGf_COPY + , 0 +#endif +#if MGf_DUP + , 0 +#endif +#if MGf_LOCAL + , 0 +#endif +}; + #endif /* I_THREADSAFE */ #if I_WORKAROUND_REQUIRE_PROPAGATION @@ -587,7 +608,8 @@ STATIC OP *indirect_ck_const(pTHX_ OP *o) { * when we already had a match because __PACKAGE__ can only appear in * direct method calls ("new __PACKAGE__" is a syntax error). */ len = SvCUR(sv); - if (len == (STRLEN) HvNAMELEN_get(PL_curstash) + if (PL_curstash + && len == (STRLEN) HvNAMELEN_get(PL_curstash) && memcmp(SvPVX(sv), HvNAME_get(PL_curstash), len) == 0) { STRLEN pos_pkg; SV *pkg = sv_newmortal(); @@ -994,6 +1016,7 @@ PROTOTYPE: DISABLE PREINIT: ptable *t; SV *global_code_dup; + GV *gv; PPCODE: { my_cxt_t ud; @@ -1010,7 +1033,23 @@ PPCODE: MY_CXT.owner = aTHX; MY_CXT.global_code = global_code_dup; } - reap(3, indirect_thread_cleanup, NULL); + gv = gv_fetchpv(__PACKAGE__ "::_THREAD_CLEANUP", 0, SVt_PVCV); + if (gv) { + CV *cv = GvCV(gv); + if (!PL_endav) + PL_endav = newAV(); + SvREFCNT_inc(cv); + if (!av_store(PL_endav, av_len(PL_endav) + 1, (SV *) cv)) + SvREFCNT_dec(cv); + sv_magicext((SV *) PL_endav, NULL, PERL_MAGIC_ext, &indirect_endav_vtbl, NULL, 0); + } + XSRETURN(0); + +void +_THREAD_CLEANUP(...) +PROTOTYPE: DISABLE +PPCODE: + indirect_thread_cleanup(aTHX_ NULL); XSRETURN(0); #endif