the minimal subseq in symbol data that begin with [Merge] token and ends with [Join] token. A merge_idx is additional returned, which is the previous one token before the [Merge] token. Return: Option<(merge_idx, subseq)>
(&self, sym_data: &mut TaintDataVec)
| 671 | /// A merge_idx is additional returned, which is the previous one token before the [Merge] token. |
| 672 | /// Return: Option<(merge_idx, subseq)> |
| 673 | fn find_minimal_subseq(&self, sym_data: &mut TaintDataVec) -> Option<(usize, Vec<TaintData>)> { |
| 674 | let merge_idx = find_last_merge_idx(sym_data); |
| 675 | let join_idx = find_first_join_idx(sym_data, merge_idx); |
| 676 | if merge_idx.is_none() && join_idx.is_none() { |
| 677 | return None; |
| 678 | } else if merge_idx.is_none() || join_idx.is_none() { |
| 679 | unreachable!("The [Merge] and [Join] in symbol data must be paired: {sym_data:?}") |
| 680 | } |
| 681 | let merge_idx = merge_idx.unwrap(); |
| 682 | let join_idx = join_idx.unwrap(); |
| 683 | let is_next_sep = if sym_data.len() > join_idx + 1 { |
| 684 | sym_data[join_idx + 1].is_seq() |
| 685 | } else { |
| 686 | false |
| 687 | }; |
| 688 | let subtree: Vec<TaintData> = sym_data.drain(merge_idx..join_idx + 1).collect(); |
| 689 | if is_next_sep { |
| 690 | sym_data.insert(merge_idx, TaintData::new_holder()); |
| 691 | } |
| 692 | Some((merge_idx, subtree)) |
| 693 | } |
| 694 | |
| 695 | /// return the previous one data before the [Merge] token. |
| 696 | fn get_merge_previous_data(sym_data: &[TaintData], merge_idx: usize) -> Option<&TaintData> { |
no test coverage detected