From 9eb0aa7bd3d56010d277daa3e005ed4ab8f9d73d Mon Sep 17 00:00:00 2001 From: Dan Nasman Date: Mon, 27 Feb 2023 16:52:43 +0200 Subject: [PATCH 1/4] begin work on array as_sequence --- stdlib/src/array.rs | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/stdlib/src/array.rs b/stdlib/src/array.rs index cba0eb2fda..3863eddd50 100644 --- a/stdlib/src/array.rs +++ b/stdlib/src/array.rs @@ -50,7 +50,7 @@ mod array { function::{ArgBytesLike, ArgIntoFloat, ArgIterable, OptionalArg, PyComparisonValue}, protocol::{ BufferDescriptor, BufferMethods, BufferResizeGuard, PyBuffer, PyIterReturn, - PyMappingMethods, + PyMappingMethods, PySequenceMethods }, sequence::{OptionalRangeArgs, SequenceExt, SequenceMutExt}, sliceable::{ @@ -58,7 +58,7 @@ mod array { SliceableSequenceOp, }, types::{ - AsBuffer, AsMapping, Comparable, Constructor, IterNext, IterNextIterable, Iterable, + AsBuffer, AsSequence, AsMapping, Comparable, Constructor, IterNext, IterNextIterable, Iterable, PyComparisonOp, }, AsObject, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, @@ -1313,6 +1313,47 @@ mod array { } } + impl AsSequence for PyArray { + fn as_sequence() -> &'static PySequenceMethods { + static AS_SEQUENCE: PySequenceMethods = PySequenceMethods { + length: atomic_func!(|seq, _vm| Ok(PyArray::sequence_downcast(seq).len())), + concat: atomic_func!(|seq, other, vm| { + PyArray::sequence_downcast(seq) + .concat(other, vm) + .map(|x| x.into()) + }), + repeat: atomic_func!(|seq, n, vm| { + PyArray::sequence_downcast(seq).mul(n, vm).map(|x| x.into()) + }), + item: atomic_func!(|seq, i, vm| { + PyArray::sequence_downcast(seq).read().getitem_by_index(i, vm) + }), + ass_item: atomic_func!(|seq, i, value, vm| { + let zelf = PyArray::sequence_downcast(seq); + if let Some(value) = value { + zelf.read().setitem_by_index(vm, i, value) + } else { + zelf.read().delitem_by_index(vm, i) + } + }), + contains: atomic_func!(|seq, target, vm| { + let zelf = PyArray::sequence_downcast(seq); + zelf.contains(vm, target) + }), + inplace_concat: atomic_func!(|seq, other, vm| { + let zelf = PyArray::sequence_downcast(seq); + PyArray::inplace_concat(zelf, other, vm) + }), + inplace_repeat: atomic_func!(|seq, n, vm| { + let zelf = PyArray::sequence_downcast(seq); + zelf.read().imul(n, vm)?; + Ok(zelf.to_owned().into()) + }), + }; + &AS_SEQUENCE + } + } + impl Iterable for PyArray { fn iter(zelf: PyRef, vm: &VirtualMachine) -> PyResult { Ok(PyArrayIter { From 034be40f44123ad2532cdc1497354d27ae92d4fe Mon Sep 17 00:00:00 2001 From: Dan Nasman Date: Mon, 27 Feb 2023 18:11:33 +0200 Subject: [PATCH 2/4] add as_sequence for array --- stdlib/src/array.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/stdlib/src/array.rs b/stdlib/src/array.rs index bb4b233c92..4c3bfe9afa 100644 --- a/stdlib/src/array.rs +++ b/stdlib/src/array.rs @@ -1320,9 +1320,10 @@ mod array { static AS_SEQUENCE: PySequenceMethods = PySequenceMethods { length: atomic_func!(|seq, _vm| Ok(PyArray::sequence_downcast(seq).len())), concat: atomic_func!(|seq, other, vm| { - PyArray::sequence_downcast(seq) - .concat(other, vm) - .map(|x| x.into()) + let zelf = PyArray::sequence_downcast(seq); + let mut objects = zelf.read().get_objects(vm).to_owned(); + objects.push(other.to_owned().into()); + Ok(vm.new_pyobj(objects)) }), repeat: atomic_func!(|seq, n, vm| { PyArray::sequence_downcast(seq).mul(n, vm).map(|x| x.into()) @@ -1333,23 +1334,22 @@ mod array { ass_item: atomic_func!(|seq, i, value, vm| { let zelf = PyArray::sequence_downcast(seq); if let Some(value) = value { - zelf.read().setitem_by_index(vm, i, value) + zelf.write().setitem_by_index(i, value, vm) } else { - zelf.read().delitem_by_index(vm, i) + zelf.write().delitem_by_index(i, vm) } }), contains: atomic_func!(|seq, target, vm| { let zelf = PyArray::sequence_downcast(seq); - zelf.contains(vm, target) + Ok(zelf.contains(target.to_owned().into(), vm)) }), inplace_concat: atomic_func!(|seq, other, vm| { - let zelf = PyArray::sequence_downcast(seq); - PyArray::inplace_concat(zelf, other, vm) + let zelf = PyArray::sequence_downcast(seq).to_owned(); + PyArray::iadd(zelf, other.to_owned().into(), vm).map(|x| x.into()) }), inplace_repeat: atomic_func!(|seq, n, vm| { - let zelf = PyArray::sequence_downcast(seq); - zelf.read().imul(n, vm)?; - Ok(zelf.to_owned().into()) + let zelf = PyArray::sequence_downcast(seq).to_owned(); + PyArray::imul(zelf, n, vm).map(|x| x.into()) }), }; &AS_SEQUENCE From 1f8089156374878bcc27ad2aaab97da4b4dfee53 Mon Sep 17 00:00:00 2001 From: Dan Nasman Date: Mon, 27 Feb 2023 18:30:58 +0200 Subject: [PATCH 3/4] fix clippy and fmt issues --- stdlib/src/array.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/stdlib/src/array.rs b/stdlib/src/array.rs index 4c3bfe9afa..ed9b037f84 100644 --- a/stdlib/src/array.rs +++ b/stdlib/src/array.rs @@ -50,7 +50,7 @@ mod array { function::{ArgBytesLike, ArgIntoFloat, ArgIterable, OptionalArg, PyComparisonValue}, protocol::{ BufferDescriptor, BufferMethods, BufferResizeGuard, PyBuffer, PyIterReturn, - PyMappingMethods, PySequenceMethods + PyMappingMethods, PySequenceMethods, }, sequence::{OptionalRangeArgs, SequenceExt, SequenceMutExt}, sliceable::{ @@ -58,8 +58,8 @@ mod array { SliceableSequenceOp, }, types::{ - AsBuffer, AsSequence, AsMapping, Comparable, Constructor, IterNext, IterNextIterable, Iterable, - PyComparisonOp, + AsBuffer, AsMapping, AsSequence, Comparable, Constructor, IterNext, + IterNextIterable, Iterable, PyComparisonOp, }, AsObject, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, }, @@ -1321,15 +1321,17 @@ mod array { length: atomic_func!(|seq, _vm| Ok(PyArray::sequence_downcast(seq).len())), concat: atomic_func!(|seq, other, vm| { let zelf = PyArray::sequence_downcast(seq); - let mut objects = zelf.read().get_objects(vm).to_owned(); - objects.push(other.to_owned().into()); + let mut objects = zelf.read().get_objects(vm); + objects.push(other.to_owned()); Ok(vm.new_pyobj(objects)) }), repeat: atomic_func!(|seq, n, vm| { PyArray::sequence_downcast(seq).mul(n, vm).map(|x| x.into()) }), item: atomic_func!(|seq, i, vm| { - PyArray::sequence_downcast(seq).read().getitem_by_index(i, vm) + PyArray::sequence_downcast(seq) + .read() + .getitem_by_index(i, vm) }), ass_item: atomic_func!(|seq, i, value, vm| { let zelf = PyArray::sequence_downcast(seq); @@ -1341,11 +1343,11 @@ mod array { }), contains: atomic_func!(|seq, target, vm| { let zelf = PyArray::sequence_downcast(seq); - Ok(zelf.contains(target.to_owned().into(), vm)) + Ok(zelf.contains(target.to_owned(), vm)) }), inplace_concat: atomic_func!(|seq, other, vm| { let zelf = PyArray::sequence_downcast(seq).to_owned(); - PyArray::iadd(zelf, other.to_owned().into(), vm).map(|x| x.into()) + PyArray::iadd(zelf, other.to_owned(), vm).map(|x| x.into()) }), inplace_repeat: atomic_func!(|seq, n, vm| { let zelf = PyArray::sequence_downcast(seq).to_owned(); From c32f831f8654acc3b1527b152731701b4949b9c2 Mon Sep 17 00:00:00 2001 From: Dan Nasman Date: Thu, 2 Mar 2023 14:37:34 +0200 Subject: [PATCH 4/4] change concat implementation --- stdlib/src/array.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stdlib/src/array.rs b/stdlib/src/array.rs index ed9b037f84..92b369a4f4 100644 --- a/stdlib/src/array.rs +++ b/stdlib/src/array.rs @@ -1321,9 +1321,7 @@ mod array { length: atomic_func!(|seq, _vm| Ok(PyArray::sequence_downcast(seq).len())), concat: atomic_func!(|seq, other, vm| { let zelf = PyArray::sequence_downcast(seq); - let mut objects = zelf.read().get_objects(vm); - objects.push(other.to_owned()); - Ok(vm.new_pyobj(objects)) + PyArray::add(zelf, other.to_owned(), vm).map(|x| x.into()) }), repeat: atomic_func!(|seq, n, vm| { PyArray::sequence_downcast(seq).mul(n, vm).map(|x| x.into())