diff options
| author | Stefan Monnier | 2024-02-05 17:58:47 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2024-02-05 17:58:47 -0500 |
| commit | 10faaa3c91045390755791c21349cd562546fdea (patch) | |
| tree | 8f813e8bbc6497ff788ccf8d07addb5b4f31a736 /src/buffer.c | |
| parent | aedfb4f04837ef7b6f50d6a9d833a3ec0f33b11d (diff) | |
| download | emacs-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.c | 60 |
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 | ||
| 3005 | ptrdiff_t | 3005 | static ptrdiff_t |
| 3006 | overlays_in (ptrdiff_t beg, ptrdiff_t end, bool extend, | 3006 | overlays_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. */ |
| 3154 | Lisp_Object | 3147 | bool |
| 3155 | disable_line_numbers_overlay_at_eob (void) | 3148 | disable_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 | ||