From: Vincent Pit Date: Wed, 30 Sep 2009 22:22:50 +0000 (+0200) Subject: Only look up to the first require scope for the require propagation workaround X-Git-Tag: v0.09~14 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FLexical-Types.git;a=commitdiff_plain;h=b4e0a25b8c7e0703aeb75dc53b344a7d898832bf Only look up to the first require scope for the require propagation workaround --- diff --git a/Types.xs b/Types.xs index 3865214..3245949 100644 --- a/Types.xs +++ b/Types.xs @@ -91,7 +91,7 @@ typedef struct { SV *code; - UV requires; + IV cxreq; } lt_hint_t; #define LT_HINT_STRUCT 1 @@ -185,11 +185,11 @@ STATIC void lt_ptable_hints_clone(pTHX_ ptable_ent *ent, void *ud_) { #if LT_HINT_STRUCT - h2 = PerlMemShared_malloc(sizeof *h2); - h2->code = lt_clone(h1->code, ud->owner); + h2 = PerlMemShared_malloc(sizeof *h2); + h2->code = lt_clone(h1->code, ud->owner); SvREFCNT_inc(h2->code); #if LT_WORKAROUND_REQUIRE_PROPAGATION - h2->requires = h1->requires; + h2->cxreq = h1->cxreq; #endif #else /* LT_HINT_STRUCT */ @@ -223,6 +223,26 @@ STATIC void lt_thread_cleanup(pTHX_ void *ud) { /* ... Hint tags ........................................................... */ +#if LT_WORKAROUND_REQUIRE_PROPAGATION +STATIC IV lt_require_tag(pTHX) { +#define lt_require_tag() lt_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 /* LT_WORKAROUND_REQUIRE_PROPAGATION */ + STATIC SV *lt_tag(pTHX_ SV *value) { #define lt_tag(V) lt_tag(aTHX_ (V)) lt_hint_t *h; @@ -239,28 +259,10 @@ STATIC SV *lt_tag(pTHX_ SV *value) { #if LT_HINT_STRUCT h = PerlMemShared_malloc(sizeof *h); - h->code = code; - -#if LT_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 /* LT_WORKAROUND_REQUIRE_PROPAGATION */ - + h->code = code; +# if LT_WORKAROUND_REQUIRE_PROPAGATION + h->cxreq = lt_require_tag(); +# endif /* LT_WORKAROUND_REQUIRE_PROPAGATION */ #else /* LT_HINT_STRUCT */ h = code; #endif /* !LT_HINT_STRUCT */ @@ -287,24 +289,9 @@ STATIC SV *lt_detag(pTHX_ const SV *hint) { #if LT_THREADSAFE h = ptable_fetch(MY_CXT.tbl, h); #endif /* LT_THREADSAFE */ - #if LT_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 (lt_require_tag() != h->cxreq) + return NULL; #endif /* LT_WORKAROUND_REQUIRE_PROPAGATION */ return LT_HINT_CODE(h);