Skip to content

Commit 6c72e69

Browse files
committed
bytesinner from pytuple
1 parent d560d4b commit 6c72e69

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
def test_setitem_writable(self):
7577
if not self.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 = ValueError if m.format == 'c' else TypeError
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
assert a.obj == obj
88

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

1111
assert hash(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-
use crate::anystr::{self, AnyStr, AnyStrContainer, AnyStrWrapper};
76
use crate::byteslike::try_bytes_like;
87
use crate::function::{OptionalArg, OptionalOption};
98
use crate::obj::objbytearray::PyByteArray;
@@ -23,6 +22,10 @@ use crate::pyobject::{
2322
};
2423
use crate::slots::PyComparisonOp;
2524
use crate::vm::VirtualMachine;
25+
use crate::{
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) fn to_byte_inner(&self, vm: &VirtualMachine) -> PyResult<bytesinner::PyBytesInner> {
7879
let mut elements = Vec::<u8>::with_capacity(self.borrow_value().len());
7980
for elem in self.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-
use super::objiter;
55
use super::objsequence::get_item;
66
use super::objtype::PyTypeRef;
7-
use crate::function::OptionalArg;
7+
use super::{objint::PyIntRef, objiter};
88
use crate::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
use crate::sequence::{self, SimpleSeq};
1314
use crate::slots::{Comparable, Hashable, PyComparisonOp};
1415
use crate::vm::{ReprGuard, VirtualMachine};
16+
use crate::{bytesinner::PyBytesInner, function::OptionalArg};
1517
use rustpython_common::hash::PyHash;
1618

1719
/// tuple() -> empty tuple
@@ -66,6 +68,25 @@ impl PyTuple {
6668
pub(crate) fn fast_getitem(&self, idx: usize) -> PyObjectRef {
6769
self.elements[idx].clone()
6870
}
71+
72+
// TODO: more generic way to do so
73+
pub(crate) fn to_bytes_inner(&self, vm: &VirtualMachine) -> PyResult<PyBytesInner> {
74+
let mut elements = Vec::<u8>::with_capacity(self.borrow_value().len());
75+
for elem in self.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
pub type PyTupleRef = PyRef<PyTuple>;

0 commit comments

Comments
 (0)