@@ -9,12 +9,13 @@ use num_traits::{One, Signed, ToPrimitive, Zero};
99use crate :: function:: OptionalArg ;
1010use crate :: pyobject:: {
1111 IdProtocol , PyClassImpl , PyContext , PyIterable , PyObjectRef , PyRef , PyResult , PyValue ,
12- TryFromObject ,
12+ TryFromObject , TypeProtocol ,
1313} ;
1414use crate :: vm:: { ReprGuard , VirtualMachine } ;
1515
1616use super :: objbool;
17- //use super::objint;
17+ use super :: objbyteinner;
18+ use super :: objint:: PyIntRef ;
1819use super :: objiter;
1920use super :: objsequence:: {
2021 get_elements_list, get_item, seq_equal, seq_ge, seq_gt, seq_le, seq_lt, seq_mul, SequenceIndex ,
@@ -96,6 +97,29 @@ impl PyList {
9697
9798 start..stop
9899 }
100+
101+ pub fn get_byte_inner ( & self , vm : & VirtualMachine ) -> PyResult < objbyteinner:: PyByteInner > {
102+ let mut elements = Vec :: < u8 > :: with_capacity ( self . get_len ( ) ) ;
103+ for elem in self . elements . borrow ( ) . iter ( ) {
104+ match PyIntRef :: try_from_object ( vm, elem. clone ( ) ) {
105+ Ok ( result) => match result. as_bigint ( ) . to_u8 ( ) {
106+ Some ( result) => elements. push ( result) ,
107+ None => {
108+ return Err (
109+ vm. new_value_error ( "bytes must be in range (0, 256)" . to_string ( ) )
110+ )
111+ }
112+ } ,
113+ _ => {
114+ return Err ( vm. new_type_error ( format ! (
115+ "'{}' object cannot be interpreted as an integer" ,
116+ elem. class( ) . name
117+ ) ) )
118+ }
119+ }
120+ }
121+ Ok ( objbyteinner:: PyByteInner { elements } )
122+ }
99123}
100124
101125#[ derive( FromArgs ) ]
0 commit comments