mirror of
https://github.com/python/cpython.git
synced 2025-12-04 08:34:25 +00:00
SF patch 419176 from MvL; fixed bug 418977
Two errors in dict_to_map() helper used by PyFrame_LocalsToFast().
This commit is contained in:
parent
d37292bb8d
commit
4c889011db
3 changed files with 24 additions and 6 deletions
|
|
@ -18,3 +18,4 @@ test_scope
|
||||||
17. class and global
|
17. class and global
|
||||||
18. verify that locals() works
|
18. verify that locals() works
|
||||||
19. var is bound and free in class
|
19. var is bound and free in class
|
||||||
|
20. interaction with trace function
|
||||||
|
|
|
||||||
|
|
@ -447,3 +447,23 @@ def f(x):
|
||||||
|
|
||||||
inst = f(3)()
|
inst = f(3)()
|
||||||
verify(inst.a == inst.m())
|
verify(inst.a == inst.m())
|
||||||
|
|
||||||
|
print "20. interaction with trace function"
|
||||||
|
|
||||||
|
import sys
|
||||||
|
def tracer(a,b,c):
|
||||||
|
return tracer
|
||||||
|
|
||||||
|
def adaptgetter(name, klass, getter):
|
||||||
|
kind, des = getter
|
||||||
|
if kind == 1: # AV happens when stepping from this line to next
|
||||||
|
if des == "":
|
||||||
|
des = "_%s__%s" % (klass.__name__, name)
|
||||||
|
return lambda obj: getattr(obj, des)
|
||||||
|
|
||||||
|
class TestClass:
|
||||||
|
pass
|
||||||
|
|
||||||
|
sys.settrace(tracer)
|
||||||
|
adaptgetter("foo", TestClass, (1, ""))
|
||||||
|
sys.settrace(None)
|
||||||
|
|
|
||||||
|
|
@ -283,12 +283,9 @@ dict_to_map(PyObject *map, int nmap, PyObject *dict, PyObject **values,
|
||||||
PyObject *value = PyDict_GetItem(dict, key);
|
PyObject *value = PyDict_GetItem(dict, key);
|
||||||
Py_XINCREF(value);
|
Py_XINCREF(value);
|
||||||
if (deref) {
|
if (deref) {
|
||||||
if (value) {
|
if (value || clear) {
|
||||||
if (PyCell_Set(values[j], value) < 0)
|
if (PyCell_Set(values[j], value) < 0)
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
} else if (clear) {
|
|
||||||
Py_XDECREF(values[j]);
|
|
||||||
values[j] = value;
|
|
||||||
}
|
}
|
||||||
} else if (value != NULL || clear) {
|
} else if (value != NULL || clear) {
|
||||||
Py_XDECREF(values[j]);
|
Py_XDECREF(values[j]);
|
||||||
|
|
@ -370,10 +367,10 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)
|
||||||
return;
|
return;
|
||||||
dict_to_map(f->f_code->co_cellvars,
|
dict_to_map(f->f_code->co_cellvars,
|
||||||
PyTuple_GET_SIZE(f->f_code->co_cellvars),
|
PyTuple_GET_SIZE(f->f_code->co_cellvars),
|
||||||
locals, fast, 1, clear);
|
locals, fast + f->f_nlocals, 1, clear);
|
||||||
dict_to_map(f->f_code->co_freevars,
|
dict_to_map(f->f_code->co_freevars,
|
||||||
PyTuple_GET_SIZE(f->f_code->co_freevars),
|
PyTuple_GET_SIZE(f->f_code->co_freevars),
|
||||||
locals, fast, 1, clear);
|
locals, fast + f->f_nlocals + f->f_ncells, 1, clear);
|
||||||
}
|
}
|
||||||
PyErr_Restore(error_type, error_value, error_traceback);
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue