From aa82a34b4c2d4a8daef6b51eb61cd44131417f25 Mon Sep 17 00:00:00 2001 From: snowapril Date: Thu, 19 Aug 2021 17:13:05 +0900 Subject: [PATCH] iter: remove PyStrReverseIterator This commit removes `PyStrReverseIterator` and its traits for using general `PyReverseSequenceIterator` for `PyStr` type. In previous rustpython, `PyStrReverseIterator` type registered in `TypeZoo`, even it had no methods(e.g. `length_hint`, `reduce`, `setstate`) Therefore, by removing `PyStrReverseIterator`, `PyStr` enable to use `PySequenceReverseIterator`. Signed-off-by: snowapril --- vm/src/builtins/make_module.rs | 2 +- vm/src/builtins/pystr.rs | 48 ---------------------------------- vm/src/types.rs | 2 -- 3 files changed, 1 insertion(+), 51 deletions(-) diff --git a/vm/src/builtins/make_module.rs b/vm/src/builtins/make_module.rs index e2434f52d..f13f3f083 100644 --- a/vm/src/builtins/make_module.rs +++ b/vm/src/builtins/make_module.rs @@ -720,7 +720,7 @@ mod decl { vm.get_method_or_type_error(obj.clone(), "__getitem__", || { "argument to reversed() must be a sequence".to_owned() })?; - let len = vm.obj_len(&obj)? as isize; + let len = vm.obj_len(&obj)?; let obj_iterator = PyReverseSequenceIterator::new(obj, len); Ok(obj_iterator.into_object(vm)) } diff --git a/vm/src/builtins/pystr.rs b/vm/src/builtins/pystr.rs index 200be86eb..fafcf222a 100644 --- a/vm/src/builtins/pystr.rs +++ b/vm/src/builtins/pystr.rs @@ -202,45 +202,6 @@ impl PyIter for PyStrIterator { } } -#[pyclass(module = false, name = "str_reverseiterator")] -#[derive(Debug)] -pub struct PyStrReverseIterator { - string: PyStrRef, - position: PyAtomic, -} - -impl PyValue for PyStrReverseIterator { - fn class(vm: &VirtualMachine) -> &PyTypeRef { - &vm.ctx.types.str_reverseiterator_type - } -} - -#[pyimpl(with(PyIter))] -impl PyStrReverseIterator {} - -impl PyIter for PyStrReverseIterator { - fn next(zelf: &PyRef, vm: &VirtualMachine) -> PyResult { - let value = &*zelf.string.value; - let mut end = zelf.position.load(atomic::Ordering::Relaxed); - loop { - let ch = value[..end] - .chars() - .next_back() - .ok_or_else(|| vm.new_stop_iteration())?; - - match zelf.position.compare_exchange_weak( - end, - end - ch.len_utf8(), - atomic::Ordering::Release, - atomic::Ordering::Relaxed, - ) { - Ok(_) => break Ok(ch.into_pyobject(vm)), - Err(cur) => end = cur, - } - } - } -} - #[derive(FromArgs)] struct StrArgs { #[pyarg(any, optional)] @@ -1126,14 +1087,6 @@ impl PyStr { fn encode(zelf: PyRef, args: EncodeArgs, vm: &VirtualMachine) -> PyResult { encode_string(zelf, args.encoding, args.errors, vm) } - - #[pymethod(magic)] - fn reversed(zelf: PyRef) -> PyStrReverseIterator { - PyStrReverseIterator { - position: Radium::new(zelf.byte_len()), - string: zelf, - } - } } impl PyStrRef { @@ -1254,7 +1207,6 @@ pub fn init(ctx: &PyContext) { PyStr::extend_class(ctx, &ctx.types.str_type); PyStrIterator::extend_class(ctx, &ctx.types.str_iterator_type); - PyStrReverseIterator::extend_class(ctx, &ctx.types.str_reverseiterator_type); } impl PySliceableSequence for PyStr { diff --git a/vm/src/types.rs b/vm/src/types.rs index 68e50b66c..bc30f2689 100644 --- a/vm/src/types.rs +++ b/vm/src/types.rs @@ -74,7 +74,6 @@ pub struct TypeZoo { pub list_iterator_type: PyTypeRef, pub list_reverseiterator_type: PyTypeRef, pub str_iterator_type: PyTypeRef, - pub str_reverseiterator_type: PyTypeRef, pub dict_keyiterator_type: PyTypeRef, pub dict_reversekeyiterator_type: PyTypeRef, pub dict_valueiterator_type: PyTypeRef, @@ -193,7 +192,6 @@ impl TypeZoo { longrange_iterator_type: range::PyLongRangeIterator::init_bare_type().clone(), set_iterator_type: set::PySetIterator::init_bare_type().clone(), str_iterator_type: pystr::PyStrIterator::init_bare_type().clone(), - str_reverseiterator_type: pystr::PyStrReverseIterator::init_bare_type().clone(), traceback_type: traceback::PyTraceback::init_bare_type().clone(), tuple_iterator_type: tuple::PyTupleIterator::init_bare_type().clone(), weakproxy_type: weakproxy::PyWeakProxy::init_bare_type().clone(),