Initialize hardcore modules and importlib

Initialize hardcore modules and importlib after vm created and
stdlib_inits setup
This commit is contained in:
yanganto committed 2019-12-05 10:13:41 +08:00
1 parent 241d3c5370
commit 8a14abc445
4 files changed
+27 -22

No files matched your search

+5 -6
View File
@@ -7,7 +7,7 @@ extern crate log;
use clap::{App, AppSettings, Arg, ArgMatches};
use rustpython_compiler::compile;
use rustpython_vm::{
import, match_class,
match_class,
obj::{objint::PyInt, objtuple::PyTuple, objtype},
print_exception,
pyobject::{ItemProtocol, PyResult},
@@ -30,8 +30,9 @@ fn main() {
let app = App::new("RustPython");
let matches = parse_arguments(app);
let settings = create_settings(&matches);
let vm = VirtualMachine::new(settings);
let mut uninitialized_vm = VirtualMachine::new(settings);
let vm = uninitialized_vm.initialize(true);
let res = run_rustpython(&vm, &matches);
#[cfg(feature = "flame-it")]
@@ -324,9 +325,6 @@ fn write_profile(matches: &ArgMatches) -> Result<(), Box<dyn std::error::Error>>
}
fn run_rustpython(vm: &VirtualMachine, matches: &ArgMatches) -> PyResult<()> {
// We only include the standard library bytecode in WASI
import::init_importlib(&vm, cfg!(not(target_os = "wasi")))?;
if let Some(paths) = option_env!("BUILDTIME_RUSTPYTHONPATH") {
let sys_path = vm.get_attribute(vm.sys_module.clone(), "path")?;
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<
#[test]
fn test_run_script() {
let vm: VirtualMachine = Default::default();
let mut uninitialized_vm: VirtualMachine = Default::default();
let vm = uninitialized_vm.initialize(true);
// test file run
let r = run_script(
+3 -1
View File
@@ -22,7 +22,9 @@ mod tests {
#[test]
fn test_print_42() {
let source = String::from("print('Hello world')");
let vm = VirtualMachine::default();
let mut uninitialized_vm = VirtualMachine::default();
let vm = uninitialized_vm.initialize(true);
let vars = vm.new_scope_with_builtins();
let result = eval(&vm, &source, vars, "<unittest>").expect("this should pass");
assert!(result.is(&vm.ctx.none()));
+18 -10
View File
@@ -147,7 +147,7 @@ impl Default for PySettings {
impl VirtualMachine {
/// Create a new `VirtualMachine` structure.
pub fn new(settings: PySettings) -> VirtualMachine {
flame_guard!("init VirtualMachine");
flame_guard!("new VirtualMachine");
let ctx = PyContext::new();
// make a new module without access to the vm; doesn't
@@ -200,19 +200,27 @@ impl VirtualMachine {
vm.get_none(),
);
builtins::make_module(&vm, builtins.clone());
sysmodule::make_module(&vm, sysmod, builtins);
#[cfg(not(target_arch = "wasm32"))]
import::import_builtin(&vm, "signal").expect("Couldn't initialize signal module");
vm
}
/// `update_sysmodule` should be called when the `vm.stdlib_inits` are changed,
/// and then the `builtin_module_names` of `sys` module will be updated.
pub fn update_sysmodule(&self) {
pub fn initialize(&mut self, external: bool) -> &Self {
flame_guard!("init VirtualMachine");
builtins::make_module(self, self.builtins.clone());
sysmodule::make_module(self, self.sys_module.clone(), self.builtins.clone());
#[cfg(not(target_arch = "wasm32"))]
import::import_builtin(self, "signal").expect("Couldn't initialize signal module");
if external {
// We only include the standard library bytecode in WASI
import::init_importlib(self, cfg!(not(target_os = "wasi")))
.expect("Couldn't initialize importlib");
} else {
import::init_importlib(self, false).expect("Couldn't initialize importlib");
}
self
}
pub fn run_code_obj(&self, code: PyCodeRef, scope: Scope) -> PyResult {
+1 -5
View File
@@ -7,7 +7,6 @@ use wasm_bindgen::prelude::*;
use rustpython_compiler::compile;
use rustpython_vm::function::PyFuncArgs;
use rustpython_vm::import;
use rustpython_vm::pyobject::{PyObject, PyObjectPayload, PyObjectRef, PyResult, PyValue};
use rustpython_vm::scope::{NameProtocol, Scope};
use rustpython_vm::VirtualMachine;
@@ -44,10 +43,7 @@ impl StoredVirtualMachine {
setup_browser_module(&vm);
}
// sys module needs to be updated because js_module and browser_module is setted
vm.update_sysmodule();
import::init_importlib(&vm, false).unwrap();
vm.initialize(false);
StoredVirtualMachine {
vm,