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

Commit6c72e69

Browse files
committed
bytesinner from pytuple
1 parentd560d4b commit6c72e69

File tree

5 files changed

+37
-11
lines changed

5 files changed

+37
-11
lines changed

‎Lib/test/test_memoryview.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ def setitem(value):
7171
m=None
7272
self.assertEqual(sys.getrefcount(b),oldrefcount)
7373

74+
# TODO: RUSTPYTHON
75+
@unittest.expectedFailure
7476
deftest_setitem_writable(self):
7577
ifnotself.rw_type:
7678
self.skipTest("no writable type to test")
@@ -112,13 +114,11 @@ def setitem(key, value):
112114
self.assertRaises(TypeError,setitem,"a",b"a")
113115
# Not implemented: multidimensional slices
114116
slices= (slice(0,1,1),slice(0,1,2))
115-
# TODO: RUSTPYTHON
116-
# self.assertRaises(NotImplementedError, setitem, slices, b"a")
117+
self.assertRaises(NotImplementedError,setitem,slices,b"a")
117118
# Trying to resize the memory object
118119
exc=ValueErrorifm.format=='c'elseTypeError
119-
# TODO: RUSTPYTHON
120-
# self.assertRaises(exc, setitem, 0, b"")
121-
# self.assertRaises(exc, setitem, 0, b"ab")
120+
self.assertRaises(exc,setitem,0,b"")
121+
self.assertRaises(exc,setitem,0,b"ab")
122122
self.assertRaises(ValueError,setitem,slice(1,1),b"a")
123123
self.assertRaises(ValueError,setitem,slice(0,2),b"a")
124124

‎extra_tests/snippets/memoryview.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
a=memoryview(obj)
77
asserta.obj==obj
88

9-
#assert a[2:3] == b"c"
9+
asserta[2:3]==b"c"
1010

1111
asserthash(obj)==hash(a)
1212

‎vm/src/bytesinner.rs

Lines changed: 6 additions & 2 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;
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::objtuple::PyTuple,
28+
};
2629
use rustpython_common::hash;
2730

2831
#[derive(Debug,Default,Clone)]
@@ -43,8 +46,9 @@ impl TryFromObject for PyBytesInner {
4346
}
4447

4548
match_class!(match obj{
49+
// TODO: generic way from &[PyObjectRef]
4650
l @PyList => l.to_byte_inner(vm),
47-
// TODO: PyTyple
51+
t @PyTuple => t.to_bytes_inner(vm),
4852
obj =>{
4953
let iter = vm.get_method_or_type_error(obj.clone(),"__iter__", ||{
5054
format!("a bytes-like object is required, not {}", obj.class())

‎vm/src/obj/objlist.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ impl PyList {
7474
self.elements.write()
7575
}
7676

77+
// TODO: more generic way to do so
7778
pub(crate)fnto_byte_inner(&self,vm:&VirtualMachine) ->PyResult<bytesinner::PyBytesInner>{
7879
letmut elements =Vec::<u8>::with_capacity(self.borrow_value().len());
7980
for eleminself.borrow_value().iter(){

‎vm/src/obj/objtuple.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
use crossbeam_utils::atomic::AtomicCell;
2+
use num_traits::ToPrimitive;
23
use std::fmt;
34

4-
usesuper::objiter;
55
usesuper::objsequence::get_item;
66
usesuper::objtype::PyTypeRef;
7-
usecrate::function::OptionalArg;
7+
usesuper::{objint::PyIntRef, objiter};
88
usecrate::pyobject::{
99
self,BorrowValue,Either,IdProtocol,IntoPyObject,PyArithmaticValue,PyClassImpl,
10-
PyComparisonValue,PyContext,PyObjectRef,PyRef,PyResult,PyValue,TypeProtocol,
10+
PyComparisonValue,PyContext,PyObjectRef,PyRef,PyResult,PyValue,TryFromObject,
11+
TypeProtocol,
1112
};
1213
usecrate::sequence::{self,SimpleSeq};
1314
usecrate::slots::{Comparable,Hashable,PyComparisonOp};
1415
usecrate::vm::{ReprGuard,VirtualMachine};
16+
usecrate::{bytesinner::PyBytesInner, function::OptionalArg};
1517
use rustpython_common::hash::PyHash;
1618

1719
/// tuple() -> empty tuple
@@ -66,6 +68,25 @@ impl PyTuple {
6668
pub(crate)fnfast_getitem(&self,idx:usize) ->PyObjectRef{
6769
self.elements[idx].clone()
6870
}
71+
72+
// TODO: more generic way to do so
73+
pub(crate)fnto_bytes_inner(&self,vm:&VirtualMachine) ->PyResult<PyBytesInner>{
74+
letmut elements =Vec::<u8>::with_capacity(self.borrow_value().len());
75+
for eleminself.borrow_value().iter(){
76+
let py_int =PyIntRef::try_from_object(vm, elem.clone()).map_err(|_|{
77+
vm.new_type_error(format!(
78+
"'{}' object cannot be interpreted as an integer",
79+
elem.class().name
80+
))
81+
})?;
82+
let result = py_int
83+
.borrow_value()
84+
.to_u8()
85+
.ok_or_else(|| vm.new_value_error("bytes must be in range (0, 256)".to_owned()))?;
86+
elements.push(result);
87+
}
88+
Ok(elements.into())
89+
}
6990
}
7091

7192
pubtypePyTupleRef =PyRef<PyTuple>;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp