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 <sinjihng@gmail.com>
This commit is contained in:
snowapril committed 2021-08-19 19:09:23 +09:00
1 parent 0623db2e18
commit aa82a34b4c
3 files changed
+1 -51

No files matched your search

+1 -1
View File
@@ -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))
}
-48
View File
@@ -202,45 +202,6 @@ impl PyIter for PyStrIterator {
}
}
#[pyclass(module = false, name = "str_reverseiterator")]
#[derive(Debug)]
pub struct PyStrReverseIterator {
string: PyStrRef,
position: PyAtomic<usize>,
}
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<Self>, 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<Self>, args: EncodeArgs, vm: &VirtualMachine) -> PyResult<PyBytesRef> {
encode_string(zelf, args.encoding, args.errors, vm)
}
#[pymethod(magic)]
fn reversed(zelf: PyRef<Self>) -> 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 {
-2
View File
@@ -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(),