-STATIC UV indirect_hint(pTHX) {
-#define indirect_hint() indirect_hint(aTHX)
- SV *id = Perl_refcounted_he_fetch(aTHX_ PL_curcop->cop_hints_hash,
- NULL,
- "indirect", 8,
- 0,
- indirect_hash);
- return SvOK(id) ? SvUV(id) : 0;
-}
-
-/* ... op -> source position ............................................... */
-
-STATIC HV *indirect_map = NULL;
-STATIC const char *indirect_linestr = NULL;
-
-STATIC void indirect_map_store(pTHX_ const OP *o, const char *src, SV *sv) {
-#define indirect_map_store(O, S, N) indirect_map_store(aTHX_ (O), (S), (N))
- char buf[32];
- const char *pl_linestr;
- SV *val;
-
- /* When lex_inwhat is set, we're in a quotelike environment (qq, qr, but not q)
- * In this case the linestr has temporarly changed, but the old buffer should
- * still be alive somewhere. */
-
- if (!PL_parser->lex_inwhat) {
- pl_linestr = SvPVX_const(PL_parser->linestr);
- if (indirect_linestr != pl_linestr) {
- hv_clear(indirect_map);
- indirect_linestr = pl_linestr;
+#ifndef mPUSHp
+# define mPUSHp(P, L) PUSHs(sv_2mortal(newSVpvn((P), (L))))
+#endif
+
+#ifndef mPUSHu
+# define mPUSHu(U) PUSHs(sv_2mortal(newSVuv(U)))
+#endif
+
+#ifndef HvNAME_get
+# define HvNAME_get(H) HvNAME(H)
+#endif
+
+#ifndef HvNAMELEN_get
+# define HvNAMELEN_get(H) strlen(HvNAME_get(H))
+#endif
+
+#if XSH_HAS_PERL(5, 10, 0) || defined(PL_parser)
+# ifndef PL_linestr
+# define PL_linestr PL_parser->linestr
+# endif
+# ifndef PL_bufptr
+# define PL_bufptr PL_parser->bufptr
+# endif
+# ifndef PL_oldbufptr
+# define PL_oldbufptr PL_parser->oldbufptr
+# endif
+# ifndef PL_lex_inwhat
+# define PL_lex_inwhat PL_parser->lex_inwhat
+# endif
+# ifndef PL_multi_close
+# define PL_multi_close PL_parser->multi_close
+# endif
+#else
+# ifndef PL_linestr
+# define PL_linestr PL_Ilinestr
+# endif
+# ifndef PL_bufptr
+# define PL_bufptr PL_Ibufptr
+# endif
+# ifndef PL_oldbufptr
+# define PL_oldbufptr PL_Ioldbufptr
+# endif
+# ifndef PL_lex_inwhat
+# define PL_lex_inwhat PL_Ilex_inwhat
+# endif
+# ifndef PL_multi_close
+# define PL_multi_close PL_Imulti_close
+# endif
+#endif
+
+/* ... Safe version of call_sv() ........................................... */
+
+static I32 indirect_call_sv(pTHX_ SV *sv, I32 flags) {
+#define indirect_call_sv(S, F) indirect_call_sv(aTHX_ (S), (F))
+ I32 ret, cxix;
+ PERL_CONTEXT saved_cx;
+ SV *saved_errsv = NULL;
+
+ if (SvTRUE(ERRSV)) {
+ if (IN_PERL_COMPILETIME && PL_errors)
+ sv_catsv(PL_errors, ERRSV);
+ else
+ saved_errsv = newSVsv(ERRSV);
+ SvCUR_set(ERRSV, 0);
+ }
+
+ cxix = (cxstack_ix < cxstack_max) ? (cxstack_ix + 1) : Perl_cxinc(aTHX);
+ /* The last popped context will be reused by call_sv(), but our callers may
+ * still need its previous value. Back it up so that it isn't clobbered. */
+ saved_cx = cxstack[cxix];
+
+ ret = call_sv(sv, flags | G_EVAL);
+
+ cxstack[cxix] = saved_cx;
+
+ if (SvTRUE(ERRSV)) {
+ /* Discard the old ERRSV, and reuse the variable to temporarily store the
+ * new one. */
+ if (saved_errsv)
+ sv_setsv(saved_errsv, ERRSV);
+ else
+ saved_errsv = newSVsv(ERRSV);
+ SvCUR_set(ERRSV, 0);
+ /* Immediately flush all errors. */
+ if (IN_PERL_COMPILETIME) {
+#if XSH_HAS_PERL(5, 10, 0) || defined(PL_parser)
+ if (PL_parser)
+ ++PL_parser->error_count;
+#elif defined(PL_error_count)
+ ++PL_error_count;
+#else
+ ++PL_Ierror_count;
+#endif
+ if (PL_errors) {
+ sv_setsv(ERRSV, PL_errors);
+ SvCUR_set(PL_errors, 0);
+ }