From 60cfd2785740850bbc46c954e22e51b1d26fc446 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Wed, 18 Jul 2012 14:33:37 -0700 Subject: [PATCH] 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 . --- src/ChangeLog | 8 ++++++++ src/intervals.c | 18 +++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index d202e1d3f3..5a7a981926 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2012-07-18 Andreas Schwab + + 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 + . + 2012-07-18 Paul Eggert * alloc.c (Fmake_bool_vector): Fix off-by-8 bug diff --git a/src/intervals.c b/src/intervals.c index 5b8d44e8ce..cd1254b5e4 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)) { -- 2.20.1