Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r67140:8940f38137e1
Date: 2013-09-29 21:45 -0700
http://bitbucket.org/pypy/pypy/changeset/8940f38137e1/
Log: Fixed issue1617 -- when a local is deleted, ensure it doesn't show
up in locals()
diff --git a/pypy/interpreter/eval.py b/pypy/interpreter/eval.py
--- a/pypy/interpreter/eval.py
+++ b/pypy/interpreter/eval.py
@@ -107,9 +107,15 @@
for i in range(min(len(varnames), self.getfastscopelength())):
name = varnames[i]
w_value = fastscope_w[i]
+ w_name = self.space.wrap(name)
if w_value is not None:
- w_name = self.space.wrap(name)
self.space.setitem(self.w_locals, w_name, w_value)
+ else:
+ try:
+ self.space.delitem(self.w_locals, w_name)
+ except OperationError as e:
+ if not e.maches(self.space.w_KeyError):
+ raise
def locals2fast(self):
# Copy values from self.w_locals to the fastlocals
diff --git a/pypy/module/__builtin__/test/test_builtin.py
b/pypy/module/__builtin__/test/test_builtin.py
--- a/pypy/module/__builtin__/test/test_builtin.py
+++ b/pypy/module/__builtin__/test/test_builtin.py
@@ -83,10 +83,21 @@
def test_locals(self):
def f():
return locals()
+
def g(c=0, b=0, a=0):
return locals()
+
assert f() == {}
- assert g() == {'a':0, 'b':0, 'c':0}
+ assert g() == {'a': 0, 'b': 0, 'c': 0}
+
+ def test_locals_deleted_local(self):
+ def f():
+ a = 3
+ locals()
+ del a
+ return locals()
+
+ assert f() == {}
def test_dir(self):
def f():
diff --git a/rpython/flowspace/test/test_objspace.py
b/rpython/flowspace/test/test_objspace.py
--- a/rpython/flowspace/test/test_objspace.py
+++ b/rpython/flowspace/test/test_objspace.py
@@ -1063,7 +1063,6 @@
assert len(graph.startblock.exits) == 1
assert graph.startblock.exits[0].target == graph.returnblock
-
def test_global_variable(self):
def global_var_missing():
return a
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit