Bill Allombert on Wed, 06 Apr 2011 23:56:17 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Trapping errors in library mode


On Wed, Apr 06, 2011 at 10:52:56PM +0200, Dirk Laurie wrote:
> On Wed, Apr 06, 2011 at 12:07:40PM +0200, Dirk Laurie wrote:
> > When calling the Pari library from C, I don't want my program
> > to exit when I do something silly like dividing by zero.  
> and on Wed, 6 Apr 2011 13:36:04 +0200, Bill Allombert replied:
> > I suppose you are using PARI 2.3. In that case, the proper way is to set
> > INIT_JMPm and to call setjmp(GP_DATA->env) somewhere in your code to
> > initialize GP_DATA->env. In case of an error, PARI will do
> > longjmp(GP_DATA->env).
> 
> I'm calling Pari via C from Lua, and did it this way:
> 
> if (1 && setjmp(GP_DATA->env)) luaL_argerror(L,k,"Pari error");
> 
> This works, of course after putting into my program this line:
> #include <pari/paripriv.h>
> 
> The error message is now very satisfactory:
> 
> > pari("1/0")
>   ***   division by zero
> stdin:1: bad argument #2 to 'pari' (Pari error)
> 
> Question though: will this still work in PARI 2.4, or must I then
> use the new method?

No, it will not work because GP_DATA->env does not even exist anymore.

But you can do instead:
jmp_buf env;
void gp_err_recover(long numerr) { longjmp(env, numerr); }

...
if (setjmp(env)) luaL_argerror(L,k,"Pari error");
...
cb_pari_err_recover = gp_err_recover;

Cheers,
Bill.