Bill Allombert on Wed, 10 Mar 2004 23:37:47 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
reporting the GP name of functions in error message |
Hello PARI-dev, I tried to implement reporting of the GP name of the function called where an error occur in the new parser, but I found it could be done the same way with the current parser, so here a patch. It is for evaluation purpose, it could be perfected. With this patch, we get for example: ? cotan(0) *** cotan: division by zero in R/R instead of ? cotan(0) *** division by zero in R/R or ? for(i=2,100,factormod(x^4+1,i)) *** factormod: composite modulus in mpsqrtmod: 9. instead of ? for(i=2,100,factormod(x^4+1,i)) *** composite modulus in mpsqrtmod: 9. which is less confusing when it appear inside a large GP routine. Cheers, Bill. Index: src/language/anal.c =================================================================== RCS file: /home/cvs/pari/src/language/anal.c,v retrieving revision 1.157 diff -u -r1.157 anal.c --- src/language/anal.c 26 Jan 2004 09:25:09 -0000 1.157 +++ src/language/anal.c 10 Mar 2004 22:20:21 -0000 @@ -31,6 +31,7 @@ typedef GEN (*F1GEN)(GEN); extern void killsubblocs(GEN x); +char *gp_function_name=NULL; static GEN constante(); static GEN expr(); @@ -2011,11 +2012,14 @@ err(talker2, "can't derive this", mark.identifier, mark.start); res = num_deriv(call, argvec); } - else switch (ret) + else { + gp_function_name=ep->name; + switch (ret) + { default: /* case RET_GEN: */ - res = ((PFGEN)call)(_ARGS_); - break; + res = ((PFGEN)call)(_ARGS_); + break; case RET_INT: m = (long)((int (*)(ANYARG))call)(_ARGS_); @@ -2028,6 +2032,8 @@ case RET_VOID: ((void (*)(ANYARG))call)(_ARGS_); res = gnil; break; + } + gp_function_name=NULL; } if (has_pointer) check_pointers(has_pointer,init); if (!noparen) match(')'); Index: src/language/init.c =================================================================== RCS file: /home/cvs/pari/src/language/init.c,v retrieving revision 1.215 diff -u -r1.215 init.c --- src/language/init.c 10 Mar 2004 17:24:56 -0000 1.215 +++ src/language/init.c 10 Mar 2004 22:20:25 -0000 @@ -1049,6 +1049,8 @@ longjmp(GP_DATA? GP_DATA->env: environnement, numerr); } +extern char *gp_function_name; + void err(long numerr, ...) { @@ -1123,7 +1125,13 @@ } else { - pariputsf(" *** %s", errmessage[numerr]); + if (gp_function_name) + { + pariputsf(" *** %s: %s", gp_function_name, errmessage[numerr]); + gp_function_name=NULL; + } + else + pariputsf(" *** %s", errmessage[numerr]); switch (numerr) { case talker: case siginter: case invmoder: