Skip to content

Commit 8a14abc

Browse files
committed
Initialize hardcore modules and importlib
Initialize hardcore modules and importlib after vm created and stdlib_inits setup
1 parent 241d3c5 commit 8a14abc

4 files changed

Lines changed: 27 additions & 22 deletions

File tree

src/main.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ extern crate log;
77
use clap::{App, AppSettings, Arg, ArgMatches};
88
use rustpython_compiler::compile;
99
use rustpython_vm::{
10-
import, match_class,
10+
match_class,
1111
obj::{objint::PyInt, objtuple::PyTuple, objtype},
1212
print_exception,
1313
pyobject::{ItemProtocol, PyResult},
@@ -30,8 +30,9 @@ fn main() {
3030
let app = App::new("RustPython");
3131
let matches = parse_arguments(app);
3232
let settings = create_settings(&matches);
33-
let vm = VirtualMachine::new(settings);
33+
let mut uninitialized_vm = VirtualMachine::new(settings);
3434

35+
let vm = uninitialized_vm.initialize(true);
3536
let res = run_rustpython(&vm, &matches);
3637

3738
#[cfg(feature = "flame-it")]
@@ -324,9 +325,6 @@ fn write_profile(matches: &ArgMatches) -> Result<(), Box<dyn std::error::Error>>
324325
}
325326

326327
fn run_rustpython(vm: &VirtualMachine, matches: &ArgMatches) -> PyResult<()> {
327-
// We only include the standard library bytecode in WASI
328-
import::init_importlib(&vm, cfg!(not(target_os = "wasi")))?;
329-
330328
if let Some(paths) = option_env!("BUILDTIME_RUSTPYTHONPATH") {
331329
let sys_path = vm.get_attribute(vm.sys_module.clone(), "path")?;
332330
for (i, path) in std::env::split_paths(paths).enumerate() {
@@ -446,7 +444,8 @@ fn run_script(vm: &VirtualMachine, scope: Scope, script_file: &str) -> PyResult<
446444

447445
#[test]
448446
fn test_run_script() {
449-
let vm: VirtualMachine = Default::default();
447+
let mut uninitialized_vm: VirtualMachine = Default::default();
448+
let vm = uninitialized_vm.initialize(true);
450449

451450
// test file run
452451
let r = run_script(

vm/src/eval.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ mod tests {
2222
#[test]
2323
fn test_print_42() {
2424
let source = String::from("print('Hello world')");
25-
let vm = VirtualMachine::default();
25+
let mut uninitialized_vm = VirtualMachine::default();
26+
let vm = uninitialized_vm.initialize(true);
27+
2628
let vars = vm.new_scope_with_builtins();
2729
let result = eval(&vm, &source, vars, "<unittest>").expect("this should pass");
2830
assert!(result.is(&vm.ctx.none()));

vm/src/vm.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ impl Default for PySettings {
147147
impl VirtualMachine {
148148
/// Create a new `VirtualMachine` structure.
149149
pub fn new(settings: PySettings) -> VirtualMachine {
150-
flame_guard!("init VirtualMachine");
150+
flame_guard!("new VirtualMachine");
151151
let ctx = PyContext::new();
152152

153153
// make a new module without access to the vm; doesn't
@@ -200,19 +200,27 @@ impl VirtualMachine {
200200
vm.get_none(),
201201
);
202202

203-
builtins::make_module(&vm, builtins.clone());
204-
sysmodule::make_module(&vm, sysmod, builtins);
205-
206-
#[cfg(not(target_arch = "wasm32"))]
207-
import::import_builtin(&vm, "signal").expect("Couldn't initialize signal module");
208-
209203
vm
210204
}
211205

212-
/// `update_sysmodule` should be called when the `vm.stdlib_inits` are changed,
213-
/// and then the `builtin_module_names` of `sys` module will be updated.
214-
pub fn update_sysmodule(&self) {
206+
pub fn initialize(&mut self, external: bool) -> &Self {
207+
flame_guard!("init VirtualMachine");
208+
209+
builtins::make_module(self, self.builtins.clone());
215210
sysmodule::make_module(self, self.sys_module.clone(), self.builtins.clone());
211+
212+
#[cfg(not(target_arch = "wasm32"))]
213+
import::import_builtin(self, "signal").expect("Couldn't initialize signal module");
214+
215+
if external {
216+
// We only include the standard library bytecode in WASI
217+
import::init_importlib(self, cfg!(not(target_os = "wasi")))
218+
.expect("Couldn't initialize importlib");
219+
} else {
220+
import::init_importlib(self, false).expect("Couldn't initialize importlib");
221+
}
222+
223+
self
216224
}
217225

218226
pub fn run_code_obj(&self, code: PyCodeRef, scope: Scope) -> PyResult {

wasm/lib/src/vm_class.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use wasm_bindgen::prelude::*;
77

88
use rustpython_compiler::compile;
99
use rustpython_vm::function::PyFuncArgs;
10-
use rustpython_vm::import;
1110
use rustpython_vm::pyobject::{PyObject, PyObjectPayload, PyObjectRef, PyResult, PyValue};
1211
use rustpython_vm::scope::{NameProtocol, Scope};
1312
use rustpython_vm::VirtualMachine;
@@ -44,10 +43,7 @@ impl StoredVirtualMachine {
4443
setup_browser_module(&vm);
4544
}
4645

47-
// sys module needs to be updated because js_module and browser_module is setted
48-
vm.update_sysmodule();
49-
50-
import::init_importlib(&vm, false).unwrap();
46+
vm.initialize(false);
5147

5248
StoredVirtualMachine {
5349
vm,

0 commit comments

Comments
 (0)