@@ -121,6 +121,15 @@ mod builtins {
121121
122122 let mode_str = args. mode . as_str ( ) ;
123123
124+ let optimize: i32 = args. optimize . map_or ( Ok ( -1 ) , |v| v. try_to_primitive ( vm) ) ?;
125+ let optimize: u8 = if optimize == -1 {
126+ vm. state . settings . optimize
127+ } else {
128+ optimize. try_into ( ) . map_err ( |_| {
129+ vm. new_value_error ( "compile() optimize value invalid" . to_owned ( ) )
130+ } ) ?
131+ } ;
132+
124133 if args
125134 . source
126135 . fast_isinstance ( & ast:: NodeAst :: make_class ( & vm. ctx ) )
@@ -134,7 +143,13 @@ mod builtins {
134143 let mode = mode_str
135144 . parse :: < crate :: compiler:: Mode > ( )
136145 .map_err ( |err| vm. new_value_error ( err. to_string ( ) ) ) ?;
137- return ast:: compile ( vm, args. source , args. filename . as_str ( ) , mode) ;
146+ return ast:: compile (
147+ vm,
148+ args. source ,
149+ args. filename . as_str ( ) ,
150+ mode,
151+ Some ( optimize) ,
152+ ) ;
138153 }
139154 }
140155
@@ -146,20 +161,23 @@ mod builtins {
146161 }
147162 #[ cfg( feature = "rustpython-parser" ) ]
148163 {
149- use crate :: { builtins :: PyBytesRef , convert:: ToPyException } ;
164+ use crate :: convert:: ToPyException ;
150165 use num_traits:: Zero ;
151166 use rustpython_parser as parser;
152167
153- let source = Either :: < PyStrRef , PyBytesRef > :: try_from_object ( vm, args. source ) ?;
168+ let source = ArgStrOrBytesLike :: try_from_object ( vm, args. source ) ?;
169+ let source = source. borrow_bytes ( ) ;
170+
154171 // TODO: compiler::compile should probably get bytes
155- let source = match & source {
156- Either :: A ( string) => string. as_str ( ) ,
157- Either :: B ( bytes) => std:: str:: from_utf8 ( bytes)
158- . map_err ( |e| vm. new_unicode_decode_error ( e. to_string ( ) ) ) ?,
159- } ;
172+ let source = std:: str:: from_utf8 ( & source)
173+ . map_err ( |e| vm. new_unicode_decode_error ( e. to_string ( ) ) ) ?;
160174
161175 let flags = args. flags . map_or ( Ok ( 0 ) , |v| v. try_to_primitive ( vm) ) ?;
162176
177+ if !( flags & !ast:: PY_COMPILE_FLAGS_MASK ) . is_zero ( ) {
178+ return Err ( vm. new_value_error ( "compile() unrecognized flags" . to_owned ( ) ) ) ;
179+ }
180+
163181 if ( flags & ast:: PY_COMPILE_FLAG_AST_ONLY ) . is_zero ( ) {
164182 #[ cfg( not( feature = "rustpython-compiler" ) ) ]
165183 {
@@ -170,8 +188,17 @@ mod builtins {
170188 let mode = mode_str
171189 . parse :: < crate :: compiler:: Mode > ( )
172190 . map_err ( |err| vm. new_value_error ( err. to_string ( ) ) ) ?;
191+
192+ let mut opts = vm. compile_opts ( ) ;
193+ opts. optimize = optimize;
194+
173195 let code = vm
174- . compile ( source, mode, args. filename . as_str ( ) . to_owned ( ) )
196+ . compile_with_opts (
197+ source,
198+ mode,
199+ args. filename . as_str ( ) . to_owned ( ) ,
200+ opts,
201+ )
175202 . map_err ( |err| ( err, Some ( source) ) . to_pyexception ( vm) ) ?;
176203 Ok ( code. into ( ) )
177204 }
0 commit comments