--- pari-2.5.0/src/headers/paricom.h-pre 2011-05-30 02:28:34.000000000 -0700
+++ pari-2.5.0/src/headers/paricom.h 2018-09-16 00:04:16.527215600 -0700
@@ -73,6 +73,10 @@ extern void (*cb_pari_sigint)(void);
extern int (*cb_pari_handle_exception)(long);
extern void (*cb_pari_err_recover)(long);
+#define CB_EXCEPTION_FLAGS 1
+extern int cb_exception_resets_avma;
+extern int cb_exception_flushes_err;
+
enum manage_var_t {
manage_var_create,
manage_var_delete,
--- pari-2.5.5/src/language/eval.c.orig 2013-06-24 16:06:58.000000000 -0700
+++ pari-2.5.5/src/language/eval.c 2019-02-27 04:19:10.374415800 -0800
@@ -1323,7 +1323,8 @@ evalstate_reset(void)
reset_break();
compilestate_reset();
parsestate_reset();
- avma = top;
+ if (!cb_exception_resets_avma)
+ avma = top;
}
void
--- pari-2.7.0/src/language/init.c.orig 2014-03-20 01:59:28.000000000 -0700
+++ pari-2.7.0/src/language/init.c 2019-03-01 03:44:51.207967500 -0800
@@ -93,6 +93,9 @@ void (*cb_pari_pre_recover)(long);
void (*cb_pari_err_recover)(long);
const char * pari_library_path = NULL;
+int cb_exception_resets_avma = 0;
+int cb_exception_flushes_err = 0;
+
static THREAD GEN global_err_data;
THREAD jmp_buf *iferr_env;
const long CATCH_ALL = -1;
@@ -885,8 +888,11 @@ err_recover(long numerr)
evalstate_reset();
killallfiles();
pari_init_errcatch();
- out_puts(pariErr, "\n");
- pariErr->flush();
+
+ if (!cb_exception_flushes_err) {
+ out_puts(pariErr, "\n"); /* What is this doing in generic code? It was flushed already, so this is just an empty error message! */
+ pariErr->flush(); /* If an empty line is needed by gp, this should be done in gp's error handler! */
+ }
cb_pari_err_recover(numerr);
}
@@ -966,7 +972,8 @@ pari_sigint(const char *time_s)
out_puts(pariErr, "user interrupt after ");
out_puts(pariErr, time_s);
out_term_color(pariErr, c_NONE);
- pariErr->flush();
+ if (!cb_exception_flushes_err)
+ pariErr->flush();
if (cb_pari_handle_exception)
recover = cb_pari_handle_exception(-1);
if (!recover && !block)
@@ -1318,7 +1325,8 @@ pari_err(int numerr, ...)
pari_err_display(E);
out_term_color(pariErr, c_NONE);
va_end(ap);
- pariErr->flush();
+ if (!cb_exception_flushes_err)
+ pariErr->flush();
if (cb_pari_handle_exception &&
cb_pari_handle_exception(numerr)) return;
err_recover(numerr);