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