summaryrefslogtreecommitdiffstats
path: root/src/if_perl.xs
diff options
context:
space:
mode:
Diffstat (limited to 'src/if_perl.xs')
-rw-r--r--src/if_perl.xs18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/if_perl.xs b/src/if_perl.xs
index 57dbe46995..4dc80beaa5 100644
--- a/src/if_perl.xs
+++ b/src/if_perl.xs
@@ -76,6 +76,12 @@
# define EXTERN_C
#endif
+#if (PERL_REVISION == 5) && (PERL_VERSION >= 14) && defined(_MSC_VER)
+/* Using PL_errgv to get the error message after perl_eval_sv() causes a crash
+ * with MSVC and Perl version 5.14. */
+# define AVOID_PL_ERRGV
+#endif
+
/* Compatibility hacks over */
static PerlInterpreter *perl_interp = NULL;
@@ -796,7 +802,11 @@ ex_perl(eap)
SvREFCNT_dec(sv);
+#ifdef AVOID_PL_ERRGV
+ err = SvPV(perl_get_sv("@", GV_ADD), length);
+#else
err = SvPV(GvSV(PL_errgv), length);
+#endif
FREETMPS;
LEAVE;
@@ -866,7 +876,11 @@ ex_perldo(eap)
sv_catpvn(sv, "}", 1);
perl_eval_sv(sv, G_DISCARD | G_NOARGS);
SvREFCNT_dec(sv);
+#ifdef AVOID_PL_ERRGV
+ str = SvPV(perl_get_sv("@", GV_ADD), length);
+#else
str = SvPV(GvSV(PL_errgv), length);
+#endif
if (length)
goto err;
@@ -880,7 +894,11 @@ ex_perldo(eap)
sv_setpv(GvSV(PL_defgv), (char *)ml_get(i));
PUSHMARK(sp);
perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL);
+#ifdef AVOID_PL_ERRGV
+ str = SvPV(perl_get_sv("@", GV_ADD), length);
+#else
str = SvPV(GvSV(PL_errgv), length);
+#endif
if (length)
break;
SPAGAIN;