Commit 062e2035 authored by Kim F. Storm's avatar Kim F. Storm
Browse files

(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.
parent 55dc982c
......@@ -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);
 
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment