diff options
| author | Stefan Monnier | 2014-05-01 11:15:46 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2014-05-01 11:15:46 -0400 |
| commit | 23c931aa24622cafab8e30c4f779b70f2390a409 (patch) | |
| tree | 054a070f44869a310a4c3daf307de77565f1dff7 /src | |
| parent | f40c5041bb429029ef066552d0768fe61bd1f163 (diff) | |
| download | emacs-23c931aa24622cafab8e30c4f779b70f2390a409.tar.gz emacs-23c931aa24622cafab8e30c4f779b70f2390a409.zip | |
* src/intervals.c: Tighten assertions.
(create_root_interval): Make sure the interval is not empty.
(intervals_equal): Use booleans.
(rotate_right, rotate_left): Check LENGTHs rather than TOTAL_LENGTH.
(balance_an_interval): Sanity check LENGTHs and TOTAL_LENGTHs.
(balance_possible_root_interval): Simplify and use booleans.
(split_interval_right, split_interval_left): Check LENGTH, and remove
now redundant assertion.
(adjust_intervals_for_insertion): Remove now redundant assertions.
(delete_node, interval_deletion_adjustment)
(adjust_intervals_for_deletion, merge_interval_right)
(merge_interval_left): Check LENGTH rather than TOTAL_LENGTH.
(reproduce_interval): Make sure the interval is not empty.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 16 | ||||
| -rw-r--r-- | src/intervals.c | 94 |
2 files changed, 65 insertions, 45 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index ab87645b48b..85914939608 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,19 @@ | |||
| 1 | 2014-05-01 Stefan Monnier <monnier@iro.umontreal.ca> | ||
| 2 | |||
| 3 | * intervals.c: Tighten assertions. | ||
| 4 | (create_root_interval): Make sure the interval is not empty. | ||
| 5 | (intervals_equal): Use booleans. | ||
| 6 | (rotate_right, rotate_left): Check LENGTHs rather than TOTAL_LENGTH. | ||
| 7 | (balance_an_interval): Sanity check LENGTHs and TOTAL_LENGTHs. | ||
| 8 | (balance_possible_root_interval): Simplify and use booleans. | ||
| 9 | (split_interval_right, split_interval_left): Check LENGTH, and remove | ||
| 10 | now redundant assertion. | ||
| 11 | (adjust_intervals_for_insertion): Remove now redundant assertions. | ||
| 12 | (delete_node, interval_deletion_adjustment) | ||
| 13 | (adjust_intervals_for_deletion, merge_interval_right) | ||
| 14 | (merge_interval_left): Check LENGTH rather than TOTAL_LENGTH. | ||
| 15 | (reproduce_interval): Make sure the interval is not empty. | ||
| 16 | |||
| 1 | 2014-04-30 Paul Eggert <eggert@cs.ucla.edu> | 17 | 2014-04-30 Paul Eggert <eggert@cs.ucla.edu> |
| 2 | 18 | ||
| 3 | * term.c (tty_menu_activate): Don't assume row and col are initialized. | 19 | * term.c (tty_menu_activate): Don't assume row and col are initialized. |
diff --git a/src/intervals.c b/src/intervals.c index 8544ed94b79..842e0c20c42 100644 --- a/src/intervals.c +++ b/src/intervals.c | |||
| @@ -110,13 +110,14 @@ create_root_interval (Lisp_Object parent) | |||
| 110 | set_string_intervals (parent, new); | 110 | set_string_intervals (parent, new); |
| 111 | new->position = 0; | 111 | new->position = 0; |
| 112 | } | 112 | } |
| 113 | 113 | eassert (LENGTH (new) > 0); | |
| 114 | |||
| 114 | set_interval_object (new, parent); | 115 | set_interval_object (new, parent); |
| 115 | 116 | ||
| 116 | return new; | 117 | return new; |
| 117 | } | 118 | } |
| 118 | 119 | ||
| 119 | /* Make the interval TARGET have exactly the properties of SOURCE */ | 120 | /* Make the interval TARGET have exactly the properties of SOURCE. */ |
| 120 | 121 | ||
| 121 | void | 122 | void |
| 122 | copy_properties (register INTERVAL source, register INTERVAL target) | 123 | copy_properties (register INTERVAL source, register INTERVAL target) |
| @@ -176,10 +177,10 @@ intervals_equal (INTERVAL i0, INTERVAL i1) | |||
| 176 | Lisp_Object i1_cdr, i1_val; | 177 | Lisp_Object i1_cdr, i1_val; |
| 177 | 178 | ||
| 178 | if (DEFAULT_INTERVAL_P (i0) && DEFAULT_INTERVAL_P (i1)) | 179 | if (DEFAULT_INTERVAL_P (i0) && DEFAULT_INTERVAL_P (i1)) |
| 179 | return 1; | 180 | return true; |
| 180 | 181 | ||
| 181 | if (DEFAULT_INTERVAL_P (i0) || DEFAULT_INTERVAL_P (i1)) | 182 | if (DEFAULT_INTERVAL_P (i0) || DEFAULT_INTERVAL_P (i1)) |
| 182 | return 0; | 183 | return false; |
| 183 | 184 | ||
| 184 | i0_cdr = i0->plist; | 185 | i0_cdr = i0->plist; |
| 185 | i1_cdr = i1->plist; | 186 | i1_cdr = i1->plist; |
| @@ -188,31 +189,31 @@ intervals_equal (INTERVAL i0, INTERVAL i1) | |||
| 188 | i0_sym = XCAR (i0_cdr); | 189 | i0_sym = XCAR (i0_cdr); |
| 189 | i0_cdr = XCDR (i0_cdr); | 190 | i0_cdr = XCDR (i0_cdr); |
| 190 | if (!CONSP (i0_cdr)) | 191 | if (!CONSP (i0_cdr)) |
| 191 | return 0; | 192 | return false; |
| 192 | i1_val = i1->plist; | 193 | i1_val = i1->plist; |
| 193 | while (CONSP (i1_val) && !EQ (XCAR (i1_val), i0_sym)) | 194 | while (CONSP (i1_val) && !EQ (XCAR (i1_val), i0_sym)) |
| 194 | { | 195 | { |
| 195 | i1_val = XCDR (i1_val); | 196 | i1_val = XCDR (i1_val); |
| 196 | if (!CONSP (i1_val)) | 197 | if (!CONSP (i1_val)) |
| 197 | return 0; | 198 | return false; |
| 198 | i1_val = XCDR (i1_val); | 199 | i1_val = XCDR (i1_val); |
| 199 | } | 200 | } |
| 200 | 201 | ||
| 201 | /* i0 has something i1 doesn't. */ | 202 | /* i0 has something i1 doesn't. */ |
| 202 | if (EQ (i1_val, Qnil)) | 203 | if (EQ (i1_val, Qnil)) |
| 203 | return 0; | 204 | return false; |
| 204 | 205 | ||
| 205 | /* i0 and i1 both have sym, but it has different values in each. */ | 206 | /* i0 and i1 both have sym, but it has different values in each. */ |
| 206 | if (!CONSP (i1_val) | 207 | if (!CONSP (i1_val) |
| 207 | || (i1_val = XCDR (i1_val), !CONSP (i1_val)) | 208 | || (i1_val = XCDR (i1_val), !CONSP (i1_val)) |
| 208 | || !EQ (XCAR (i1_val), XCAR (i0_cdr))) | 209 | || !EQ (XCAR (i1_val), XCAR (i0_cdr))) |
| 209 | return 0; | 210 | return false; |
| 210 | 211 | ||
| 211 | i0_cdr = XCDR (i0_cdr); | 212 | i0_cdr = XCDR (i0_cdr); |
| 212 | 213 | ||
| 213 | i1_cdr = XCDR (i1_cdr); | 214 | i1_cdr = XCDR (i1_cdr); |
| 214 | if (!CONSP (i1_cdr)) | 215 | if (!CONSP (i1_cdr)) |
| 215 | return 0; | 216 | return false; |
| 216 | i1_cdr = XCDR (i1_cdr); | 217 | i1_cdr = XCDR (i1_cdr); |
| 217 | } | 218 | } |
| 218 | 219 | ||
| @@ -339,10 +340,8 @@ rotate_right (INTERVAL A) | |||
| 339 | ptrdiff_t old_total = A->total_length; | 340 | ptrdiff_t old_total = A->total_length; |
| 340 | 341 | ||
| 341 | eassert (old_total > 0); | 342 | eassert (old_total > 0); |
| 342 | eassert (old_total | 343 | eassert (LENGTH (A) > 0); |
| 343 | > TOTAL_LENGTH (B) + TOTAL_LENGTH (A->right)); | 344 | eassert (LENGTH (B) > 0); |
| 344 | eassert (TOTAL_LENGTH (B) | ||
| 345 | > TOTAL_LENGTH (B->left) + TOTAL_LENGTH (c)); | ||
| 346 | 345 | ||
| 347 | /* Deal with any Parent of A; make it point to B. */ | 346 | /* Deal with any Parent of A; make it point to B. */ |
| 348 | if (! ROOT_INTERVAL_P (A)) | 347 | if (! ROOT_INTERVAL_P (A)) |
| @@ -366,9 +365,11 @@ rotate_right (INTERVAL A) | |||
| 366 | /* A's total length is decreased by the length of B and its left child. */ | 365 | /* A's total length is decreased by the length of B and its left child. */ |
| 367 | A->total_length -= B->total_length - TOTAL_LENGTH (c); | 366 | A->total_length -= B->total_length - TOTAL_LENGTH (c); |
| 368 | eassert (TOTAL_LENGTH (A) > 0); | 367 | eassert (TOTAL_LENGTH (A) > 0); |
| 368 | eassert (LENGTH (A) > 0); | ||
| 369 | 369 | ||
| 370 | /* B must have the same total length of A. */ | 370 | /* B must have the same total length of A. */ |
| 371 | B->total_length = old_total; | 371 | B->total_length = old_total; |
| 372 | eassert (LENGTH (B) > 0); | ||
| 372 | 373 | ||
| 373 | return B; | 374 | return B; |
| 374 | } | 375 | } |
| @@ -390,10 +391,8 @@ rotate_left (INTERVAL A) | |||
| 390 | ptrdiff_t old_total = A->total_length; | 391 | ptrdiff_t old_total = A->total_length; |
| 391 | 392 | ||
| 392 | eassert (old_total > 0); | 393 | eassert (old_total > 0); |
| 393 | eassert (old_total | 394 | eassert (LENGTH (A) > 0); |
| 394 | > TOTAL_LENGTH (B) + TOTAL_LENGTH (A->left)); | 395 | eassert (LENGTH (B) > 0); |
| 395 | eassert (TOTAL_LENGTH (B) | ||
| 396 | > TOTAL_LENGTH (B->right) + TOTAL_LENGTH (c)); | ||
| 397 | 396 | ||
| 398 | /* Deal with any parent of A; make it point to B. */ | 397 | /* Deal with any parent of A; make it point to B. */ |
| 399 | if (! ROOT_INTERVAL_P (A)) | 398 | if (! ROOT_INTERVAL_P (A)) |
| @@ -417,9 +416,11 @@ rotate_left (INTERVAL A) | |||
| 417 | /* A's total length is decreased by the length of B and its right child. */ | 416 | /* A's total length is decreased by the length of B and its right child. */ |
| 418 | A->total_length -= B->total_length - TOTAL_LENGTH (c); | 417 | A->total_length -= B->total_length - TOTAL_LENGTH (c); |
| 419 | eassert (TOTAL_LENGTH (A) > 0); | 418 | eassert (TOTAL_LENGTH (A) > 0); |
| 419 | eassert (LENGTH (A) > 0); | ||
| 420 | 420 | ||
| 421 | /* B must have the same total length of A. */ | 421 | /* B must have the same total length of A. */ |
| 422 | B->total_length = old_total; | 422 | B->total_length = old_total; |
| 423 | eassert (LENGTH (B) > 0); | ||
| 423 | 424 | ||
| 424 | return B; | 425 | return B; |
| 425 | } | 426 | } |
| @@ -432,6 +433,9 @@ balance_an_interval (INTERVAL i) | |||
| 432 | { | 433 | { |
| 433 | register ptrdiff_t old_diff, new_diff; | 434 | register ptrdiff_t old_diff, new_diff; |
| 434 | 435 | ||
| 436 | eassert (LENGTH (i) > 0); | ||
| 437 | eassert (TOTAL_LENGTH (i) >= LENGTH (i)); | ||
| 438 | |||
| 435 | while (1) | 439 | while (1) |
| 436 | { | 440 | { |
| 437 | old_diff = LEFT_TOTAL_LENGTH (i) - RIGHT_TOTAL_LENGTH (i); | 441 | old_diff = LEFT_TOTAL_LENGTH (i) - RIGHT_TOTAL_LENGTH (i); |
| @@ -468,16 +472,16 @@ static INTERVAL | |||
| 468 | balance_possible_root_interval (INTERVAL interval) | 472 | balance_possible_root_interval (INTERVAL interval) |
| 469 | { | 473 | { |
| 470 | Lisp_Object parent; | 474 | Lisp_Object parent; |
| 471 | bool have_parent = 0; | 475 | bool have_parent = false; |
| 472 | |||
| 473 | if (!INTERVAL_HAS_OBJECT (interval) && !INTERVAL_HAS_PARENT (interval)) | ||
| 474 | return interval; | ||
| 475 | 476 | ||
| 476 | if (INTERVAL_HAS_OBJECT (interval)) | 477 | if (INTERVAL_HAS_OBJECT (interval)) |
| 477 | { | 478 | { |
| 478 | have_parent = 1; | 479 | have_parent = true; |
| 479 | GET_INTERVAL_OBJECT (parent, interval); | 480 | GET_INTERVAL_OBJECT (parent, interval); |
| 480 | } | 481 | } |
| 482 | else if (!INTERVAL_HAS_PARENT (interval)) | ||
| 483 | return interval; | ||
| 484 | |||
| 481 | interval = balance_an_interval (interval); | 485 | interval = balance_an_interval (interval); |
| 482 | 486 | ||
| 483 | if (have_parent) | 487 | if (have_parent) |
| @@ -553,7 +557,7 @@ split_interval_right (INTERVAL interval, ptrdiff_t offset) | |||
| 553 | { | 557 | { |
| 554 | set_interval_right (interval, new); | 558 | set_interval_right (interval, new); |
| 555 | new->total_length = new_length; | 559 | new->total_length = new_length; |
| 556 | eassert (TOTAL_LENGTH (new) >= 0); | 560 | eassert (LENGTH (new) > 0); |
| 557 | } | 561 | } |
| 558 | else | 562 | else |
| 559 | { | 563 | { |
| @@ -562,7 +566,6 @@ split_interval_right (INTERVAL interval, ptrdiff_t offset) | |||
| 562 | set_interval_parent (interval->right, new); | 566 | set_interval_parent (interval->right, new); |
| 563 | set_interval_right (interval, new); | 567 | set_interval_right (interval, new); |
| 564 | new->total_length = new_length + new->right->total_length; | 568 | new->total_length = new_length + new->right->total_length; |
| 565 | eassert (TOTAL_LENGTH (new) >= 0); | ||
| 566 | balance_an_interval (new); | 569 | balance_an_interval (new); |
| 567 | } | 570 | } |
| 568 | 571 | ||
| @@ -598,7 +601,7 @@ split_interval_left (INTERVAL interval, ptrdiff_t offset) | |||
| 598 | { | 601 | { |
| 599 | set_interval_left (interval, new); | 602 | set_interval_left (interval, new); |
| 600 | new->total_length = new_length; | 603 | new->total_length = new_length; |
| 601 | eassert (TOTAL_LENGTH (new) >= 0); | 604 | eassert (LENGTH (new) > 0); |
| 602 | } | 605 | } |
| 603 | else | 606 | else |
| 604 | { | 607 | { |
| @@ -607,7 +610,6 @@ split_interval_left (INTERVAL interval, ptrdiff_t offset) | |||
| 607 | set_interval_parent (new->left, new); | 610 | set_interval_parent (new->left, new); |
| 608 | set_interval_left (interval, new); | 611 | set_interval_left (interval, new); |
| 609 | new->total_length = new_length + new->left->total_length; | 612 | new->total_length = new_length + new->left->total_length; |
| 610 | eassert (TOTAL_LENGTH (new) >= 0); | ||
| 611 | balance_an_interval (new); | 613 | balance_an_interval (new); |
| 612 | } | 614 | } |
| 613 | 615 | ||
| @@ -791,12 +793,12 @@ update_interval (register INTERVAL i, ptrdiff_t pos) | |||
| 791 | { | 793 | { |
| 792 | if (pos < i->position) | 794 | if (pos < i->position) |
| 793 | { | 795 | { |
| 794 | /* Move left. */ | 796 | /* Move left. */ |
| 795 | if (pos >= i->position - TOTAL_LENGTH (i->left)) | 797 | if (pos >= i->position - TOTAL_LENGTH (i->left)) |
| 796 | { | 798 | { |
| 797 | i->left->position = i->position - TOTAL_LENGTH (i->left) | 799 | i->left->position = i->position - TOTAL_LENGTH (i->left) |
| 798 | + LEFT_TOTAL_LENGTH (i->left); | 800 | + LEFT_TOTAL_LENGTH (i->left); |
| 799 | i = i->left; /* Move to the left child */ | 801 | i = i->left; /* Move to the left child. */ |
| 800 | } | 802 | } |
| 801 | else if (NULL_PARENT (i)) | 803 | else if (NULL_PARENT (i)) |
| 802 | error ("Point before start of properties"); | 804 | error ("Point before start of properties"); |
| @@ -806,12 +808,12 @@ update_interval (register INTERVAL i, ptrdiff_t pos) | |||
| 806 | } | 808 | } |
| 807 | else if (pos >= INTERVAL_LAST_POS (i)) | 809 | else if (pos >= INTERVAL_LAST_POS (i)) |
| 808 | { | 810 | { |
| 809 | /* Move right. */ | 811 | /* Move right. */ |
| 810 | if (pos < INTERVAL_LAST_POS (i) + TOTAL_LENGTH (i->right)) | 812 | if (pos < INTERVAL_LAST_POS (i) + TOTAL_LENGTH (i->right)) |
| 811 | { | 813 | { |
| 812 | i->right->position = INTERVAL_LAST_POS (i) | 814 | i->right->position = INTERVAL_LAST_POS (i) |
| 813 | + LEFT_TOTAL_LENGTH (i->right); | 815 | + LEFT_TOTAL_LENGTH (i->right); |
| 814 | i = i->right; /* Move to the right child */ | 816 | i = i->right; /* Move to the right child. */ |
| 815 | } | 817 | } |
| 816 | else if (NULL_PARENT (i)) | 818 | else if (NULL_PARENT (i)) |
| 817 | error ("Point %"pD"d after end of properties", pos); | 819 | error ("Point %"pD"d after end of properties", pos); |
| @@ -958,7 +960,6 @@ adjust_intervals_for_insertion (INTERVAL tree, | |||
| 958 | for (temp = prev ? prev : i; temp; temp = INTERVAL_PARENT_OR_NULL (temp)) | 960 | for (temp = prev ? prev : i; temp; temp = INTERVAL_PARENT_OR_NULL (temp)) |
| 959 | { | 961 | { |
| 960 | temp->total_length += length; | 962 | temp->total_length += length; |
| 961 | eassert (TOTAL_LENGTH (temp) >= 0); | ||
| 962 | temp = balance_possible_root_interval (temp); | 963 | temp = balance_possible_root_interval (temp); |
| 963 | } | 964 | } |
| 964 | 965 | ||
| @@ -1014,7 +1015,6 @@ adjust_intervals_for_insertion (INTERVAL tree, | |||
| 1014 | for (temp = i; temp; temp = INTERVAL_PARENT_OR_NULL (temp)) | 1015 | for (temp = i; temp; temp = INTERVAL_PARENT_OR_NULL (temp)) |
| 1015 | { | 1016 | { |
| 1016 | temp->total_length += length; | 1017 | temp->total_length += length; |
| 1017 | eassert (TOTAL_LENGTH (temp) >= 0); | ||
| 1018 | temp = balance_possible_root_interval (temp); | 1018 | temp = balance_possible_root_interval (temp); |
| 1019 | } | 1019 | } |
| 1020 | } | 1020 | } |
| @@ -1216,9 +1216,10 @@ delete_node (register INTERVAL i) | |||
| 1216 | this = this->left; | 1216 | this = this->left; |
| 1217 | this->total_length += migrate_amt; | 1217 | this->total_length += migrate_amt; |
| 1218 | } | 1218 | } |
| 1219 | eassert (TOTAL_LENGTH (this) >= 0); | ||
| 1220 | set_interval_left (this, migrate); | 1219 | set_interval_left (this, migrate); |
| 1221 | set_interval_parent (migrate, this); | 1220 | set_interval_parent (migrate, this); |
| 1221 | eassert (LENGTH (this) > 0); | ||
| 1222 | eassert (LENGTH (i->right) > 0); | ||
| 1222 | 1223 | ||
| 1223 | return i->right; | 1224 | return i->right; |
| 1224 | } | 1225 | } |
| @@ -1298,7 +1299,7 @@ interval_deletion_adjustment (register INTERVAL tree, register ptrdiff_t from, | |||
| 1298 | relative_position, | 1299 | relative_position, |
| 1299 | amount); | 1300 | amount); |
| 1300 | tree->total_length -= subtract; | 1301 | tree->total_length -= subtract; |
| 1301 | eassert (TOTAL_LENGTH (tree) >= 0); | 1302 | eassert (LENGTH (tree) > 0); |
| 1302 | return subtract; | 1303 | return subtract; |
| 1303 | } | 1304 | } |
| 1304 | /* Right branch. */ | 1305 | /* Right branch. */ |
| @@ -1313,7 +1314,7 @@ interval_deletion_adjustment (register INTERVAL tree, register ptrdiff_t from, | |||
| 1313 | relative_position, | 1314 | relative_position, |
| 1314 | amount); | 1315 | amount); |
| 1315 | tree->total_length -= subtract; | 1316 | tree->total_length -= subtract; |
| 1316 | eassert (TOTAL_LENGTH (tree) >= 0); | 1317 | eassert (LENGTH (tree) > 0); |
| 1317 | return subtract; | 1318 | return subtract; |
| 1318 | } | 1319 | } |
| 1319 | /* Here -- this node. */ | 1320 | /* Here -- this node. */ |
| @@ -1328,7 +1329,7 @@ interval_deletion_adjustment (register INTERVAL tree, register ptrdiff_t from, | |||
| 1328 | amount = my_amount; | 1329 | amount = my_amount; |
| 1329 | 1330 | ||
| 1330 | tree->total_length -= amount; | 1331 | tree->total_length -= amount; |
| 1331 | eassert (TOTAL_LENGTH (tree) >= 0); | 1332 | eassert (LENGTH (tree) >= 0); |
| 1332 | if (LENGTH (tree) == 0) | 1333 | if (LENGTH (tree) == 0) |
| 1333 | delete_interval (tree); | 1334 | delete_interval (tree); |
| 1334 | 1335 | ||
| @@ -1370,7 +1371,7 @@ adjust_intervals_for_deletion (struct buffer *buffer, | |||
| 1370 | if (ONLY_INTERVAL_P (tree)) | 1371 | if (ONLY_INTERVAL_P (tree)) |
| 1371 | { | 1372 | { |
| 1372 | tree->total_length -= length; | 1373 | tree->total_length -= length; |
| 1373 | eassert (TOTAL_LENGTH (tree) >= 0); | 1374 | eassert (LENGTH (tree) > 0); |
| 1374 | return; | 1375 | return; |
| 1375 | } | 1376 | } |
| 1376 | 1377 | ||
| @@ -1430,12 +1431,12 @@ merge_interval_right (register INTERVAL i) | |||
| 1430 | while (! NULL_LEFT_CHILD (successor)) | 1431 | while (! NULL_LEFT_CHILD (successor)) |
| 1431 | { | 1432 | { |
| 1432 | successor->total_length += absorb; | 1433 | successor->total_length += absorb; |
| 1433 | eassert (TOTAL_LENGTH (successor) >= 0); | 1434 | eassert (LENGTH (successor) > 0); |
| 1434 | successor = successor->left; | 1435 | successor = successor->left; |
| 1435 | } | 1436 | } |
| 1436 | 1437 | ||
| 1437 | successor->total_length += absorb; | 1438 | successor->total_length += absorb; |
| 1438 | eassert (TOTAL_LENGTH (successor) >= 0); | 1439 | eassert (LENGTH (successor) > 0); |
| 1439 | delete_interval (i); | 1440 | delete_interval (i); |
| 1440 | return successor; | 1441 | return successor; |
| 1441 | } | 1442 | } |
| @@ -1457,7 +1458,7 @@ merge_interval_right (register INTERVAL i) | |||
| 1457 | 1458 | ||
| 1458 | successor = INTERVAL_PARENT (successor); | 1459 | successor = INTERVAL_PARENT (successor); |
| 1459 | successor->total_length -= absorb; | 1460 | successor->total_length -= absorb; |
| 1460 | eassert (TOTAL_LENGTH (successor) >= 0); | 1461 | eassert (LENGTH (successor) > 0); |
| 1461 | } | 1462 | } |
| 1462 | 1463 | ||
| 1463 | /* This must be the rightmost or last interval and cannot | 1464 | /* This must be the rightmost or last interval and cannot |
| @@ -1486,12 +1487,12 @@ merge_interval_left (register INTERVAL i) | |||
| 1486 | while (! NULL_RIGHT_CHILD (predecessor)) | 1487 | while (! NULL_RIGHT_CHILD (predecessor)) |
| 1487 | { | 1488 | { |
| 1488 | predecessor->total_length += absorb; | 1489 | predecessor->total_length += absorb; |
| 1489 | eassert (TOTAL_LENGTH (predecessor) >= 0); | 1490 | eassert (LENGTH (predecessor) > 0); |
| 1490 | predecessor = predecessor->right; | 1491 | predecessor = predecessor->right; |
| 1491 | } | 1492 | } |
| 1492 | 1493 | ||
| 1493 | predecessor->total_length += absorb; | 1494 | predecessor->total_length += absorb; |
| 1494 | eassert (TOTAL_LENGTH (predecessor) >= 0); | 1495 | eassert (LENGTH (predecessor) > 0); |
| 1495 | delete_interval (i); | 1496 | delete_interval (i); |
| 1496 | return predecessor; | 1497 | return predecessor; |
| 1497 | } | 1498 | } |
| @@ -1513,7 +1514,7 @@ merge_interval_left (register INTERVAL i) | |||
| 1513 | 1514 | ||
| 1514 | predecessor = INTERVAL_PARENT (predecessor); | 1515 | predecessor = INTERVAL_PARENT (predecessor); |
| 1515 | predecessor->total_length -= absorb; | 1516 | predecessor->total_length -= absorb; |
| 1516 | eassert (TOTAL_LENGTH (predecessor) >= 0); | 1517 | eassert (LENGTH (predecessor) > 0); |
| 1517 | } | 1518 | } |
| 1518 | 1519 | ||
| 1519 | /* This must be the leftmost or first interval and cannot | 1520 | /* This must be the leftmost or first interval and cannot |
| @@ -1528,6 +1529,8 @@ reproduce_interval (INTERVAL source) | |||
| 1528 | { | 1529 | { |
| 1529 | register INTERVAL target = make_interval (); | 1530 | register INTERVAL target = make_interval (); |
| 1530 | 1531 | ||
| 1532 | eassert (LENGTH (source) > 0); | ||
| 1533 | |||
| 1531 | target->total_length = source->total_length; | 1534 | target->total_length = source->total_length; |
| 1532 | target->position = source->position; | 1535 | target->position = source->position; |
| 1533 | 1536 | ||
| @@ -1538,6 +1541,7 @@ reproduce_interval (INTERVAL source) | |||
| 1538 | if (! NULL_RIGHT_CHILD (source)) | 1541 | if (! NULL_RIGHT_CHILD (source)) |
| 1539 | set_interval_right (target, reproduce_tree (source->right, target)); | 1542 | set_interval_right (target, reproduce_tree (source->right, target)); |
| 1540 | 1543 | ||
| 1544 | eassert (LENGTH (target) > 0); | ||
| 1541 | return target; | 1545 | return target; |
| 1542 | } | 1546 | } |
| 1543 | 1547 | ||
| @@ -1766,7 +1770,7 @@ lookup_char_property (Lisp_Object plist, Lisp_Object prop, bool textprop) | |||
| 1766 | 1770 | ||
| 1767 | if (! NILP (fallback)) | 1771 | if (! NILP (fallback)) |
| 1768 | return fallback; | 1772 | return fallback; |
| 1769 | /* Check for alternative properties */ | 1773 | /* Check for alternative properties. */ |
| 1770 | tail = Fassq (prop, Vchar_property_alias_alist); | 1774 | tail = Fassq (prop, Vchar_property_alias_alist); |
| 1771 | if (! NILP (tail)) | 1775 | if (! NILP (tail)) |
| 1772 | { | 1776 | { |
| @@ -2434,7 +2438,7 @@ set_intervals_multibyte_1 (INTERVAL i, bool multi_flag, | |||
| 2434 | end, end_byte); | 2438 | end, end_byte); |
| 2435 | } | 2439 | } |
| 2436 | 2440 | ||
| 2437 | /* Rounding to char boundaries can theoretically ake this interval | 2441 | /* Rounding to char boundaries can theoretically make this interval |
| 2438 | spurious. If so, delete one child, and copy its property list | 2442 | spurious. If so, delete one child, and copy its property list |
| 2439 | to this interval. */ | 2443 | to this interval. */ |
| 2440 | if (LEFT_TOTAL_LENGTH (i) + RIGHT_TOTAL_LENGTH (i) >= TOTAL_LENGTH (i)) | 2444 | if (LEFT_TOTAL_LENGTH (i) + RIGHT_TOTAL_LENGTH (i) >= TOTAL_LENGTH (i)) |