Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7dc881d

Browse files
committed
fix unittest
1 parentbaa7309 commit7dc881d

File tree

11 files changed

+312
-247
lines changed

11 files changed

+312
-247
lines changed

‎Lib/test/test_array.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,8 +1013,6 @@ def test_coveritertraverse(self):
10131013
l.append(l)
10141014
gc.collect()
10151015

1016-
# TODO: RUSTPYTHON
1017-
@unittest.expectedFailure
10181016
deftest_buffer(self):
10191017
a=array.array(self.typecode,self.example)
10201018
m=memoryview(a)

‎vm/src/bytesinner.rs

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use itertools::Itertools;
33
use num_bigint::BigInt;
44
use num_traits::ToPrimitive;
55

6-
usecrate::anystr::{self,AnyStr,AnyStrContainer,AnyStrWrapper};
76
usecrate::byteslike::{try_bytes_like,PyBytesLike};
87
usecrate::function::{OptionalArg,OptionalOption};
98
usecrate::obj::objbytearray::PyByteArray;
@@ -23,6 +22,10 @@ use crate::pyobject::{
2322
};
2423
usecrate::slots::PyComparisonOp;
2524
usecrate::vm::VirtualMachine;
25+
usecrate::{
26+
anystr::{self,AnyStr,AnyStrContainer,AnyStrWrapper},
27+
obj::objmemory::try_buffer_from_object,
28+
};
2629
use rustpython_common::hash;
2730

