summaryrefslogtreecommitdiff
path: root/src/intervals.c
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2012-07-18 14:33:37 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2012-07-18 14:33:37 -0700
commit60cfd2785740850bbc46c954e22e51b1d26fc446 (patch)
tree12bda60aef28f7eb63ee0f30b91c5d06ba0077b4 /src/intervals.c
parentd617c457bd9712ea07b138ab6f069dd8ab794b57 (diff)
downloademacs-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/intervals.c')
-rw-r--r--src/intervals.c18
1 files changed, 9 insertions, 9 deletions
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))
{