Skip to content

Commit d14f796

Browse files
committed
Raise error if sys.module value is None
1 parent c9584f5 commit d14f796

File tree

4 files changed

+39
-9
lines changed

4 files changed

+39
-9
lines changed

vm/src/frame.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ impl ExecutingFrame<'_> {
780780
// Load attribute, and transform any error into import error.
781781
let obj = vm
782782
.get_attribute(module, name)
783-
.map_err(|_| vm.new_import_error(format!("cannot import name '{}'", name)))?;
783+
.map_err(|_| vm.new_import_error(format!("cannot import name '{}'", name), name))?;
784784
self.push_value(obj);
785785
Ok(None)
786786
}

vm/src/import.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,25 @@ pub fn import_frozen(vm: &VirtualMachine, module_name: &str) -> PyResult {
6060
vm.state
6161
.frozen
6262
.get(module_name)
63-
.ok_or_else(|| vm.new_import_error(format!("Cannot import frozen module {}", module_name)))
63+
.ok_or_else(|| {
64+
vm.new_import_error(
65+
format!("Cannot import frozen module {}", module_name),
66+
module_name,
67+
)
68+
})
6469
.and_then(|frozen| import_codeobj(vm, module_name, frozen.code.clone(), false))
6570
}
6671

6772
pub fn import_builtin(vm: &VirtualMachine, module_name: &str) -> PyResult {
6873
vm.state
6974
.stdlib_inits
7075
.get(module_name)
71-
.ok_or_else(|| vm.new_import_error(format!("Cannot import bultin module {}", module_name)))
76+
.ok_or_else(|| {
77+
vm.new_import_error(
78+
format!("Cannot import bultin module {}", module_name),
79+
module_name,
80+
)
81+
})
7282
.and_then(|make_module_func| {
7383
let module = make_module_func(vm);
7484
let sys_modules = vm.get_attribute(vm.sys_module.clone(), "modules")?;

vm/src/stdlib/imp.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ fn imp_get_frozen_object(name: PyStringRef, vm: &VirtualMachine) -> PyResult<PyC
6262
PyCode::new(frozen)
6363
})
6464
.ok_or_else(|| {
65-
vm.new_import_error(format!("No such frozen object named {}", name.as_str()))
65+
vm.new_import_error(
66+
format!("No such frozen object named {}", name.as_str()),
67+
name.as_str(),
68+
)
6669
})
6770
}
6871

@@ -76,7 +79,10 @@ fn imp_is_frozen_package(name: PyStringRef, vm: &VirtualMachine) -> PyResult<boo
7679
.get(name.as_str())
7780
.map(|frozen| frozen.package)
7881
.ok_or_else(|| {
79-
vm.new_import_error(format!("No such frozen object named {}", name.as_str()))
82+
vm.new_import_error(
83+
format!("No such frozen object named {}", name.as_str()),
84+
name.as_str(),
85+
)
8086
})
8187
}
8288

vm/src/vm.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -556,9 +556,12 @@ impl VirtualMachine {
556556
syntax_error
557557
}
558558

559-
pub fn new_import_error(&self, msg: String) -> PyBaseExceptionRef {
559+
pub fn new_import_error(&self, msg: String, name: &str) -> PyBaseExceptionRef {
560560
let import_error = self.ctx.exceptions.import_error.clone();
561-
self.new_exception_msg(import_error, msg)
561+
let exc = self.new_exception_msg(import_error, msg);
562+
self.set_attr(exc.as_object(), "name", self.new_str(name.to_owned()))
563+
.unwrap();
564+
exc
562565
}
563566

564567
pub fn new_runtime_error(&self, msg: String) -> PyBaseExceptionRef {
@@ -699,11 +702,22 @@ impl VirtualMachine {
699702
};
700703

701704
match cached_module {
702-
Some(module) => Ok(module),
705+
Some(cached_module) => {
706+
if self.is_none(&cached_module) {
707+
Err(self.new_import_error(
708+
format!("import of {} halted; None in sys.modules", module),
709+
module,
710+
))
711+
} else {
712+
Ok(cached_module)
713+
}
714+
}
703715
None => {
704716
let import_func = self
705717
.get_attribute(self.builtins.clone(), "__import__")
706-
.map_err(|_| self.new_import_error("__import__ not found".to_owned()))?;
718+
.map_err(|_| {
719+
self.new_import_error("__import__ not found".to_owned(), module)
720+
})?;
707721

708722
let (locals, globals) = if let Some(frame) = self.current_frame() {
709723
(

0 commit comments

Comments
 (0)