Skip to content

Commit ef25264

Browse files
Merge pull request #1508 from HyeockJinKim/issue1356
locals() return copy of locals dictionary
2 parents 5f1fb7c + cb9b9e6 commit ef25264

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

tests/snippets/global_nonlocal.py

+24
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,27 @@ def f():
8585
# nonlocal c
8686
# c = 2
8787

88+
def a():
89+
x = 0
90+
locals()['x'] = 3
91+
assert x == 0
92+
93+
a()
94+
95+
def a():
96+
x = 0
97+
del locals()['x']
98+
assert x == 0
99+
100+
a()
101+
102+
def a():
103+
x = 0
104+
b = locals()
105+
assert b['x'] == 0
106+
107+
del b['x']
108+
b = locals()
109+
assert b['x'] == 0
110+
111+
a()

vm/src/builtins.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,8 @@ fn builtin_len(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult {
366366
}
367367

368368
fn builtin_locals(vm: &VirtualMachine) -> PyDictRef {
369-
vm.get_locals()
369+
let locals = vm.get_locals();
370+
locals.copy(vm).into_ref(vm)
370371
}
371372

372373
fn builtin_max(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {

vm/src/obj/objdict.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ impl PyDictRef {
279279
}
280280
}
281281

282-
fn copy(self, _vm: &VirtualMachine) -> PyDict {
282+
pub fn copy(self, _vm: &VirtualMachine) -> PyDict {
283283
PyDict {
284284
entries: self.entries.clone(),
285285
}

0 commit comments

Comments
 (0)