| Karim BELABAS on Tue, 12 Dec 2000 17:06:57 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: return and the heap |
[David Bremner:]
> Over the last week or so I have been plaguing the list with my
> troubles with heap usage in gp. I seem to have narrowed it down to the
> fact that return makes a copy of the result of a recursive call (or
> something)
>
> With the following script, the commented out version of the recursive
> call leaves only one thing on the heap, whereas the return leaves one
> for every recursive call.
>
> foo(count)=
> {
>
> if(count<=0, return(0));
>
> \\ foo(count-1);
> return(foo(count-1));
> }
Indeed, there were a number of situations where return() could clutter the
heap. The following patch should clear this problem [should apply cleanly to
any version more recent than 2.0.17, in particular 2.1]
Cheers,
Karim.
Index: src/language/anal.c
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/language/anal.c,v
retrieving revision 1.45
diff -c -r1.45 anal.c
*** src/language/anal.c 2000/11/15 11:43:41 1.45
--- src/language/anal.c 2000/12/12 15:56:01
***************
*** 3239,3245 ****
--- 3239,3247 ----
GEN
return0(GEN x)
{
+ GEN y = br_res;
br_res = x? gclone(x): NULL;
+ if (y) gunclone(y);
br_status = br_RETURN; return NULL;
}
--
Karim Belabas email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France) Fax: (00 33) 1 69 15 60 19
--
PARI/GP Home Page: http://www.parigp-home.de/