Ilya Zakharevich on Sun, 8 Sep 2002 14:41:07 -0700


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

Re: gp: series bug


On Sat, Sep 07, 2002 at 10:56:32PM +0200, Karim BELABAS wrote:
> 6) as a funny side effect, the value of precdl = seriesprecision is not
> restored by the error recovery code (polcoeff would have restored it,
> but now the old value is lost for good). Hence

This is a long-standing defect in the error-recovery system.

  0) It is not documented how to do error-recovery;

  1) The code which makes global-visible changes is not informing the
     error-recovery system about these changes.

I propose a two-level system; for most-important fixed-width info one
does not need to inform anybody about any change:

  Error-recovery looks like this

    PARI_STATE st = PARI_STATE_cur();

    switch (setjmp()) ...

    PARI_STATE_restore(st);

  In addition to storing several important integers (prec etc.),
  PARI_STATE stores also a pointer to a linked list of "undo
  commands".  PARI_STATE_restore() (among other stuff) also "executes"
  these commands.  One possible flavor of a command is "call the
  user-specified function with the user-specified argument"; one can
  also have more specialized commands.

The linked list of "undo commands" is anchored at some global
variable; what goes into PARI_STATE is just the "current tail" of this
list.

Now the code which needs to temporary change the global state would do
*the same wrapping*:

    PARI_STATE st = PARI_STATE_cur();

    prec = ...;
    INSTALL_UNDO(set_series_precision, series_precision);
    series_precision = ...;

    Do something...

    PARI_STATE_restore(st);

A similar scheme is used in Perl; it does not slow down things
noticably, and is checked to be scalable.

Yours,
Ilya