@@ -121,6 +121,15 @@ mod builtins {
121
121
122
122
let mode_str = args. mode . as_str ( ) ;
123
123
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
+
124
133
if args
125
134
. source
126
135
. fast_isinstance ( & ast:: NodeAst :: make_class ( & vm. ctx ) )
@@ -134,7 +143,13 @@ mod builtins {
134
143
let mode = mode_str
135
144
. parse :: < crate :: compiler:: Mode > ( )
136
145
. 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
+ ) ;
138
153
}
139
154
}
140
155
@@ -146,20 +161,23 @@ mod builtins {
146
161
}
147
162
#[ cfg( feature = "rustpython-parser" ) ]
148
163
{
149
- use crate :: { builtins :: PyBytesRef , convert:: ToPyException } ;
164
+ use crate :: convert:: ToPyException ;
150
165
use num_traits:: Zero ;
151
166
use rustpython_parser as parser;
152
167
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
+
154
171
// 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 ( ) ) ) ?;
160
174
161
175
let flags = args. flags . map_or ( Ok ( 0 ) , |v| v. try_to_primitive ( vm) ) ?;
162
176
177
+ if !( flags & !ast:: PY_COMPILE_FLAGS_MASK ) . is_zero ( ) {
178
+ return Err ( vm. new_value_error ( "compile() unrecognized flags" . to_owned ( ) ) ) ;
179
+ }
180
+
163
181
if ( flags & ast:: PY_COMPILE_FLAG_AST_ONLY ) . is_zero ( ) {
164
182
#[ cfg( not( feature = "rustpython-compiler" ) ) ]
165
183
{
@@ -170,8 +188,17 @@ mod builtins {
170
188
let mode = mode_str
171
189
. parse :: < crate :: compiler:: Mode > ( )
172
190
. map_err ( |err| vm. new_value_error ( err. to_string ( ) ) ) ?;
191
+
192
+ let mut opts = vm. compile_opts ( ) ;
193
+ opts. optimize = optimize;
194
+
173
195
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
+ )
175
202
. map_err ( |err| ( err, Some ( source) ) . to_pyexception ( vm) ) ?;
176
203
Ok ( code. into ( ) )
177
204
}
0 commit comments