Karim BELABAS on Wed, 11 Sep 2002 23:50:43 +0200 (MEST)


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

Re: gp: forbidden division t_INT / t_STR


On Wed, 11 Sep 2002, Bill Allombert wrote:
> On Mon, Aug 26, 2002 at 07:52:16PM -0400, Michael Somos wrote:
> > pari-dev,
> >
> > This is a puzzling bug because the two definitions of 'calc()' are
> > exactly the same and it is never even used. Note that if it is only
> > defined once, the error does not happen. Very strange indeed.
> > ============================================================================
> Yes. This looks very strange and very serious:
> It is sufficient to do the following to see the bug:
>
> ? f(x="")=;
> ? f(x="")=;
> ? x
> %1 = ""
>
> Note that
> ? f(x="")=;
> ? g(x="")=;
> ? x
> %1 = x
>
> So it looks like a bug in the function redefinition code.
[ sorry for not answering that message sooner, I manage my mailbox in "last
in, first out" mode... ]

Actually, it is a "known bug" that I fixed badly a long time ago (around
1996, I think).

Unfortunately, I also re-introduced the bug (relatively) recently, while
fixing another problem. This entry in anal.c specifically:

  revision 1.49
  date: 2001/02/06 18:33:00;  author: karim;  state: Exp;  lines: +4 -2
  initialize redefine_fun in lis*

Explanation of the problem:

The code is first checked for syntax errors (skip*), then GP reparses
everything (no comment), _executing code as it reads it_. So, here we go:

  f(x="")=;

So, the first time:
f : unknown symbol
( : OK, we're parsing a function. f is unknown. So go to function definition
mode, parse prototype, etc. No problemo.

The second time:
f(   : we're evaluating a known function, read args
x="" : argument is "" (side effect set x to "")
)    : presumably, we're done evaluating. Just to be sure, look ahead:
=    : Ooops (look ahead: '=' not '=='). So we are redefining f after all. Go to
       function redefinition code, etc.

Net side effect x is "".


The old "solution" was to set a global flag in the 'skip' phase, so that the
'run' phase would be aware of the problem.

This was a very bad fix for plenty of reasons (it was even documented, but I
forgot about it).

Better solutions:
1) Re-skip argument block of user functions to make sure we're not redefining

2) junk the parser and use gp2c's.

I vote for (2). But just implemented (1) as a short term solution.

    Karim.
-- 
Karim Belabas                    Tel: (+33) (0)1 69 15 57 48
Dép. de Mathematiques, Bat. 425  Fax: (+33) (0)1 69 15 60 19
Université Paris-Sud             Email: Karim.Belabas@math.u-psud.fr
F-91405 Orsay (France)           http://www.math.u-psud.fr/~belabas/
--
PARI/GP Home Page: http://www.parigp-home.de/