The problem described in
<
http://www.xemacs.org/list-archives/xemacs-beta/200003/msg00645.html>
is still occurring for me sometimes. This causes random crashes if
you have a value set for scroll-step. One way that I've made it
happen, although not every time, is to run XEmacs -vanilla,
immediately use M-: (i.e., don't type into the *scratch* buffer) to
set toolbar-visible-p and gutter-buffers-tab-visible-p to nil and
scroll-step to 15, then do a File->Save As. This doesn't make much
sense to do since it tries to save the default *scratch* buffer, but
it sometimes causes the crash.
The patch below avoids this problem. It occurs if the height of a
window is so small that not even one line can be formatted in it. In
this case the line cache will always be empty and
point-in-line-start-cache will return -1 which was causing vmotion-1
to assert. I looked at the various callers of vmotion-1 and it
appears that it is reasonable to just have it return the input point
unchanged in this case, so that's what I did. If this is not the
right thing to do, I'd be happy to hear alternative suggestions.
Mike
2000-04-29 Mike Alexander <mta(a)arbortext.com>
* indent.c (vmotion_1): If point_in_line_start_cache fails simply
return the input position instead of asserting out.
Index: src/indent.c
===================================================================
RCS file: /usr/CVSroot/XEmacs/xemacs/src/indent.c,v
retrieving revision 1.9.2.4
diff -u -r1.9.2.4 indent.c
--- indent.c 2000/02/07 07:59:19 1.9.2.4
+++ indent.c 2000/04/29 06:58:00
@@ -624,8 +624,15 @@
/* #### This assertion must be true before the if statements are hit
but may possibly be wrong after the call to
point_in_line_start_cache if orig is outside of the visible
- region of the buffer. Handle this. */
- assert (elt >= 0);
+ region of the buffer. Handle this.
+
+ This occurs sometimes if scroll-step is non-zero and the window
+ is very small. In this case it's not possible to lay out any lines
+ in the window and point_in_line_start_cache returns -1 because
+ the line cache is empty. In this case we will just return the
+ original point and hope for the best. */
+ if (elt < 0)
+ return orig;
/* Moving downward. */
if (vtarget > 0)