Skip to content

Commit a5b6f28

Browse files
committed
Cache imported modules in sys.modules
1 parent 803a823 commit a5b6f28

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

vm/src/import.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,7 @@ use super::compile;
1313
use super::pyobject::{DictProtocol, PyObjectKind, PyResult};
1414
use super::vm::VirtualMachine;
1515

16-
fn import_module(vm: &mut VirtualMachine, module: &String) -> PyResult {
17-
// First, see if we already loaded the module:
18-
let sys_modules = vm.sys_module.get_item("modules").unwrap();
19-
if let Some(module) = sys_modules.get_item(module) {
20-
return Ok(module);
21-
}
22-
16+
fn import_uncached_module(vm: &mut VirtualMachine, module: &String) -> PyResult {
2317
// Check for Rust-native modules
2418
if let Some(module) = vm.stdlib_inits.get(module) {
2519
return Ok(module(&vm.ctx).clone());
@@ -56,8 +50,18 @@ fn import_module(vm: &mut VirtualMachine, module: &String) -> PyResult {
5650
Ok(_) => {}
5751
Err(value) => return Err(value),
5852
}
59-
let py_module = vm.ctx.new_module(module, scope);
60-
Ok(py_module)
53+
Ok(vm.ctx.new_module(module, scope))
54+
}
55+
56+
fn import_module(vm: &mut VirtualMachine, module_name: &String) -> PyResult {
57+
// First, see if we already loaded the module:
58+
let sys_modules = vm.sys_module.get_item("modules").unwrap();
59+
if let Some(module) = sys_modules.get_item(module_name) {
60+
return Ok(module);
61+
}
62+
let module = import_uncached_module(vm, module_name)?;
63+
sys_modules.set_item(module_name, module.clone());
64+
Ok(module)
6165
}
6266

6367
pub fn import(vm: &mut VirtualMachine, module_name: &String, symbol: &Option<String>) -> PyResult {

0 commit comments

Comments
 (0)