aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorStefan Monnier2024-02-05 17:58:47 -0500
committerStefan Monnier2024-02-05 17:58:47 -0500
commit10faaa3c91045390755791c21349cd562546fdea (patch)
tree8f813e8bbc6497ff788ccf8d07addb5b4f31a736 /src/buffer.c
parentaedfb4f04837ef7b6f50d6a9d833a3ec0f33b11d (diff)
downloademacs-10faaa3c91045390755791c21349cd562546fdea.tar.gz
emacs-10faaa3c91045390755791c21349cd562546fdea.zip
Prefer `ITREE_FOREACH` over `overlays_in`
Use `ITREE_FOREACH` instead of `overlays_in` if that can save us from allocating an array. * src/buffer.c (overlays_in): Mark as static. (mouse_face_overlay_overlaps): Use `ITREE_FOREACH` instead of `overlays_in`. (disable_line_numbers_overlay_at_eob): Same, and also change return value to a boolean. * src/buffer.h (overlays_in): Don't declare. * src/editfns.c (overlays_around): Delete function. (Fget_pos_property): Use `ITREE_FOREACH` and keep the "best so far" instead of using `overlays_in` and sorting the elements. * src/lisp.h (disable_line_numbers_overlay_at_eob): Change return type to a boolean. * src/xdisp.c (should_produce_line_number): Adjust accordingly.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c60
1 files changed, 21 insertions, 39 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 352aca8ddfd..d67e1d67cd6 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3002,7 +3002,7 @@ the normal hook `change-major-mode-hook'. */)
3002 But still return the total number of overlays. 3002 But still return the total number of overlays.
3003*/ 3003*/
3004 3004
3005ptrdiff_t 3005static ptrdiff_t
3006overlays_in (ptrdiff_t beg, ptrdiff_t end, bool extend, 3006overlays_in (ptrdiff_t beg, ptrdiff_t end, bool extend,
3007 Lisp_Object **vec_ptr, ptrdiff_t *len_ptr, 3007 Lisp_Object **vec_ptr, ptrdiff_t *len_ptr,
3008 bool empty, bool trailing, 3008 bool empty, bool trailing,
@@ -3125,56 +3125,38 @@ mouse_face_overlay_overlaps (Lisp_Object overlay)
3125{ 3125{
3126 ptrdiff_t start = OVERLAY_START (overlay); 3126 ptrdiff_t start = OVERLAY_START (overlay);
3127 ptrdiff_t end = OVERLAY_END (overlay); 3127 ptrdiff_t end = OVERLAY_END (overlay);
3128 ptrdiff_t n, i, size; 3128 Lisp_Object tem;
3129 Lisp_Object *v, tem; 3129 struct itree_node *node;
3130 Lisp_Object vbuf[10];
3131 USE_SAFE_ALLOCA;
3132 3130
3133 size = ARRAYELTS (vbuf); 3131 ITREE_FOREACH (node, current_buffer->overlays,
3134 v = vbuf; 3132 start, min (end, ZV) + 1,
3135 n = overlays_in (start, end, 0, &v, &size, true, false, NULL); 3133 ASCENDING)
3136 if (n > size)
3137 { 3134 {
3138 SAFE_NALLOCA (v, 1, n); 3135 if (node->begin < end && node->end > start
3139 overlays_in (start, end, 0, &v, &n, true, false, NULL); 3136 && node->begin < node->end
3137 && !EQ (node->data, overlay)
3138 && (tem = Foverlay_get (overlay, Qmouse_face),
3139 !NILP (tem)))
3140 return true;
3140 } 3141 }
3141 3142 return false;
3142 for (i = 0; i < n; ++i)
3143 if (!EQ (v[i], overlay)
3144 && (tem = Foverlay_get (overlay, Qmouse_face),
3145 !NILP (tem)))
3146 break;
3147
3148 SAFE_FREE ();
3149 return i < n;
3150} 3143}
3151 3144
3152/* Return the value of the 'display-line-numbers-disable' property at 3145/* Return the value of the 'display-line-numbers-disable' property at
3153 EOB, if there's an overlay at ZV with a non-nil value of that property. */ 3146 EOB, if there's an overlay at ZV with a non-nil value of that property. */
3154Lisp_Object 3147bool
3155disable_line_numbers_overlay_at_eob (void) 3148disable_line_numbers_overlay_at_eob (void)
3156{ 3149{
3157 ptrdiff_t n, i, size; 3150 Lisp_Object tem = Qnil;
3158 Lisp_Object *v, tem = Qnil; 3151 struct itree_node *node;
3159 Lisp_Object vbuf[10];
3160 USE_SAFE_ALLOCA;
3161 3152
3162 size = ARRAYELTS (vbuf); 3153 ITREE_FOREACH (node, current_buffer->overlays, ZV, ZV, ASCENDING)
3163 v = vbuf;
3164 n = overlays_in (ZV, ZV, 0, &v, &size, false, false, NULL);
3165 if (n > size)
3166 { 3154 {
3167 SAFE_NALLOCA (v, 1, n); 3155 if ((tem = Foverlay_get (node->data, Qdisplay_line_numbers_disable),
3168 overlays_in (ZV, ZV, 0, &v, &n, false, false, NULL); 3156 !NILP (tem)))
3157 return true;
3169 } 3158 }
3170 3159 return false;
3171 for (i = 0; i < n; ++i)
3172 if ((tem = Foverlay_get (v[i], Qdisplay_line_numbers_disable),
3173 !NILP (tem)))
3174 break;
3175
3176 SAFE_FREE ();
3177 return tem;
3178} 3160}
3179 3161
3180 3162