@@ -18,6 +18,8 @@ pub fn init(context: &PyContext) {
18
18
context. set_attr ( bytes_type, "__hash__" , context. new_rustfunc ( bytes_hash) ) ;
19
19
context. set_attr ( bytes_type, "__new__" , context. new_rustfunc ( bytes_new) ) ;
20
20
context. set_attr ( bytes_type, "__repr__" , context. new_rustfunc ( bytes_repr) ) ;
21
+ context. set_attr ( bytes_type, "__len__" , context. new_rustfunc ( bytes_len) ) ;
22
+
21
23
}
22
24
23
25
fn bytes_new ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
@@ -66,6 +68,18 @@ fn bytes_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
66
68
Ok ( vm. ctx . new_bool ( result) )
67
69
}
68
70
71
+ fn bytes_len ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
72
+ arg_check ! (
73
+ vm,
74
+ args,
75
+ required = [ ( a, Some ( vm. ctx. bytes_type( ) ) ) ]
76
+ ) ;
77
+
78
+ let byte_vec = get_value ( a) . to_vec ( ) ;
79
+ Ok ( vm. ctx . new_int ( byte_vec. len ( ) ) )
80
+ }
81
+
82
+
69
83
fn bytes_hash ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
70
84
arg_check ! ( vm, args, required = [ ( zelf, Some ( vm. ctx. bytes_type( ) ) ) ] ) ;
71
85
let data = get_value ( zelf) ;
@@ -87,8 +101,7 @@ pub fn get_value<'a>(obj: &'a PyObjectRef) -> impl Deref<Target = Vec<u8>> + 'a
87
101
88
102
fn bytes_repr ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
89
103
arg_check ! ( vm, args, required = [ ( obj, Some ( vm. ctx. bytes_type( ) ) ) ] ) ;
90
- let data = get_value ( obj) ;
91
- let data: Vec < String > = data. iter ( ) . map ( |b| format ! ( "\\ x{:02x}" , b) ) . collect ( ) ;
92
- let data = data. join ( "" ) ;
104
+ let value = get_value ( obj) ;
105
+ let data = String :: from_utf8 ( value. to_vec ( ) ) . unwrap ( ) ;
93
106
Ok ( vm. new_str ( format ! ( "b'{}'" , data) ) )
94
107
}
0 commit comments