From bb7469ce9bbfd46a8804714763ac0df016cd56ba Mon Sep 17 00:00:00 2001 From: Kangzhi Shi Date: Sat, 16 Oct 2021 14:05:44 +0200 Subject: [PATCH] Impl PySequence contains, count and index --- vm/src/protocol/sequence.rs | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/vm/src/protocol/sequence.rs b/vm/src/protocol/sequence.rs index 2943f66ad..a007f6a74 100644 --- a/vm/src/protocol/sequence.rs +++ b/vm/src/protocol/sequence.rs @@ -222,6 +222,63 @@ impl PySequence { list.extend(self.obj.clone(), vm)?; Ok(list.into()) } + + pub fn contains(&self, target: &PyObjectRef, vm: &VirtualMachine) -> PyResult { + if let Some(f) = self.methods().contains { + return f(&self.obj, target, vm); + } + + let iter = self.obj.clone().get_iter(vm)?; + let iter = iter.iter(vm)?; + + for elem in iter { + let elem = elem?; + if vm.bool_eq(&elem, target)? { + return Ok(true); + } + } + Ok(false) + } + + pub fn count(&self, target: &PyObjectRef, vm: &VirtualMachine) -> PyResult { + let mut n = 0; + + let iter = self.obj.clone().get_iter(vm)?; + let iter = iter.iter(vm)?; + + for elem in iter { + let elem = elem?; + if vm.bool_eq(&elem, target)? { + if n == isize::MAX as usize { + return Err(vm.new_overflow_error("index exceeds C integer size".to_string())); + } + n += 1; + } + } + + Ok(n) + } + + pub fn index(&self, target: &PyObjectRef, vm: &VirtualMachine) -> PyResult { + let mut index: isize = -1; + + let iter = self.obj.clone().get_iter(vm)?; + let iter = iter.iter(vm)?; + + for elem in iter { + if index == isize::MAX { + return Err(vm.new_overflow_error("index exceeds C integer size".to_string())); + } + index += 1; + + let elem = elem?; + if vm.bool_eq(&elem, target)? { + return Ok(index as usize); + } + } + + Err(vm.new_value_error("sequence.index(x): x not in sequence".to_string())) + } } pub(crate) fn try_add_for_concat(