changeset 71935:40a88e361834

(handle_single_display_spec): Ensure the right value of it->position is saved by push_it. (pop_it): Restore it->object for GET_FROM_BUFFER and GET_FROM_STRING. (reseat_1): Don't setup it->object twice. (set_iterator_to_next): No need to set it->object after pop_it. (move_it_to): Explicitly check to see if last move reached to_charpos.
author Kim F. Storm <storm@cua.dk>
date Mon, 17 Jul 2006 14:25:05 +0000
parents b904c76fa243
children ab6bbd94ecf9
files src/xdisp.c
diffstat 1 files changed, 18 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Mon Jul 17 14:24:50 2006 +0000
+++ b/src/xdisp.c	Mon Jul 17 14:25:05 2006 +0000
@@ -3880,7 +3880,7 @@
 {
   Lisp_Object form;
   Lisp_Object location, value;
-  struct text_pos start_pos;
+  struct text_pos start_pos, save_pos;
   int valid_p;
 
   /* If SPEC is a list of the form `(when FORM . VALUE)', evaluate FORM.
@@ -4097,7 +4097,10 @@
       /* Save current settings of IT so that we can restore them
 	 when we are finished with the glyph property value.  */
 
+      save_pos = it->position;
+      it->position = *position;
       push_it (it);
+      it->position = save_pos;
 
       it->area = TEXT_AREA;
       it->what = IT_IMAGE;
@@ -4171,7 +4174,10 @@
     {
       /* Save current settings of IT so that we can restore them
 	 when we are finished with the glyph property value.  */
+      save_pos = it->position;
+      it->position = *position;
       push_it (it);
+      it->position = save_pos;
 
       if (NILP (location))
 	it->area = TEXT_AREA;
@@ -4983,6 +4989,12 @@
     case GET_FROM_STRETCH:
       it->object = p->u.comp.object;
       break;
+    case GET_FROM_BUFFER:
+      it->object = it->w->buffer;
+      break;
+    case GET_FROM_STRING:
+      it->object = it->string;
+      break;
     }
   it->end_charpos = p->end_charpos;
   it->string_nchars = p->string_nchars;
@@ -5302,7 +5314,6 @@
   xassert (CHARPOS (pos) >= BEGV && CHARPOS (pos) <= ZV);
 
   it->current.pos = it->position = pos;
-  XSETBUFFER (it->object, current_buffer);
   it->end_charpos = ZV;
   it->dpvec = NULL;
   it->current.dpvec_index = -1;
@@ -5800,14 +5811,12 @@
 	{
 	  IT_STRING_BYTEPOS (*it) += it->len;
 	  IT_STRING_CHARPOS (*it) += it->cmp_len;
-	  it->object = it->string;
 	  goto consider_string_end;
 	}
       else if (it->method == GET_FROM_BUFFER)
 	{
 	  IT_BYTEPOS (*it) += it->len;
 	  IT_CHARPOS (*it) += it->cmp_len;
-	  it->object = it->w->buffer;
 	}
       break;
 
@@ -6047,9 +6056,7 @@
 	}
     }
 
-  /* Record what we have and where it came from.  Note that we store a
-     buffer position in IT->position although it could arguably be a
-     string position.  */
+  /* Record what we have and where it came from.  */
   it->what = IT_CHARACTER;
   it->object = it->string;
   it->position = position;
@@ -6764,6 +6771,10 @@
 	  if (reached)
 	    break;
 	}
+      else if (BUFFERP (it->object)
+	       && it->method == GET_FROM_BUFFER
+	       && IT_CHARPOS (*it) >= to_charpos)
+	skip = MOVE_POS_MATCH_OR_ZV;
       else
 	skip = move_it_in_display_line_to (it, to_charpos, -1, MOVE_TO_POS);