]> git.eshelyaron.com Git - emacs.git/commitdiff
(handle_single_display_spec): Ensure the right value of
authorKim F. Storm <storm@cua.dk>
Mon, 17 Jul 2006 14:25:05 +0000 (14:25 +0000)
committerKim F. Storm <storm@cua.dk>
Mon, 17 Jul 2006 14:25:05 +0000 (14:25 +0000)
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.

src/xdisp.c

index 9c6c18df435c745e7166c0e319725a0428160857..22be60f7eb80187f8127cbc41550ecb76f3dd473 100644 (file)
@@ -3880,7 +3880,7 @@ handle_single_display_spec (it, spec, object, position,
 {
   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 @@ handle_single_display_spec (it, spec, object, position,
       /* 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 @@ handle_single_display_spec (it, spec, object, position,
     {
       /* 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 @@ pop_it (it)
     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 @@ reseat_1 (it, pos, set_stop_p)
   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 @@ set_iterator_to_next (it, reseat_p)
        {
          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 @@ next_element_from_string (it)
        }
     }
 
-  /* 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 @@ move_it_to (it, to_charpos, to_x, to_y, to_vpos, op)
          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);