From 6dbc8f0cfa1d0cd48b90d48c6f7768a030a091a8 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Dec 2025 10:33:22 +0900 Subject: [PATCH] Set SourceFileLoader for script execution in run_simple_file (#6496) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: youknowone <69878+youknowone@users.noreply.github.com> --- Lib/test/test_cmd_line_script.py | 2 -- crates/vm/src/vm/compile.rs | 12 +++++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 833dc6b15..d773674fe 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -225,8 +225,6 @@ class CmdLineTest(unittest.TestCase): def test_repl_stderr_flush_separate_stderr(self): self.check_repl_stderr_flush(True) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_basic_script(self): with os_helper.temp_dir() as script_dir: script_name = _make_test_script(script_dir, 'script') diff --git a/crates/vm/src/vm/compile.rs b/crates/vm/src/vm/compile.rs index 44332cda8..a7e31cf03 100644 --- a/crates/vm/src/vm/compile.rs +++ b/crates/vm/src/vm/compile.rs @@ -81,7 +81,7 @@ impl VirtualMachine { todo!("running pyc is not implemented yet"); } else { if path != "" { - // TODO: set_main_loader(dict, filename, "SourceFileLoader"); + set_main_loader(&module_dict, path, self)?; } // TODO: replace to something equivalent to py_run_file match std::fs::read_to_string(path) { @@ -125,6 +125,16 @@ impl VirtualMachine { } } +fn set_main_loader(module_dict: &PyDictRef, filename: &str, vm: &VirtualMachine) -> PyResult<()> { + vm.import("importlib.machinery", 0)?; + let sys_modules = vm.sys_module.get_attr(identifier!(vm, modules), vm)?; + let machinery = sys_modules.get_item("importlib.machinery", vm)?; + let loader_class = machinery.get_attr("SourceFileLoader", vm)?; + let loader = loader_class.call((identifier!(vm, __main__).to_owned(), filename), vm)?; + module_dict.set_item("__loader__", loader, vm)?; + Ok(()) +} + fn get_importer(path: &str, vm: &VirtualMachine) -> PyResult> { let path_importer_cache = vm.sys_module.get_attr("path_importer_cache", vm)?; let path_importer_cache = PyDictRef::try_from_object(vm, path_importer_cache)?;