diff --git a/vm/src/exceptions.rs b/vm/src/exceptions.rs index 94b4645489..fd0264036a 100644 --- a/vm/src/exceptions.rs +++ b/vm/src/exceptions.rs @@ -721,7 +721,9 @@ impl ExceptionZoo { }); extend_exception!(PyMemoryError, ctx, &excs.memory_error); - extend_exception!(PyNameError, ctx, &excs.name_error); + extend_exception!(PyNameError, ctx, &excs.name_error, { + "name" => ctx.none(), + }); extend_exception!(PyUnboundLocalError, ctx, &excs.unbound_local_error); // os errors: diff --git a/vm/src/frame.rs b/vm/src/frame.rs index 5084c2a0bb..fe99c452d4 100644 --- a/vm/src/frame.rs +++ b/vm/src/frame.rs @@ -448,10 +448,13 @@ impl ExecutingFrame<'_> { ) } else { let name = &self.code.freevars[i - self.code.cellvars.len()]; - vm.new_name_error(format!( - "free variable '{}' referenced before assignment in enclosing scope", - name - )) + vm.new_name_error( + format!( + "free variable '{}' referenced before assignment in enclosing scope", + name + ), + name, + ) } } @@ -609,7 +612,9 @@ impl ExecutingFrame<'_> { match res { Ok(()) => {} Err(e) if e.isinstance(&vm.ctx.exceptions.key_error) => { - return Err(vm.new_name_error(format!("name '{}' is not defined", name))) + return Err( + vm.new_name_error(format!("name '{}' is not defined", name), name) + ) } Err(e) => return Err(e), } @@ -620,7 +625,9 @@ impl ExecutingFrame<'_> { match self.globals.del_item(name.clone(), vm) { Ok(()) => {} Err(e) if e.isinstance(&vm.ctx.exceptions.key_error) => { - return Err(vm.new_name_error(format!("name '{}' is not defined", name))) + return Err( + vm.new_name_error(format!("name '{}' is not defined", name), name) + ) } Err(e) => return Err(e), } @@ -1124,7 +1131,7 @@ impl ExecutingFrame<'_> { fn load_global_or_builtin(&self, name: &PyStrRef, vm: &VirtualMachine) -> PyResult { self.globals .get_chain(self.builtins, name.clone(), vm)? - .ok_or_else(|| vm.new_name_error(format!("name '{}' is not defined", name))) + .ok_or_else(|| vm.new_name_error(format!("name '{}' is not defined", name), name)) } #[cfg_attr(feature = "flame-it", flame("Frame"))] diff --git a/vm/src/vm.rs b/vm/src/vm.rs index 219492fbcd..fccf0b72cd 100644 --- a/vm/src/vm.rs +++ b/vm/src/vm.rs @@ -666,9 +666,14 @@ impl VirtualMachine { self.new_exception_msg(type_error, msg) } - pub fn new_name_error(&self, msg: String) -> PyBaseExceptionRef { - let name_error = self.ctx.exceptions.name_error.clone(); - self.new_exception_msg(name_error, msg) + pub fn new_name_error(&self, msg: String, name: &PyStrRef) -> PyBaseExceptionRef { + let name_error_type = self.ctx.exceptions.name_error.clone(); + let name_error = self.new_exception_msg(name_error_type, msg); + name_error + .as_object() + .set_attr("name", name.clone(), self) + .unwrap(); + name_error } pub fn new_unsupported_unary_error(&self, a: &PyObjectRef, op: &str) -> PyBaseExceptionRef {