Skip to content

Commit 090cfed

Browse files
committed
Use importlib import in WASM
1 parent 6b018a0 commit 090cfed

File tree

4 files changed

+9
-32
lines changed

4 files changed

+9
-32
lines changed

src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn main() {
5151
// Construct vm:
5252
let vm = VirtualMachine::new();
5353

54-
let res = import::init_importlib(&vm);
54+
let res = import::init_importlib(&vm, true);
5555
handle_exception(&vm, res);
5656

5757
// Figure out if a -c option was given:

vm/src/import.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@ use crate::vm::VirtualMachine;
1313
#[cfg(feature = "rustpython-compiler")]
1414
use rustpython_compiler::compile;
1515

16-
pub fn init_importlib(vm: &VirtualMachine) -> PyResult {
16+
pub fn init_importlib(vm: &VirtualMachine, external: bool) -> PyResult {
1717
let importlib = import_frozen(vm, "_frozen_importlib")?;
1818
let impmod = import_builtin(vm, "_imp")?;
1919
let install = vm.get_attribute(importlib.clone(), "_install")?;
2020
vm.invoke(install, vec![vm.sys_module.clone(), impmod])?;
2121
vm.import_func
2222
.replace(vm.get_attribute(importlib.clone(), "__import__")?);
23-
let install_external = vm.get_attribute(importlib.clone(), "_install_external_importers")?;
24-
vm.invoke(install_external, vec![])?;
23+
if external {
24+
let install_external =
25+
vm.get_attribute(importlib.clone(), "_install_external_importers")?;
26+
vm.invoke(install_external, vec![])?;
27+
}
2528
Ok(vm.get_none())
2629
}
2730

wasm/lib/src/vm_class.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use wasm_bindgen::prelude::*;
88
use rustpython_compiler::{compile, error::CompileErrorType};
99
use rustpython_vm::frame::{NameProtocol, Scope};
1010
use rustpython_vm::function::PyFuncArgs;
11+
use rustpython_vm::import;
1112
use rustpython_vm::pyobject::{PyObject, PyObjectPayload, PyObjectRef, PyResult, PyValue};
1213
use rustpython_vm::VirtualMachine;
1314

@@ -43,7 +44,7 @@ impl StoredVirtualMachine {
4344
setup_browser_module(&vm);
4445
}
4546

46-
*vm.import_func.borrow_mut() = vm.ctx.new_rustfunc(wasm_builtins::builtin_import);
47+
import::init_importlib(&vm, false);
4748

4849
StoredVirtualMachine {
4950
vm,

wasm/lib/src/wasm_builtins.rs

-27
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use js_sys::{self, Array};
88
use web_sys::{self, console};
99

1010
use rustpython_vm::function::{Args, KwArgs, PyFuncArgs};
11-
use rustpython_vm::import;
1211
use rustpython_vm::obj::{
1312
objstr::{self, PyStringRef},
1413
objtype,
@@ -80,29 +79,3 @@ pub fn builtin_print_console(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
8079
console::log(&arr);
8180
Ok(vm.get_none())
8281
}
83-
84-
pub fn builtin_import(
85-
module_name: PyStringRef,
86-
_args: Args,
87-
_kwargs: KwArgs,
88-
vm: &VirtualMachine,
89-
) -> PyResult<PyObjectRef> {
90-
let module_name = module_name.as_str();
91-
92-
let sys_modules = vm.get_attribute(vm.sys_module.clone(), "modules").unwrap();
93-
94-
// First, see if we already loaded the module:
95-
if let Ok(module) = sys_modules.get_item(module_name.to_string(), vm) {
96-
Ok(module)
97-
} else if vm.frozen.borrow().contains_key(module_name) {
98-
import::import_frozen(vm, module_name)
99-
} else if vm.stdlib_inits.borrow().contains_key(module_name) {
100-
import::import_builtin(vm, module_name)
101-
} else {
102-
let notfound_error = vm.context().exceptions.module_not_found_error.clone();
103-
Err(vm.new_exception(
104-
notfound_error,
105-
format!("Module {:?} not found", module_name),
106-
))
107-
}
108-
}

0 commit comments

Comments
 (0)