diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2012-07-18 14:33:37 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2012-07-18 14:33:37 -0700 |
commit | 60cfd2785740850bbc46c954e22e51b1d26fc446 (patch) | |
tree | 12bda60aef28f7eb63ee0f30b91c5d06ba0077b4 /src | |
parent | d617c457bd9712ea07b138ab6f069dd8ab794b57 (diff) | |
download | emacs-60cfd2785740850bbc46c954e22e51b1d26fc446.tar.gz |
Fix bug that created negative-length intervals.
* intervals.c (merge_interval_right, merge_interval_left):
Do not zero out this interval if it is absorbed by its children,
as this interval's total length doesn't change in that case. See
<http://lists.gnu.org/archive/html/emacs-devel/2012-07/msg00403.html>.
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 8 | ||||
-rw-r--r-- | src/intervals.c | 18 |
2 files changed, 17 insertions, 9 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index d202e1d3f38..5a7a981926b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2012-07-18 Andreas Schwab <schwab@linux-m68k.org> + + Fix bug that created negative-length intervals. + * intervals.c (merge_interval_right, merge_interval_left): + Do not zero out this interval if it is absorbed by its children, + as this interval's total length doesn't change in that case. See + <http://lists.gnu.org/archive/html/emacs-devel/2012-07/msg00403.html>. + 2012-07-18 Paul Eggert <eggert@cs.ucla.edu> * alloc.c (Fmake_bool_vector): Fix off-by-8 bug diff --git a/src/intervals.c b/src/intervals.c index 5b8d44e8ced..cd1254b5e46 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -1391,10 +1391,6 @@ merge_interval_right (register INTERVAL i) register ptrdiff_t absorb = LENGTH (i); register INTERVAL successor; - /* Zero out this interval. */ - i->total_length -= absorb; - CHECK_TOTAL_LENGTH (i); - /* Find the succeeding interval. */ if (! NULL_RIGHT_CHILD (i)) /* It's below us. Add absorb as we descend. */ @@ -1413,6 +1409,10 @@ merge_interval_right (register INTERVAL i) return successor; } + /* Zero out this interval. */ + i->total_length -= absorb; + CHECK_TOTAL_LENGTH (i); + successor = i; while (! NULL_PARENT (successor)) /* It's above us. Subtract as we ascend. */ @@ -1447,10 +1447,6 @@ merge_interval_left (register INTERVAL i) register ptrdiff_t absorb = LENGTH (i); register INTERVAL predecessor; - /* Zero out this interval. */ - i->total_length -= absorb; - CHECK_TOTAL_LENGTH (i); - /* Find the preceding interval. */ if (! NULL_LEFT_CHILD (i)) /* It's below us. Go down, adding ABSORB as we go. */ @@ -1469,9 +1465,13 @@ merge_interval_left (register INTERVAL i) return predecessor; } + /* Zero out this interval. */ + i->total_length -= absorb; + CHECK_TOTAL_LENGTH (i); + predecessor = i; while (! NULL_PARENT (predecessor)) /* It's above us. Go up, - subtracting ABSORB. */ + subtracting ABSORB. */ { if (AM_RIGHT_CHILD (predecessor)) { |