diff --git a/wasm/lib/src/vm_class.rs b/wasm/lib/src/vm_class.rs index 0c62bb32e7e..a0d31b28fa3 100644 --- a/wasm/lib/src/vm_class.rs +++ b/wasm/lib/src/vm_class.rs @@ -16,6 +16,8 @@ use std::{ rc::{Rc, Weak}, }; use wasm_bindgen::prelude::*; +use std::borrow::Cow; +use rustpython_vm::stdlib; pub(crate) struct StoredVirtualMachine { pub interp: Interpreter, @@ -39,6 +41,44 @@ fn init_window_module(vm: &VirtualMachine) -> PyRef { } impl StoredVirtualMachine { + fn new_with_args(id: String, inject_browser_module: bool, iter: I) -> StoredVirtualMachine where + I: IntoIterator, stdlib::StdlibInitFunc)> { + let mut scope = None; + let mut settings = Settings::default(); + settings.allow_external_library = false; + let interp = Interpreter::with_init(settings, |vm| { + #[cfg(feature = "freeze-stdlib")] + vm.add_native_modules(rustpython_stdlib::get_module_inits()); + + vm.add_native_modules(iter); + + #[cfg(feature = "freeze-stdlib")] + vm.add_frozen(rustpython_pylib::FROZEN_STDLIB); + + vm.wasm_id = Some(id); + + js_module::setup_js_module(vm); + if inject_browser_module { + vm.add_native_module("_window".to_owned(), Box::new(init_window_module)); + setup_browser_module(vm); + } + + VM_INIT_FUNCS.with(|cell| { + for f in cell.borrow().iter() { + f(vm) + } + }); + + scope = Some(vm.new_scope_with_builtins()); + }); + + StoredVirtualMachine { + interp, + scope: scope.unwrap(), + held_objects: RefCell::new(Vec::new()), + } + } + fn new(id: String, inject_browser_module: bool) -> StoredVirtualMachine { let mut scope = None; let mut settings = Settings::default(); @@ -111,8 +151,21 @@ pub(crate) fn weak_vm(vm: &VirtualMachine) -> Weak { #[wasm_bindgen(js_name = vmStore)] pub struct VMStore; -#[wasm_bindgen(js_class = vmStore)] +//#[wasm_bindgen(js_class = vmStore)] impl VMStore { + pub fn init_with_args(id: String, inject_browser_module: Option, iter: I) -> WASMVirtualMachine where + I: IntoIterator, stdlib::StdlibInitFunc)>{ + STORED_VMS.with(|cell| { + let mut vms = cell.borrow_mut(); + if !vms.contains_key(&id) { + let stored_vm = + StoredVirtualMachine::new_with_args(id.clone(), inject_browser_module.unwrap_or(true), iter); + vms.insert(id.clone(), Rc::new(stored_vm)); + } + }); + WASMVirtualMachine { id } + } + pub fn init(id: String, inject_browser_module: Option) -> WASMVirtualMachine { STORED_VMS.with(|cell| { let mut vms = cell.borrow_mut();