@@ -11,17 +11,21 @@ use crate::pyobject::{ItemProtocol, PyResult};
11
11
use crate :: util;
12
12
use crate :: vm:: VirtualMachine ;
13
13
14
- fn import_uncached_module ( vm : & VirtualMachine , current_path : PathBuf , module : & str ) -> PyResult {
14
+ fn import_uncached_module (
15
+ vm : & VirtualMachine ,
16
+ current_path : PathBuf ,
17
+ module_name : & str ,
18
+ ) -> PyResult {
15
19
// Check for Rust-native modules
16
- if let Some ( module) = vm. stdlib_inits . borrow ( ) . get ( module ) {
20
+ if let Some ( module) = vm. stdlib_inits . borrow ( ) . get ( module_name ) {
17
21
return Ok ( module ( vm) . clone ( ) ) ;
18
22
}
19
23
20
24
let notfound_error = vm. context ( ) . exceptions . module_not_found_error . clone ( ) ;
21
25
let import_error = vm. context ( ) . exceptions . import_error . clone ( ) ;
22
26
23
27
// Time to search for module in any place:
24
- let file_path = find_source ( vm, current_path, module )
28
+ let file_path = find_source ( vm, current_path, module_name )
25
29
. map_err ( |e| vm. new_exception ( notfound_error. clone ( ) , e) ) ?;
26
30
let source = util:: read_file ( file_path. as_path ( ) )
27
31
. map_err ( |e| vm. new_exception ( import_error. clone ( ) , e. to_string ( ) ) ) ?;
@@ -35,19 +39,25 @@ fn import_uncached_module(vm: &VirtualMachine, current_path: PathBuf, module: &s
35
39
// trace!("Code object: {:?}", code_obj);
36
40
37
41
let attrs = vm. ctx . new_dict ( ) ;
38
- attrs. set_item ( "__name__" , vm. new_str ( module. to_string ( ) ) , vm) ?;
39
- vm. run_code_obj ( code_obj, Scope :: new ( None , attrs. clone ( ) ) ) ?;
40
- Ok ( vm. ctx . new_module ( module, attrs) )
42
+ attrs. set_item ( "__name__" , vm. new_str ( module_name. to_string ( ) ) , vm) ?;
43
+ let module = vm. ctx . new_module ( module_name, attrs. clone ( ) ) ;
44
+
45
+ // Store module in cache to prevent infinite loop with mutual importing libs:
46
+ let sys_modules = vm. get_attribute ( vm. sys_module . clone ( ) , "modules" ) . unwrap ( ) ;
47
+ sys_modules. set_item ( module_name, module. clone ( ) , vm) ?;
48
+
49
+ // Execute main code in module:
50
+ vm. run_code_obj ( code_obj, Scope :: new ( None , attrs) ) ?;
51
+ Ok ( module)
41
52
}
42
53
43
54
pub fn import_module ( vm : & VirtualMachine , current_path : PathBuf , module_name : & str ) -> PyResult {
44
55
// First, see if we already loaded the module:
45
- let sys_modules = vm. get_attribute ( vm. sys_module . clone ( ) , "modules" ) ? ;
56
+ let sys_modules = vm. get_attribute ( vm. sys_module . clone ( ) , "modules" ) . unwrap ( ) ;
46
57
if let Ok ( module) = sys_modules. get_item ( module_name. to_string ( ) , vm) {
47
58
return Ok ( module) ;
48
59
}
49
60
let module = import_uncached_module ( vm, current_path, module_name) ?;
50
- sys_modules. set_item ( module_name, module. clone ( ) , vm) ?;
51
61
Ok ( module)
52
62
}
53
63
0 commit comments