MCPcopy Index your code
hub / github.com/RustPython/RustPython / replace_general

Method replace_general

crates/vm/src/bytes_inner.rs:826–869  ·  view source on GitHub ↗
(
        &self,
        from: Self,
        to: Self,
        max_count: Option<usize>,
        vm: &VirtualMachine,
    )

Source from the content-addressed store, hash-verified

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,

Callers 1

replaceMethod · 0.80

Calls 6

count_substringFunction · 0.85
find_iterMethod · 0.80
ErrClass · 0.50
as_sliceMethod · 0.45
cloneMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected