@@ -13,13 +13,16 @@ use super::objslice::PySliceRef;
13
13
use super :: objstr:: PyStringRef ;
14
14
use super :: objtuple:: PyTupleRef ;
15
15
use super :: objtype:: PyClassRef ;
16
+ use crate :: cformat:: CFormatString ;
16
17
use crate :: function:: OptionalArg ;
18
+ use crate :: obj:: objstr:: do_cformat_string;
17
19
use crate :: pyobject:: {
18
20
Either , PyClassImpl , PyContext , PyIterable , PyObjectRef , PyRef , PyResult , PyValue ,
19
21
TryFromObject ,
20
22
} ;
21
23
use crate :: vm:: VirtualMachine ;
22
24
use std:: mem:: size_of;
25
+ use std:: str:: FromStr ;
23
26
24
27
/// "bytearray(iterable_of_ints) -> bytearray\n\
25
28
/// bytearray(string, encoding[, errors]) -> bytearray\n\
@@ -557,6 +560,31 @@ impl PyByteArrayRef {
557
560
self . inner . borrow_mut ( ) . irepeat ( n, vm)
558
561
}
559
562
563
+ fn do_cformat (
564
+ & self ,
565
+ vm : & VirtualMachine ,
566
+ format_string : CFormatString ,
567
+ values_obj : PyObjectRef ,
568
+ ) -> PyResult {
569
+ let final_string = do_cformat_string ( vm, format_string, values_obj) ?;
570
+ Ok ( vm
571
+ . ctx
572
+ . new_bytearray ( PyByteInner :: from_string ( final_string. as_str ( ) , "utf8" , vm) ?. elements ) )
573
+ }
574
+
575
+ #[ pymethod( name = "__mod__" ) ]
576
+ fn modulo ( self , values : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
577
+ let format_string =
578
+ CFormatString :: from_str ( std:: str:: from_utf8 ( & self . inner . borrow ( ) . elements ) . unwrap ( ) )
579
+ . map_err ( |err| vm. new_value_error ( err. to_string ( ) ) ) ?;
580
+ self . do_cformat ( vm, format_string, values. clone ( ) )
581
+ }
582
+
583
+ #[ pymethod( name = "__rmod__" ) ]
584
+ fn rmod ( self , _values : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
585
+ Ok ( vm. ctx . not_implemented ( ) )
586
+ }
587
+
560
588
#[ pymethod( name = "reverse" ) ]
561
589
fn reverse ( self , _vm : & VirtualMachine ) -> PyResult < ( ) > {
562
590
self . inner . borrow_mut ( ) . elements . reverse ( ) ;
0 commit comments