X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=indirect.xs;h=83f778f50805435f46557ad8771592b51737426f;hp=53cff20b16bddf792a5d0245cd10e7ab317fb807;hb=7ed38ce11d850431de3e4bb48da2452d282bf961;hpb=d237f88f7fb8be8d6836157872d5bf2b9ba02beb diff --git a/indirect.xs b/indirect.xs index 53cff20..83f778f 100644 --- a/indirect.xs +++ b/indirect.xs @@ -61,6 +61,20 @@ #define I_HAS_PERL(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION >= (S)))))) +#undef ENTERn +#if defined(ENTER_with_name) && !I_HAS_PERL(5, 11, 4) +# define ENTERn(N) ENTER_with_name(N) +#else +# define ENTERn(N) ENTER +#endif + +#undef LEAVEn +#if defined(LEAVE_with_name) && !I_HAS_PERL(5, 11, 4) +# define LEAVEn(N) LEAVE_with_name(N) +#else +# define LEAVEn(N) LEAVE +#endif + #if I_HAS_PERL(5, 10, 0) || defined(PL_parser) # ifndef PL_lex_inwhat # define PL_lex_inwhat PL_parser->lex_inwhat @@ -95,6 +109,11 @@ /* ... Thread safety and multiplicity ...................................... */ +/* Safe unless stated otherwise in Makefile.PL */ +#ifndef I_FORKSAFE +# define I_FORKSAFE 1 +#endif + #ifndef I_MULTIPLICITY # if defined(MULTIPLICITY) || defined(PERL_IMPLICIT_CONTEXT) # define I_MULTIPLICITY 1 @@ -136,8 +155,8 @@ #if I_WORKAROUND_REQUIRE_PROPAGATION typedef struct { - SV *code; - I32 requires; + SV *code; + IV cxreq; } indirect_hint_t; #define I_HINT_STRUCT 1 @@ -251,11 +270,11 @@ STATIC void indirect_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) { #if I_HINT_STRUCT - h2 = PerlMemShared_malloc(sizeof *h2); - h2->code = indirect_clone(h1->code, ud->owner); + h2 = PerlMemShared_malloc(sizeof *h2); + h2->code = indirect_clone(h1->code, ud->owner); SvREFCNT_inc(h2->code); #if I_WORKAROUND_REQUIRE_PROPAGATION - h2->requires = h1->requires; + h2->cxreq = h1->cxreq; #endif #else /* I_HINT_STRUCT */ @@ -288,6 +307,26 @@ STATIC void indirect_thread_cleanup(pTHX_ void *ud) { #endif /* I_THREADSAFE */ +#if I_WORKAROUND_REQUIRE_PROPAGATION +STATIC IV indirect_require_tag(pTHX) { +#define indirect_require_tag() indirect_require_tag(aTHX) + const PERL_SI *si; + + for (si = PL_curstackinfo; si; si = si->si_prev) { + I32 cxix; + + for (cxix = si->si_cxix; cxix >= 0; --cxix) { + const PERL_CONTEXT *cx = si->si_cxstack + cxix; + + if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_REQUIRE) + return PTR2IV(cx); + } + } + + return PTR2IV(NULL); +} +#endif /* I_WORKAROUND_REQUIRE_PROPAGATION */ + STATIC SV *indirect_tag(pTHX_ SV *value) { #define indirect_tag(V) indirect_tag(aTHX_ (V)) indirect_hint_t *h; @@ -304,28 +343,10 @@ STATIC SV *indirect_tag(pTHX_ SV *value) { #if I_HINT_STRUCT h = PerlMemShared_malloc(sizeof *h); - h->code = code; - -#if I_WORKAROUND_REQUIRE_PROPAGATION - { - const PERL_SI *si; - I32 requires = 0; - - for (si = PL_curstackinfo; si; si = si->si_prev) { - I32 cxix; - - for (cxix = si->si_cxix; cxix >= 0; --cxix) { - const PERL_CONTEXT *cx = si->si_cxstack + cxix; - - if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_REQUIRE) - ++requires; - } - } - - h->requires = requires; - } -#endif /* I_WORKAROUND_REQUIRE_PROPAGATION */ - + h->code = code; +# if I_WORKAROUND_REQUIRE_PROPAGATION + h->cxreq = indirect_require_tag(); +# endif /* I_WORKAROUND_REQUIRE_PROPAGATION */ #else /* I_HINT_STRUCT */ h = code; #endif /* !I_HINT_STRUCT */ @@ -354,22 +375,8 @@ STATIC SV *indirect_detag(pTHX_ const SV *hint) { #endif /* I_THREADSAFE */ #if I_WORKAROUND_REQUIRE_PROPAGATION - { - const PERL_SI *si; - I32 requires = 0; - - for (si = PL_curstackinfo; si; si = si->si_prev) { - I32 cxix; - - for (cxix = si->si_cxix; cxix >= 0; --cxix) { - const PERL_CONTEXT *cx = si->si_cxstack + cxix; - - if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_REQUIRE - && ++requires > h->requires) - return NULL; - } - } - } + if (indirect_require_tag() != h->cxreq) + return NULL; #endif /* I_WORKAROUND_REQUIRE_PROPAGATION */ return I_HINT_CODE(h); @@ -768,7 +775,6 @@ done: STATIC U32 indirect_initialized = 0; STATIC void indirect_teardown(pTHX_ void *root) { -#define indirect_teardown() indirect_teardown(aTHX) dMY_CXT; if (!indirect_initialized) @@ -858,6 +864,7 @@ BOOT: stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, 1); newCONSTSUB(stash, "I_THREADSAFE", newSVuv(I_THREADSAFE)); + newCONSTSUB(stash, "I_FORKSAFE", newSVuv(I_FORKSAFE)); } indirect_setup(); @@ -889,9 +896,9 @@ CODE: { level = PerlMemShared_malloc(sizeof *level); *level = 1; - LEAVE; + LEAVEn("sub"); SAVEDESTRUCTOR_X(indirect_thread_cleanup, level); - ENTER; + ENTERn("sub"); } #endif