mirror of https://github.com/python/cpython
Issue2378: pdb would delete free variables when stepping into a class statement.
The problem was introduced by r53954, the correction is to restore the symmetry between PyFrame_FastToLocals and PyFrame_LocalsToFast
This commit is contained in:
parent
90d0717163
commit
e4921fec01
|
@ -519,6 +519,24 @@ self.assert_(X.passed)
|
|||
self.assert_("x" not in varnames)
|
||||
self.assert_("y" in varnames)
|
||||
|
||||
def testLocalsClass_WithTrace(self):
|
||||
# Issue23728: after the trace function returns, the locals()
|
||||
# dictionary is used to update all variables, this used to
|
||||
# include free variables. But in class statements, free
|
||||
# variables are not inserted...
|
||||
import sys
|
||||
sys.settrace(lambda a,b,c:None)
|
||||
try:
|
||||
x = 12
|
||||
|
||||
class C:
|
||||
def f(self):
|
||||
return x
|
||||
|
||||
assert x == 12 # Used to raise UnboundLocalError
|
||||
finally:
|
||||
sys.settrace(None)
|
||||
|
||||
def testBoundAndFree(self):
|
||||
# var is bound and free in class
|
||||
|
||||
|
|
|
@ -12,6 +12,10 @@ What's New in Python 2.6 beta 3?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #2378: An unexpected UnboundLocalError or NameError could appear when
|
||||
the python debugger steps into a class statement: the free variables (local
|
||||
variables defined in an outer scope) would be deleted from the outer scope.
|
||||
|
||||
Library
|
||||
-------
|
||||
|
||||
|
|
|
@ -904,9 +904,12 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)
|
|||
if (ncells || nfreevars) {
|
||||
dict_to_map(co->co_cellvars, ncells,
|
||||
locals, fast + co->co_nlocals, 1, clear);
|
||||
dict_to_map(co->co_freevars, nfreevars,
|
||||
locals, fast + co->co_nlocals + ncells, 1,
|
||||
clear);
|
||||
/* Same test as in PyFrame_FastToLocals() above. */
|
||||
if (co->co_flags & CO_OPTIMIZED) {
|
||||
dict_to_map(co->co_freevars, nfreevars,
|
||||
locals, fast + co->co_nlocals + ncells, 1,
|
||||
clear);
|
||||
}
|
||||
}
|
||||
PyErr_Restore(error_type, error_value, error_traceback);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue