diff options
| author | Karl Heuer | 1995-06-11 20:14:36 +0000 |
|---|---|---|
| committer | Karl Heuer | 1995-06-11 20:14:36 +0000 |
| commit | d1dad7597ccd82b869cddd28907b82e8c900a9c2 (patch) | |
| tree | c80f8b73a1801465a69989aac802161ae8aa0d18 /src | |
| parent | 0a2ea2219a1266af808fb75999267a5d59c13353 (diff) | |
| download | emacs-d1dad7597ccd82b869cddd28907b82e8c900a9c2.tar.gz emacs-d1dad7597ccd82b869cddd28907b82e8c900a9c2.zip | |
(Fframe_or_buffer_changed_p): Calculate vector size right.
Add hysteresis when making it larger. Fill it up reliably
and check at the end for overflowing it.
(syms_of_display): Make frame_and_buffer_state initially with 20 elts.
Diffstat (limited to 'src')
| -rw-r--r-- | src/dispnew.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/dispnew.c b/src/dispnew.c index a1240cb7c6b..a09d9273e61 100644 --- a/src/dispnew.c +++ b/src/dispnew.c | |||
| @@ -1953,13 +1953,14 @@ the current state.\n") | |||
| 1953 | /* Start with 1 so there is room for at least one lambda at the end. */ | 1953 | /* Start with 1 so there is room for at least one lambda at the end. */ |
| 1954 | n = 1; | 1954 | n = 1; |
| 1955 | FOR_EACH_FRAME (tail, frame) | 1955 | FOR_EACH_FRAME (tail, frame) |
| 1956 | n++; | 1956 | n += 2; |
| 1957 | for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr) | 1957 | for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr) |
| 1958 | n += 3; | 1958 | n += 3; |
| 1959 | /* Reallocate the vector if it's grown, or if it's shrunk a lot. */ | 1959 | /* Reallocate the vector if it's grown, or if it's shrunk a lot. */ |
| 1960 | if (n > XVECTOR (frame_and_buffer_state)->size | 1960 | if (n > XVECTOR (frame_and_buffer_state)->size |
| 1961 | || n < XVECTOR (frame_and_buffer_state)->size / 2) | 1961 | || n + 20 < XVECTOR (frame_and_buffer_state)->size / 2) |
| 1962 | frame_and_buffer_state = Fmake_vector (make_number (n), Qlambda); | 1962 | /* Add 20 extra so we grow it less often. */ |
| 1963 | frame_and_buffer_state = Fmake_vector (make_number (n + 20), Qlambda); | ||
| 1963 | vecp = XVECTOR (frame_and_buffer_state)->contents; | 1964 | vecp = XVECTOR (frame_and_buffer_state)->contents; |
| 1964 | FOR_EACH_FRAME (tail, frame) | 1965 | FOR_EACH_FRAME (tail, frame) |
| 1965 | { | 1966 | { |
| @@ -1976,9 +1977,15 @@ the current state.\n") | |||
| 1976 | *vecp++ = XBUFFER (buf)->read_only; | 1977 | *vecp++ = XBUFFER (buf)->read_only; |
| 1977 | *vecp++ = Fbuffer_modified_p (buf); | 1978 | *vecp++ = Fbuffer_modified_p (buf); |
| 1978 | } | 1979 | } |
| 1979 | /* If we left any slack in the vector, fill it up now. */ | 1980 | /* Fill up the vector with lambdas (always at least one). */ |
| 1980 | for (; n < XVECTOR (frame_and_buffer_state)->size; ++n) | 1981 | *vecp++ = Qlambda; |
| 1982 | while (vecp - XVECTOR (frame_and_buffer_state)->contents | ||
| 1983 | < XVECTOR (frame_and_buffer_state)->size) | ||
| 1981 | *vecp++ = Qlambda; | 1984 | *vecp++ = Qlambda; |
| 1985 | /* Make sure we didn't overflow the vector. */ | ||
| 1986 | if (vecp - XVECTOR (frame_and_buffer_state)->contents | ||
| 1987 | > XVECTOR (frame_and_buffer_state)->size) | ||
| 1988 | abort (); | ||
| 1982 | return Qt; | 1989 | return Qt; |
| 1983 | } | 1990 | } |
| 1984 | 1991 | ||
| @@ -2545,7 +2552,7 @@ syms_of_display () | |||
| 2545 | defsubr (&Ssleep_for); | 2552 | defsubr (&Ssleep_for); |
| 2546 | defsubr (&Ssend_string_to_terminal); | 2553 | defsubr (&Ssend_string_to_terminal); |
| 2547 | 2554 | ||
| 2548 | frame_and_buffer_state = Fmake_vector (make_number (1), Qlambda); | 2555 | frame_and_buffer_state = Fmake_vector (make_number (20), Qlambda); |
| 2549 | staticpro (&frame_and_buffer_state); | 2556 | staticpro (&frame_and_buffer_state); |
| 2550 | 2557 | ||
| 2551 | DEFVAR_INT ("baud-rate", &baud_rate, | 2558 | DEFVAR_INT ("baud-rate", &baud_rate, |