@@ -11,6 +11,7 @@ use num_traits::{Signed, ToPrimitive};
11
11
use crate :: compile;
12
12
use crate :: import:: import_module;
13
13
use crate :: obj:: objbool;
14
+ use crate :: obj:: objdict:: PyDictRef ;
14
15
use crate :: obj:: objint;
15
16
use crate :: obj:: objiter;
16
17
use crate :: obj:: objstr:: { self , PyStringRef } ;
@@ -27,14 +28,6 @@ use crate::obj::objcode::PyCodeRef;
27
28
#[ cfg( not( target_arch = "wasm32" ) ) ]
28
29
use crate :: stdlib:: io:: io_open;
29
30
30
- fn get_locals ( vm : & VirtualMachine ) -> PyObjectRef {
31
- vm. get_locals ( )
32
- }
33
-
34
- fn dir_locals ( vm : & VirtualMachine ) -> PyObjectRef {
35
- get_locals ( vm)
36
- }
37
-
38
31
fn builtin_abs ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
39
32
arg_check ! ( vm, args, required = [ ( x, None ) ] ) ;
40
33
match vm. get_method ( x. clone ( ) , "__abs__" ) {
@@ -146,7 +139,7 @@ fn builtin_delattr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
146
139
147
140
fn builtin_dir ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
148
141
if args. args . is_empty ( ) {
149
- Ok ( dir_locals ( vm ) )
142
+ Ok ( vm . get_locals ( ) . into_object ( ) )
150
143
} else {
151
144
let obj = args. args . into_iter ( ) . next ( ) . unwrap ( ) ;
152
145
let seq = vm. call_method ( & obj, "__dir__" , vec ! [ ] ) ?;
@@ -254,11 +247,11 @@ fn make_scope(
254
247
255
248
let current_scope = vm. current_scope ( ) ;
256
249
let globals = match globals {
257
- Some ( dict) => dict. clone ( ) ,
250
+ Some ( dict) => dict. clone ( ) . downcast ( ) . unwrap ( ) ,
258
251
None => current_scope. globals . clone ( ) ,
259
252
} ;
260
253
let locals = match locals {
261
- Some ( dict) => Some ( dict. clone ( ) ) ,
254
+ Some ( dict) => dict. clone ( ) . downcast ( ) . ok ( ) ,
262
255
None => current_scope. get_only_locals ( ) ,
263
256
} ;
264
257
@@ -300,7 +293,7 @@ fn builtin_getattr(
300
293
}
301
294
}
302
295
303
- fn builtin_globals ( vm : & VirtualMachine , _args : PyFuncArgs ) -> PyResult {
296
+ fn builtin_globals ( vm : & VirtualMachine ) -> PyResult < PyDictRef > {
304
297
Ok ( vm. current_scope ( ) . globals . clone ( ) )
305
298
}
306
299
@@ -374,9 +367,8 @@ fn builtin_len(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
374
367
}
375
368
}
376
369
377
- fn builtin_locals ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
378
- arg_check ! ( vm, args) ;
379
- Ok ( vm. get_locals ( ) )
370
+ fn builtin_locals ( vm : & VirtualMachine ) -> PyDictRef {
371
+ vm. get_locals ( )
380
372
}
381
373
382
374
fn builtin_max ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
@@ -814,13 +806,15 @@ pub fn builtin_build_class_(vm: &VirtualMachine, mut args: PyFuncArgs) -> PyResu
814
806
let prepare = vm. get_attribute ( metaclass. clone ( ) . into_object ( ) , "__prepare__" ) ?;
815
807
let namespace = vm. invoke ( prepare, vec ! [ name_arg. clone( ) , bases. clone( ) ] ) ?;
816
808
809
+ let namespace: PyDictRef = TryFromObject :: try_from_object ( vm, namespace) ?;
810
+
817
811
let cells = vm. ctx . new_dict ( ) ;
818
812
819
- vm. invoke_with_locals ( function, cells. clone ( ) . into_object ( ) , namespace. clone ( ) ) ?;
813
+ vm. invoke_with_locals ( function, cells. clone ( ) , namespace. clone ( ) ) ?;
820
814
let class = vm. call_method (
821
815
metaclass. as_object ( ) ,
822
816
"__call__" ,
823
- vec ! [ name_arg, bases, namespace] ,
817
+ vec ! [ name_arg, bases, namespace. into_object ( ) ] ,
824
818
) ?;
825
819
cells. set_item ( & vm. ctx , "__class__" , class. clone ( ) ) ;
826
820
Ok ( class)
0 commit comments