mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-29 03:04:38 +08:00
Initialize hardcore modules and importlib
Initialize hardcore modules and importlib after vm created and stdlib_inits setup
This commit is contained in:
1 parent
241d3c5370
commit
8a14abc445
4 files changed
+27
-22
No files matched your search
+5
-6
@@ -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
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user