]> git.eshelyaron.com Git - emacs.git/commitdiff
Modify face_at_pos to not modify change IT.
authorJimmy Aguilar Mena <spacibba@aol.com>
Sun, 13 Oct 2019 14:56:50 +0000 (16:56 +0200)
committerJimmy Aguilar Mena <spacibba@aol.com>
Mon, 14 Oct 2019 12:18:42 +0000 (14:18 +0200)
src/xdisp.c (face_at_pos): Removed code to that modified
it->start_of_box_run_p and it->face_box_p.  This function should not
modify it.
(handle_face_prop): Added code to update it->start_of_box_run_p and
it->face_box_p.
(underlying_face_id): Input IT made CONST.

src/xdisp.c

index 6c0b1f88488e6f3282293ad573c3bea90a4b9788..d54b717a5078e5c7ab81b2ff653b86e0c35f5127 100644 (file)
@@ -993,7 +993,7 @@ static int handle_display_spec (struct it *, Lisp_Object, Lisp_Object,
 static int handle_single_display_spec (struct it *, Lisp_Object, Lisp_Object,
                                       Lisp_Object, struct text_pos *,
                                       ptrdiff_t, int, bool, bool);
-static int underlying_face_id (struct it *);
+static int underlying_face_id (const struct it *);
 
 #define face_before_it_pos(IT) face_before_or_after_it_pos (IT, true)
 #define face_after_it_pos(IT)  face_before_or_after_it_pos (IT, false)
@@ -4158,23 +4158,20 @@ handle_fontified_prop (struct it *it)
  ***********************************************************************/
 
 static int
-face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
+face_at_pos (const struct it *it, enum lface_attribute_index attr_filter)
 {
-  int new_face_id;
   ptrdiff_t next_stop;
-  const bool is_string = STRINGP (it->string);
-
-  if (!is_string)
-    {
-      new_face_id
-       = face_at_buffer_position (it->w,
-                                  IT_CHARPOS (*it),
-                                  &next_stop,
-                                  (IT_CHARPOS (*it)
-                                   + TEXT_PROP_DISTANCE_LIMIT),
-                                  false, it->base_face_id,
-                                  attr_filter);
-     }
+
+  if (!STRINGP (it->string))
+    {
+      return face_at_buffer_position (it->w,
+                                      IT_CHARPOS (*it),
+                                      &next_stop,
+                                      (IT_CHARPOS (*it)
+                                      + TEXT_PROP_DISTANCE_LIMIT),
+                                      false, it->base_face_id,
+                                      attr_filter);
+    }
   else
     {
       int base_face_id;
@@ -4183,7 +4180,7 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
       Lisp_Object from_overlay
        = (it->current.overlay_string_index >= 0
           ? it->string_overlays[it->current.overlay_string_index
-                                % OVERLAY_STRING_CHUNK_SIZE]
+                                % OVERLAY_STRING_CHUNK_SIZE]
           : Qnil);
 
       /* See if we got to this string directly or indirectly from
@@ -4198,7 +4195,7 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
            if (it->stack[i].current.overlay_string_index >= 0)
              from_overlay
                = it->string_overlays[it->stack[i].current.overlay_string_index
-                                     % OVERLAY_STRING_CHUNK_SIZE];
+                                     % OVERLAY_STRING_CHUNK_SIZE];
            else if (! NILP (it->stack[i].from_overlay))
              from_overlay = it->stack[i].from_overlay;
 
@@ -4213,11 +4210,11 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
             only on text properties and ignores overlays.  */
          base_face_id
            = face_for_overlay_string (it->w,
-                                      IT_CHARPOS (*it),
-                                      &next_stop,
-                                      (IT_CHARPOS (*it)
-                                       + TEXT_PROP_DISTANCE_LIMIT),
-                                      false,
+                                      IT_CHARPOS (*it),
+                                      &next_stop,
+                                      (IT_CHARPOS (*it)
+                                       + TEXT_PROP_DISTANCE_LIMIT),
+                                      false,
                                       from_overlay);
        }
       else
@@ -4247,14 +4244,24 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
            : underlying_face_id (it);
        }
 
-      new_face_id = face_at_string_position (it->w,
-                                            it->string,
-                                            IT_STRING_CHARPOS (*it),
-                                            bufpos,
-                                            &next_stop,
-                                             base_face_id, false,
-                                            attr_filter);
-    } /* !is_string.  */
+      return face_at_string_position (it->w,
+                                      it->string,
+                                      IT_STRING_CHARPOS (*it),
+                                      bufpos,
+                                      &next_stop,
+                                      base_face_id, false,
+                                      attr_filter);
+    } // !STRINGP (it->string))
+}
+
+
+/* Set up iterator IT from face properties at its current position.
+   Called from handle_stop.  */
+static enum prop_handled
+handle_face_prop (struct it *it)
+{
+  const int new_face_id = face_at_pos (it, 0);
+
 
   /* Is this a start of a run of characters with box face?
      Caveat: this can be called for a freshly initialized
@@ -4273,11 +4280,11 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
       /* If the value of face_id of the iterator is -1, we have to
         look in front of IT's position and see whether there is a
         face there that's different from new_face_id.  */
-      if (!is_string
+      if (!STRINGP (it->string)
           && !old_face
           && IT_CHARPOS (*it) > BEG)
        {
-         int prev_face_id = face_before_it_pos (it);
+         const int prev_face_id = face_before_it_pos (it);
 
          old_face = FACE_FROM_ID_OR_NULL (it->f, prev_face_id);
        }
@@ -4285,21 +4292,12 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
       /* If the new face has a box, but the old face does not,
         this is the start of a run of characters with box face,
         i.e. this character has a shadow on the left side.  */
+      it->face_id = new_face_id;
       it->start_of_box_run_p = (new_face->box != FACE_NO_BOX
                                 && (old_face == NULL || !old_face->box));
       it->face_box_p = new_face->box != FACE_NO_BOX;
     }
 
-  return new_face_id;
-}
-
-
-/* Set up iterator IT from face properties at its current position.
-   Called from handle_stop.  */
-static enum prop_handled
-handle_face_prop (struct it *it)
-{
-  it->face_id = face_at_pos (it, 0);
   return HANDLED_NORMALLY;
 }
 
@@ -4310,7 +4308,7 @@ handle_face_prop (struct it *it)
    Otherwise, use the iterator's base_face_id.  */
 
 static int
-underlying_face_id (struct it *it)
+underlying_face_id (const struct it *it)
 {
   int face_id = it->base_face_id, i;