2831
#[derive(Debug,Default,Clone)]
@@ -38,17 +41,16 @@ impl From<Vec<u8>> for PyBytesInner {
3841

3942
implTryFromObjectforPyBytesInner{
4043
fntry_from_object(vm:&VirtualMachine,obj:PyObjectRef) ->PyResult<Self>{
44+
ifletOk(buffer) =try_buffer_from_object(obj.clone(), vm){
45+
let bytes = buffer
46+
.as_contiguous()
47+
.ok_or_else(|| vm.new_buffer_error("buffer is not contiguous".to_owned()))?;
48+
returnOk(Self::from(bytes.to_vec()));
49+
}
50+
4151
match_class!(match obj{
42-
i @PyBytes =>Ok(PyBytesInner{
43-
elements: i.borrow_value().to_vec()
44-
}),
45-
j @PyByteArray =>Ok(PyBytesInner{
46-
elements: j.borrow_value().elements.to_vec()
47-
}),
48-
k @PyMemoryView =>Ok(PyBytesInner{
49-
elements: k.try_bytes(|v| v.to_vec()).unwrap()
50-
}),
5152
l @PyList => l.to_byte_inner(vm),
53+
// TODO: PyTyple
5254
obj =>{
5355
let iter = vm.get_method_or_type_error(obj.clone(),"__iter__", ||{
5456
format!("a bytes-like object is required, not {}", obj.class())
@@ -345,7 +347,7 @@ impl PyBytesInner {
345347
iter.map(|obj|Self::value_try_from_object(vm, obj?))
346348
.try_collect()
347349
}elseifletSome(mview) = object.payload_if_subclass::<PyMemoryView>(vm){
348-
Ok(mview.try_bytes(|v| v.to_vec()).unwrap())
350+
mview.try_bytes(vm,|v| v.to_vec())
349351
}else{
350352
Err(vm.new_type_error(
351353
"can assign only bytes, buffers, or iterables of ints in range(0, 256)".to_owned(),
@@ -363,11 +365,32 @@ impl PyBytesInner {
363365
self.elements.set_slice_items(vm,&slice, items.as_slice())
364366
}
365367

368+
pubfnsetslice_no_resize(
369+
&mutself,
370+
slice:PySliceRef,
371+
object:PyObjectRef,
372+
vm:&VirtualMachine,
373+
) ->PyResult<()>{
374+
let items =Self::value_seq_try_from_object(vm, object)?;
375+
self.elements
376+
.set_slice_items_no_resize(vm,&slice, items.as_slice())
377+
}
378+
366379
pubfnsetslice_from_self(&mutself,slice:PySliceRef,vm:&VirtualMachine) ->PyResult<()>{
367380
let items =self.elements.clone();
368381
self.elements.set_slice_items(vm,&slice, items.as_slice())
369382
}
370383

384+
pubfnsetslice_from_self_no_resize(
385+
&mutself,
386+
slice:PySliceRef,
387+
vm:&VirtualMachine,
388+
) ->PyResult<()>{
389+
let items =self.elements.clone();
390+
self.elements
391+
.set_slice_items_no_resize(vm,&slice, items.as_slice())
392+
}
393+
371394
pubfndelitem(&mutself,needle:SequenceIndex,vm:&VirtualMachine) ->PyResult<()>{
372395
match needle{
373396
SequenceIndex::Int(int) =>{

‎vm/src/obj/objbytearray.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,13 @@ use crate::byteslike::PyBytesLike;
2121
usecrate::common::cell::{PyRwLock,PyRwLockReadGuard,PyRwLockWriteGuard};
2222
usecrate::function::{OptionalArg,OptionalOption};
2323
usecrate::obj::objbytes::PyBytes;
24-
usecrate::obj::objmemory::{BufferOptions,BufferProtocol};
24+
usecrate::obj::objmemory::{Buffer,BufferOptions};
2525
usecrate::obj::objtuple::PyTupleRef;
2626
usecrate::pyobject::{
2727
BorrowValue,Either,IdProtocol,IntoPyObject,PyClassImpl,PyComparisonValue,PyContext,
2828
PyIterable,PyObjectRef,PyRef,PyResult,PyValue,TryFromObject,
2929
};
30-
usecrate::slots::AsBuffer;
31-
usecrate::slots::{Comparable,Hashable,PyComparisonOp,Unhashable};
30+
usecrate::slots::{BufferProtocol,Comparable,Hashable,PyComparisonOp,Unhashable};
3231
usecrate::vm::VirtualMachine;
3332

3433
/// "bytearray(iterable_of_ints) -> bytearray\n\
@@ -103,7 +102,7 @@ pub(crate) fn init(context: &PyContext) {
103102
PyByteArrayIterator::extend_class(context,&context.types.bytearray_iterator_type);
104103
}
105104

106-
#[pyimpl(flags(BASETYPE), with(Hashable,Comparable,AsBuffer))]
105+
#[pyimpl(flags(BASETYPE), with(Hashable,Comparable,BufferProtocol))]
107106
implPyByteArray{
108107
#[pyslot]
109108
fntp_new(
@@ -175,10 +174,13 @@ impl PyByteArray {
175174
match needle{
176175
SequenceIndex::Int(int) => zelf.borrow_value_mut().setindex(int, value, vm),
177176
SequenceIndex::Slice(slice) =>{
178-
if zelf.is(&value){
179-
zelf.borrow_value_mut().setslice_from_self(slice, vm)
180-
}else{
181-
zelf.borrow_value_mut().setslice(slice, value, vm)
177+
match(zelf.is(&value), zelf.is_resizable()){
178+
(true,true) => zelf.borrow_value_mut().setslice_from_self(slice, vm),
179+
(true,false) => zelf
180+
.borrow_value_mut()
181+
.setslice_from_self_no_resize(slice, vm),
182+
(false,true) => zelf.borrow_value_mut().setslice(slice, value, vm),
183+
(false,false) => zelf.borrow_value_mut().setslice_no_resize(slice, value, vm),
182184
}
183185
}
184186
}
@@ -583,14 +585,14 @@ impl Comparable for PyByteArray {
583585
}
584586
}
585587

586-
implAsBufferforPyByteArray{
587-
fnget_buffer(zelf:PyRef<Self>,_vm:&VirtualMachine) ->PyResult<Box<dynBufferProtocol>>{
588+
implBufferProtocolforPyByteArray{
589+
fnget_buffer(zelf:PyRef<Self>,_vm:&VirtualMachine) ->PyResult<Box<dynBuffer>>{
588590
zelf.exports.fetch_add(1);
589591
Ok(Box::new(zelf))
590592
}
591593
}
592594

593-
implBufferProtocolforPyByteArrayRef{
595+
implBufferforPyByteArrayRef{
594596
fnobj_bytes(&self) ->BorrowedValue<[u8]>{
595597
PyRwLockReadGuard::map(self.borrow_value(), |x| x.elements.as_slice()).into()
596598
}

‎vm/src/obj/objbytes.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ use crate::pyobject::{
2525
BorrowValue,Either,IntoPyObject,PyClassImpl,PyComparisonValue,PyContext,PyIterable,
2626
PyObjectRef,PyRef,PyResult,PyValue,TryFromObject,
2727
};
28-
usecrate::slots::{AsBuffer,Comparable,Hashable,PyComparisonOp};
28+
usecrate::slots::{BufferProtocol,Comparable,Hashable,PyComparisonOp};
2929
usecrate::vm::VirtualMachine;
3030

31-
usecrate::obj::objmemory::{BufferOptions,BufferProtocol};
31+
usecrate::obj::objmemory::{Buffer,BufferOptions};
3232

3333
/// "bytes(iterable_of_ints) -> bytes\n\
3434
/// bytes(string, encoding[, errors]) -> bytes\n\
@@ -65,6 +65,15 @@ impl From<Vec<u8>> for PyBytes {
6565
}
6666
}
6767

68+
implFrom<PyBytesInner>forPyBytes{
69+
fnfrom(inner:PyBytesInner) ->Self{
70+
Self{
71+
inner,
72+
buffer_options:OnceCell::new(),
73+
}
74+
}
75+
}
76+
6877
implIntoPyObjectforVec<u8>{
6978
fninto_pyobject(self,vm:&VirtualMachine) ->PyObjectRef{
7079
vm.ctx.new_bytes(self)
@@ -94,7 +103,7 @@ pub(crate) fn init(context: &PyContext) {
94103
PyBytesIterator::extend_class(context,&context.types.bytes_iterator_type);
95104
}
96105

97-
#[pyimpl(flags(BASETYPE), with(Hashable,Comparable,AsBuffer))]
106+
#[pyimpl(flags(BASETYPE), with(Hashable,Comparable,BufferProtocol))]
98107
implPyBytes{
99108
#[pyslot]
100109
fntp_new(
@@ -465,13 +474,13 @@ impl PyBytes {
465474
}
466475
}
467476

468-
implAsBufferforPyBytes{
469-
fnget_buffer(zelf:PyRef<Self>,_vm:&VirtualMachine) ->PyResult<Box<dynBufferProtocol>>{
477+
implBufferProtocolforPyBytes{
478+
fnget_buffer(zelf:PyRef<Self>,_vm:&VirtualMachine) ->PyResult<Box<dynBuffer>>{
470479
Ok(Box::new(zelf))
471480
}
472481
}
473482

474-
implBufferProtocolforPyBytesRef{
483+
implBufferforPyBytesRef{
475484
fnobj_bytes(&self) ->BorrowedValue<[u8]>{
476485
self.inner.elements.as_slice().into()
477486
}
@@ -550,3 +559,9 @@ impl PyBytesIterator {
550559
zelf
551560
}
552561
}
562+
563+
implTryFromObjectforPyBytes{
564+
fntry_from_object(vm:&VirtualMachine,obj:PyObjectRef) ->PyResult<Self>{
565+
PyBytesInner::try_from_object(vm, obj).map(|x| x.into())
566+
}
567+
}

‎vm/src/obj/objint.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use super::objbool::IntoPyBool;
1111
usesuper::objbytearray::PyByteArray;
1212
usesuper::objbytes::PyBytes;
1313
usesuper::objfloat;
14-
usesuper::objmemory::PyMemoryView;
14+
usesuper::objmemory::try_buffer_from_object;
1515
usesuper::objstr::{PyStr,PyStrRef};
1616
usesuper::objtype::PyTypeRef;
1717
usecrate::bytesinner::PyBytesInner;
@@ -733,31 +733,31 @@ pub(crate) fn to_int(vm: &VirtualMachine, obj: &PyObjectRef) -> PyResult<BigInt>
733733
let inner = bytearray.borrow_value();
734734
bytes_to_int(&inner.elements, base)
735735
}
736-
memoryview @PyMemoryView =>{
737-
// TODO: proper error handling instead of `unwrap()`
738-
memoryview
739-
.try_bytes(|bytes| bytes_to_int(&bytes, base))
740-
.unwrap()
741-
}
742736
array @PyArray =>{
743-
let bytes = array.tobytes();
744-
bytes_to_int(&bytes, base)
737+
let bytes = array.get_bytes();
738+
bytes_to_int(&*bytes, base)
745739
}
746740
obj =>{
747-
let method = vm.get_method_or_type_error(obj.clone(),"__int__", ||{
748-
format!(
749-
"int() argument must be a string or a number, not '{}'",
750-
obj.class().name
751-
)
752-
})?;
753-
let result = vm.invoke(&method,PyFuncArgs::default())?;
754-
returnmatch result.payload::<PyInt>(){
755-
Some(int_obj) =>Ok(int_obj.borrow_value().clone()),
756-
None =>Err(vm.new_type_error(format!(
757-
"TypeError: __int__ returned non-int (type '{}')",
758-
result.class().name
759-
))),
760-
};
741+
ifletSome(method) = vm.get_method(obj.clone(),"__int__"){
742+
let result = vm.invoke(&method?,PyFuncArgs::default())?;
743+
returnmatch result.payload::<PyInt>(){
744+
Some(int_obj) =>Ok(int_obj.borrow_value().clone()),
745+
None =>Err(vm.new_type_error(format!(
746+
"TypeError: __int__ returned non-int (type '{}')",
747+
result.class().name
748+
))),
749+
};
750+
}
751+
752+
ifletOk(bytes) = try_buffer_from_object(obj.clone(), vm){
753+
let bytes = bytes.as_contiguous()
754+
.ok_or_else(|| vm.new_value_error(
755+
format!("int() argument must be a string, a bytes-like object or a number, not '{}'",
756+
obj.class().name)))?;
757+
bytes_to_int(&*bytes, base)
758+
} else{
759+
None
760+
}
761761
}
762762
});
763763
match opt{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp