| 756 | } |
| 757 | |
| 758 | fn process_label(&mut self, label: ValueLabel) { |
| 759 | if self.processed_labels.contains(&label) { |
| 760 | return; |
| 761 | } |
| 762 | dbi_log!("Intersecting with {:?}", log_get_value_name(label)); |
| 763 | self.processed_labels.insert(label); |
| 764 | |
| 765 | let value_ranges = match self.frame_info.and_then(|fi| fi.value_ranges.get(&label)) { |
| 766 | Some(value_ranges) => value_ranges, |
| 767 | None => { |
| 768 | return; |
| 769 | } |
| 770 | }; |
| 771 | |
| 772 | let ranges = &mut self.ranges; |
| 773 | for value_range in value_ranges { |
| 774 | let range_start = value_range.start as usize; |
| 775 | let range_end = value_range.end as usize; |
| 776 | let loc = value_range.loc; |
| 777 | if range_start == range_end { |
| 778 | continue; |
| 779 | } |
| 780 | assert!(range_start < range_end); |
| 781 | |
| 782 | // Find acceptable scope of ranges to intersect with. |
| 783 | let i = match ranges.binary_search_by(|s| s.start.cmp(&range_start)) { |
| 784 | Ok(i) => i, |
| 785 | Err(i) => { |
| 786 | if i > 0 && range_start < ranges[i - 1].end { |
| 787 | i - 1 |
| 788 | } else { |
| 789 | i |
| 790 | } |
| 791 | } |
| 792 | }; |
| 793 | let j = match ranges.binary_search_by(|s| s.start.cmp(&range_end)) { |
| 794 | Ok(i) | Err(i) => i, |
| 795 | }; |
| 796 | // Starting from the end, intersect (range_start..range_end) with |
| 797 | // self.ranges array. |
| 798 | for i in (i..j).rev() { |
| 799 | if range_end <= ranges[i].start || ranges[i].end <= range_start { |
| 800 | continue; |
| 801 | } |
| 802 | if range_end < ranges[i].end { |
| 803 | // Cutting some of the range from the end. |
| 804 | let mut tail = ranges[i].clone(); |
| 805 | ranges[i].end = range_end; |
| 806 | tail.start = range_end; |
| 807 | ranges.insert(i + 1, tail); |
| 808 | self.covers_entire_scope = false; |
| 809 | } |
| 810 | assert!(ranges[i].end <= range_end); |
| 811 | if range_start <= ranges[i].start { |
| 812 | ranges[i].label_location.insert(label, loc); |
| 813 | continue; |
| 814 | } |
| 815 | // Cutting some of the range from the start. |