-#endif /* !LT_HINT_STRUCT */
-
- ptable_hints_store(ud->tbl, ent->key, h2);
-}
-
-STATIC void lt_thread_cleanup(pTHX_ void *);
-
-STATIC void lt_thread_cleanup(pTHX_ void *ud) {
- int *level = ud;
-
- if (*level) {
- *level = 0;
- LEAVE;
- SAVEDESTRUCTOR_X(lt_thread_cleanup, level);
- ENTER;
- } else {
- dMY_CXT;
- PerlMemShared_free(level);
- ptable_hints_free(MY_CXT.tbl);
- }
-}
-
-#endif /* LT_THREADSAFE */
-
-/* ... 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;
- SV *code = NULL;
- dMY_CXT;
-
- if (SvROK(value)) {
- value = SvRV(value);
- if (SvTYPE(value) >= SVt_PVCV) {
- code = value;
- SvREFCNT_inc_simple_NN(code);
- }
- }
-
-#if LT_HINT_STRUCT
- h = PerlMemShared_malloc(sizeof *h);
- 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 */
-
-#if LT_THREADSAFE
- /* We only need for the key to be an unique tag for looking up the value later.
- * Allocated memory provides convenient unique identifiers, so that's why we
- * use the hint as the key itself. */
- ptable_hints_store(MY_CXT.tbl, h, h);
-#endif /* LT_THREADSAFE */
-
- return newSViv(PTR2IV(h));
-}
-
-STATIC SV *lt_detag(pTHX_ const SV *hint) {
-#define lt_detag(H) lt_detag(aTHX_ (H))
- lt_hint_t *h;
- dMY_CXT;
-
- if (!(hint && SvIOK(hint)))
- return NULL;
-
- h = INT2PTR(lt_hint_t *, SvIVX(hint));
-#if LT_THREADSAFE
- h = ptable_fetch(MY_CXT.tbl, h);
-#endif /* LT_THREADSAFE */
-#if LT_WORKAROUND_REQUIRE_PROPAGATION
- if (lt_require_tag() != h->cxreq)
- return NULL;
-#endif /* LT_WORKAROUND_REQUIRE_PROPAGATION */
-
- return LT_HINT_CODE(h);
-}