Add name field on PyNameError

Signed-off-by: snowapril <sinjihng@gmail.com>
This commit is contained in:
snowapril
2021-10-10 23:51:35 +09:00
parent ff54d8ae53
commit 1ee74403e2
3 changed files with 25 additions and 11 deletions

View File

@@ -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:

View File

@@ -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"))]

View File

@@ -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 {