+ val = ptable_fetch(lt_op_padrange_map, o);
+ if (val) {
+ *oi = *val;
+ val = oi;
+ }
+
+ XSH_UNLOCK(<_op_map_mutex);
+
+ return val;
+}
+
+#endif
+
+static void lt_map_delete(pTHX_ const OP *o) {
+#define lt_map_delete(O) lt_map_delete(aTHX_ (O))
+ XSH_LOCK(<_op_map_mutex);
+
+ ptable_map_delete(lt_op_padxv_map, o);
+#if XSH_HAS_PERL(5, 17, 6)
+ ptable_map_delete(lt_op_padrange_map, o);
+#endif
+
+ XSH_UNLOCK(<_op_map_mutex);
+}
+
+/* --- Compatibility wrappers ---------------------------------------------- */
+
+#if XSH_HAS_PERL(5, 10, 0) || defined(PL_parser)
+# ifndef PL_in_my_stash
+# define PL_in_my_stash PL_parser->in_my_stash
+# endif
+#else
+# ifndef PL_in_my_stash
+# define PL_in_my_stash PL_Iin_my_stash
+# endif
+#endif
+
+#ifndef HvNAME_get
+# define HvNAME_get(H) HvNAME(H)
+#endif
+
+#ifndef HvNAMELEN_get
+# define HvNAMELEN_get(H) strlen(HvNAME_get(H))
+#endif
+
+#ifndef SvREFCNT_inc_simple_void_NN
+# define SvREFCNT_inc_simple_void_NN(S) ((void) SvREFCNT_inc(S))
+#endif
+
+/* --- PP functions -------------------------------------------------------- */
+
+/* ... pp_padsv ............................................................ */
+
+static OP *lt_pp_padsv(pTHX) {
+ lt_op_padxv_info oi;
+
+ if (lt_padxv_map_fetch(PL_op, &oi)) {
+ dTARGET;
+ lt_op_padxv_info_call(&oi, TARG);
+ return oi.old_pp(aTHX);
+ }
+
+ return PL_op->op_ppaddr(aTHX);
+}
+
+/* ... pp_padrange (on perl 5.17.6 and above) .............................. */
+
+#if XSH_HAS_PERL(5, 17, 6)
+
+static OP *lt_pp_padrange(pTHX) {
+ lt_op_padrange_info roi;
+
+ if (lt_padrange_map_fetch(PL_op, &roi)) {
+ PADOFFSET i, base, count;
+ const OP *p;
+
+ base = PL_op->op_targ;
+ count = PL_op->op_private & OPpPADRANGE_COUNTMASK;
+
+ for (i = 0, p = roi.padxv_start; i < count && p; ++i, p = p->op_next) {
+ lt_op_padxv_info oi;
+ while (p->op_type == OP_NULL)
+ p = p->op_next;
+ if (p->op_type == OP_PADSV && lt_padxv_map_fetch(p, &oi))
+ lt_op_padxv_info_call(&oi, PAD_SV(base + i));