Bill Allombert on Tue, 11 Sep 2018 22:46:28 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: err_e_STACK should be a universal constant |
On Tue, Sep 11, 2018 at 10:35:40AM +0200, Jeroen Demeyer wrote: > Hello, > > As far as I know, every GEN returned by the PARI library falls in one of > these 3 cases: > > * on PARI stack > * clone > * universal constant > > The only exception is err_e_STACK which is effectively a universal constant > but is_universal_constant() returns 0 for it. Is there a reason for that? > > I am asking in the context of Python bindings for PARI. The existing cypari2 > package used to always copy everything. Now I'm trying to improve the memory > management by keeping objects on the PARI stack for a longer time. To do > this, I need to distinguish between the 3 cases I mentioned above and > err_e_STACK is the only object (that I found so far) where this fails. The attached patch should fix this. However note that you should always special case e_STACK, because if it happens this means that the stack is full so you need to recover somehow. Cheers, Bill.
>From 26d8c8d76587d067ef9c10407bc0bee896012ead Mon Sep 17 00:00:00 2001 From: Bill Allombert <Bill.Allombert@math.u-bordeaux.fr> Date: Tue, 11 Sep 2018 22:29:30 +0200 Subject: [PATCH] Merge readonly_err_STACK in readonly_constants --- src/language/init.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/language/init.c b/src/language/init.c index 4b26ddf2e..3927a3304 100644 --- a/src/language/init.c +++ b/src/language/init.c @@ -77,14 +77,12 @@ static const ulong readonly_constants[] = { evaltyp(t_INT) | _evallg(3), /* gen_m2 */ evalsigne(-1) | evallgefint(3), 2, + evaltyp(t_ERROR) | _evallg(2), /* err_e_STACK */ + e_STACK, evaltyp(t_FRAC) | _evallg(3), /* ghalf */ (ulong)(readonly_constants+4), (ulong)(readonly_constants+7) }; -static const ulong readonly_err_STACK[] = { - evaltyp(t_ERROR) | _evallg(2), - e_STACK -}; THREAD GEN bernzone, primetab; byteptr diffptr; FILE *pari_outfile, *pari_errfile, *pari_logfile, *pari_infile; @@ -506,8 +504,8 @@ init_universal_constants(void) gen_2 = (GEN)readonly_constants+7; gen_m1 = (GEN)readonly_constants+10; gen_m2 = (GEN)readonly_constants+13; - ghalf = (GEN)readonly_constants+16; - err_e_STACK = (GEN)readonly_err_STACK; + err_e_STACK = (GEN)readonly_constants+16; + ghalf = (GEN)readonly_constants+18; } static void -- 2.11.0