- ptable *tbl;
-#if LT_HAS_PERL(5, 13, 2)
- CLONE_PARAMS *params;
-#else
- CLONE_PARAMS params;
-#endif
-} lt_ptable_clone_ud;
-
-#if LT_HAS_PERL(5, 13, 2)
-# define lt_ptable_clone_ud_init(U, T, O) \
- (U).tbl = (T); \
- (U).params = Perl_clone_params_new((O), aTHX)
-# define lt_ptable_clone_ud_deinit(U) Perl_clone_params_del((U).params)
-# define lt_dup_inc(S, U) SvREFCNT_inc(sv_dup((S), (U)->params))
-#else
-# define lt_ptable_clone_ud_init(U, T, O) \
- (U).tbl = (T); \
- (U).params.stashes = newAV(); \
- (U).params.flags = 0; \
- (U).params.proto_perl = (O)
-# define lt_ptable_clone_ud_deinit(U) SvREFCNT_dec((U).params.stashes)
-# define lt_dup_inc(S, U) SvREFCNT_inc(sv_dup((S), &((U)->params)))
-#endif
-
-STATIC void lt_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) {
- lt_ptable_clone_ud *ud = ud_;
- lt_hint_t *h1 = ent->val;
- lt_hint_t *h2;
-
-#if LT_HINT_STRUCT
-
- h2 = PerlMemShared_malloc(sizeof *h2);
- h2->code = lt_dup_inc(h1->code, ud);
-#if LT_WORKAROUND_REQUIRE_PROPAGATION
- h2->require_tag = PTR2IV(lt_dup_inc(INT2PTR(SV *, h1->require_tag), ud));
-#endif
-
-#else /* LT_HINT_STRUCT */
-
- h2 = lt_dup_inc(h1, ud);
-
-#endif /* !LT_HINT_STRUCT */
-
- ptable_hints_store(ud->tbl, ent->key, h2);
-}
-
-#include "reap.h"
-
-STATIC void lt_thread_cleanup(pTHX_ void *ud) {
- dMY_CXT;
-
- ptable_hints_free(MY_CXT.tbl);
- ptable_seen_free(MY_CXT.seen);
-}
-
-#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 CV *cv, *outside;
-
- cv = PL_compcv;
-
- if (!cv) {
- /* If for some reason the pragma is operational at run-time, try to discover
- * the current cv in use. */
- 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;
-
- switch (CxTYPE(cx)) {
- case CXt_SUB:
- case CXt_FORMAT:
- /* The propagation workaround is only needed up to 5.10.0 and at that
- * time format and sub contexts were still identical. And even later the
- * cv members offsets should have been kept the same. */
- cv = cx->blk_sub.cv;
- goto get_enclosing_cv;
- case CXt_EVAL:
- cv = cx->blk_eval.cv;
- goto get_enclosing_cv;
- default:
- break;
- }
- }
- }
-
- cv = PL_main_cv;
- }