(
handler: E,
err: PyObjectRef,
vm: &VirtualMachine,
)
| 999 | } |
| 1000 | |
| 1001 | fn call_native_encode_error<E>( |
| 1002 | handler: E, |
| 1003 | err: PyObjectRef, |
| 1004 | vm: &VirtualMachine, |
| 1005 | ) -> PyResult<(PyObjectRef, usize)> |
| 1006 | where |
| 1007 | for<'a> E: EncodeErrorHandler<PyEncodeContext<'a>>, |
| 1008 | { |
| 1009 | // let err = err. |
| 1010 | let range = extract_unicode_error_range(&err, vm)?; |
| 1011 | let s = PyStrRef::try_from_object(vm, err.get_attr("object", vm)?)?; |
| 1012 | let s_encoding = PyUtf8StrRef::try_from_object(vm, err.get_attr("encoding", vm)?)?; |
| 1013 | let mut ctx = PyEncodeContext { |
| 1014 | vm, |
| 1015 | encoding: s_encoding.as_str(), |
| 1016 | data: &s, |
| 1017 | pos: StrSize::default(), |
| 1018 | exception: OnceCell::from(err.downcast().unwrap()), |
| 1019 | }; |
| 1020 | let mut iter = s.as_wtf8().code_point_indices(); |
| 1021 | let start = StrSize { |
| 1022 | chars: range.start, |
| 1023 | bytes: iter.nth(range.start).unwrap().0, |
| 1024 | }; |
| 1025 | let end = StrSize { |
| 1026 | chars: range.end, |
| 1027 | bytes: if let Some(n) = range.len().checked_sub(1) { |
| 1028 | iter.nth(n).map_or(s.byte_len(), |(i, _)| i) |
| 1029 | } else { |
| 1030 | start.bytes |
| 1031 | }, |
| 1032 | }; |
| 1033 | let (replace, restart) = handler.handle_encode_error(&mut ctx, start..end, None)?; |
| 1034 | let replace = match replace { |
| 1035 | EncodeReplace::Str(s) => s.into(), |
| 1036 | EncodeReplace::Bytes(b) => b.into(), |
| 1037 | }; |
| 1038 | Ok((replace, restart.chars)) |
| 1039 | } |
| 1040 | |
| 1041 | fn call_native_decode_error<E>( |
| 1042 | handler: E, |
no test coverage detected