steve%hplsg@HPLABS.HP.COM (Steve Greenbaum) (12/22/89)
Hi,
Here is a bug in Emacs 18.55. I'm using it on an HP 9000/370 with HPUX 6.2
and X11.
Function indent-sexp, when trying to indent things like the following
expression fragment, will sometimes get into an infinite loop:
( ;)
To get the looping behavior there must not be an "extra" right paren later in
the file. For example, the following will NOT loop:
( ;)
)
The problem is that forward-sexp thinks the first example is a complete expr,
but parse-partial-sexp does not. Forward-sexp is used by indent-sexp to check
that there is a complete expression. The first example passes this test, then
the rest of indent-sexp, using parse-partial-sexp, loops looking for
parenthesis nesting level 0, which it correctly does not find (i.e. variabe
next-depth remains greater than zero). The second example works because the
added paren closes the expression, even though forward-sexp incorrectly thinks
the commented-out paren is the closing paren.
Of course this can happen with realalistic examples too (that's how I found
it).
A simple fix is to add a "last-point" variable to indent-sexp, initialized to
-1, and add:
(or outer-loop-done
(setq outer-loop-done (= (point) last-point))
(setq last-point (point))
)
to the end of the outer while loop. A better but more complicated fix would
be to make forward-sexp smart about comments.
Steve Greenbaum
HP Labs
1501 Page Mill Road
Palo Alto, CA 94304
(415) 857-5181
greenbaum@hplabs.hp.com