Skip to content

Commit 04bff49

Browse files
committed
Raise proper NameError on del when name is not defined
Closes RustPython#929.
1 parent e35dec6 commit 04bff49

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

tests/snippets/delete.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from testutils import assert_raises
1+
from testutils import assert_raises, assertRaises
22

33
a = 1
44
del a
@@ -16,3 +16,6 @@ class MyObject: pass
1616
del (x, y)
1717
assert_raises(NameError, lambda: x)
1818
assert_raises(NameError, lambda: y)
19+
20+
with assertRaises(NameError):
21+
del y

vm/src/frame.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl Scope {
124124
pub trait NameProtocol {
125125
fn load_name(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>;
126126
fn store_name(&self, vm: &VirtualMachine, name: &str, value: PyObjectRef);
127-
fn delete_name(&self, vm: &VirtualMachine, name: &str);
127+
fn delete_name(&self, vm: &VirtualMachine, name: &str) -> PyResult;
128128
fn load_cell(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>;
129129
fn store_cell(&self, vm: &VirtualMachine, name: &str, value: PyObjectRef);
130130
fn load_global(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>;
@@ -169,8 +169,8 @@ impl NameProtocol for Scope {
169169
self.get_locals().set_item(key, value, vm).unwrap();
170170
}
171171

172-
fn delete_name(&self, vm: &VirtualMachine, key: &str) {
173-
self.get_locals().del_item(key, vm).unwrap();
172+
fn delete_name(&self, vm: &VirtualMachine, key: &str) -> PyResult {
173+
self.get_locals().del_item(key, vm)
174174
}
175175

176176
fn load_global(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef> {
@@ -1071,8 +1071,10 @@ impl Frame {
10711071
}
10721072

10731073
fn delete_name(&self, vm: &VirtualMachine, name: &str) -> FrameResult {
1074-
self.scope.delete_name(vm, name);
1075-
Ok(None)
1074+
match self.scope.delete_name(vm, name) {
1075+
Ok(_) => Ok(None),
1076+
Err(_) => Err(vm.new_name_error(format!("name '{}' is not defined", name))),
1077+
}
10761078
}
10771079

10781080
fn load_name(

0 commit comments

Comments
 (0)