diff options
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/buffer.c b/src/buffer.c index 45e614fb449..7a6ddfa719d 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -3053,13 +3053,15 @@ mouse_face_overlay_overlaps (Lisp_Object overlay) | |||
| 3053 | ptrdiff_t end = OVERLAY_POSITION (OVERLAY_END (overlay)); | 3053 | ptrdiff_t end = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 3054 | ptrdiff_t n, i, size; | 3054 | ptrdiff_t n, i, size; |
| 3055 | Lisp_Object *v, tem; | 3055 | Lisp_Object *v, tem; |
| 3056 | Lisp_Object vbuf[10]; | ||
| 3057 | USE_SAFE_ALLOCA; | ||
| 3056 | 3058 | ||
| 3057 | size = 10; | 3059 | size = ARRAYELTS (vbuf); |
| 3058 | v = alloca (size * sizeof *v); | 3060 | v = vbuf; |
| 3059 | n = overlays_in (start, end, 0, &v, &size, NULL, NULL); | 3061 | n = overlays_in (start, end, 0, &v, &size, NULL, NULL); |
| 3060 | if (n > size) | 3062 | if (n > size) |
| 3061 | { | 3063 | { |
| 3062 | v = alloca (n * sizeof *v); | 3064 | SAFE_NALLOCA (v, 1, n); |
| 3063 | overlays_in (start, end, 0, &v, &n, NULL, NULL); | 3065 | overlays_in (start, end, 0, &v, &n, NULL, NULL); |
| 3064 | } | 3066 | } |
| 3065 | 3067 | ||
| @@ -3069,6 +3071,7 @@ mouse_face_overlay_overlaps (Lisp_Object overlay) | |||
| 3069 | !NILP (tem))) | 3071 | !NILP (tem))) |
| 3070 | break; | 3072 | break; |
| 3071 | 3073 | ||
| 3074 | SAFE_FREE (); | ||
| 3072 | return i < n; | 3075 | return i < n; |
| 3073 | } | 3076 | } |
| 3074 | 3077 | ||
| @@ -4517,13 +4520,13 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after, | |||
| 4517 | First copy the vector contents, in case some of these hooks | 4520 | First copy the vector contents, in case some of these hooks |
| 4518 | do subsequent modification of the buffer. */ | 4521 | do subsequent modification of the buffer. */ |
| 4519 | ptrdiff_t size = last_overlay_modification_hooks_used; | 4522 | ptrdiff_t size = last_overlay_modification_hooks_used; |
| 4520 | Lisp_Object *copy = alloca (size * sizeof *copy); | 4523 | Lisp_Object *copy; |
| 4521 | ptrdiff_t i; | 4524 | ptrdiff_t i; |
| 4522 | 4525 | ||
| 4526 | USE_SAFE_ALLOCA; | ||
| 4527 | SAFE_ALLOCA_LISP (copy, size); | ||
| 4523 | memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents, | 4528 | memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents, |
| 4524 | size * word_size); | 4529 | size * word_size); |
| 4525 | gcpro1.var = copy; | ||
| 4526 | gcpro1.nvars = size; | ||
| 4527 | 4530 | ||
| 4528 | for (i = 0; i < size;) | 4531 | for (i = 0; i < size;) |
| 4529 | { | 4532 | { |
| @@ -4532,6 +4535,8 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after, | |||
| 4532 | overlay_i = copy[i++]; | 4535 | overlay_i = copy[i++]; |
| 4533 | call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3); | 4536 | call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3); |
| 4534 | } | 4537 | } |
| 4538 | |||
| 4539 | SAFE_FREE (); | ||
| 4535 | } | 4540 | } |
| 4536 | UNGCPRO; | 4541 | UNGCPRO; |
| 4537 | } | 4542 | } |