| 824 | } |
| 825 | |
| 826 | fn replace_general( |
| 827 | &self, |
| 828 | from: Self, |
| 829 | to: Self, |
| 830 | max_count: Option<usize>, |
| 831 | vm: &VirtualMachine, |
| 832 | ) -> PyResult<Vec<u8>> { |
| 833 | let count = count_substring( |
| 834 | self.elements.as_slice(), |
| 835 | from.elements.as_slice(), |
| 836 | max_count, |
| 837 | ); |
| 838 | if count == 0 { |
| 839 | // no matches, return unchanged |
| 840 | return Ok(self.elements.clone()); |
| 841 | } |
| 842 | |
| 843 | // Check for overflow |
| 844 | // result_len = self_len + count * (to_len-from_len) |
| 845 | debug_assert!(count > 0); |
| 846 | if to.len() as isize - from.len() as isize |
| 847 | > (isize::MAX - self.elements.len() as isize) / count as isize |
| 848 | { |
| 849 | return Err(vm.new_overflow_error("replace bytes is too long")); |
| 850 | } |
| 851 | let result_len = (self.elements.len() as isize |
| 852 | + count as isize * (to.len() as isize - from.len() as isize)) |
| 853 | as usize; |
| 854 | |
| 855 | let mut result = Vec::with_capacity(result_len); |
| 856 | let mut last_end = 0; |
| 857 | let mut count = count; |
| 858 | for offset in self.elements.find_iter(&from.elements) { |
| 859 | result.extend_from_slice(&self.elements[last_end..offset]); |
| 860 | result.extend_from_slice(to.elements.as_slice()); |
| 861 | last_end = offset + from.len(); |
| 862 | count -= 1; |
| 863 | if count == 0 { |
| 864 | break; |
| 865 | } |
| 866 | } |
| 867 | result.extend_from_slice(&self.elements[last_end..]); |
| 868 | Ok(result) |
| 869 | } |
| 870 | |
| 871 | pub fn replace( |
| 872 | &self, |