SF patch 419176 from MvL; fixed bug 418977

Two errors in dict_to_map() helper used by PyFrame_LocalsToFast().
This commit is contained in:
Jeremy Hylton 2001-05-08 04:08:59 +00:00
parent d37292bb8d
commit 4c889011db
3 changed files with 24 additions and 6 deletions

View file

@ -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

View file

@ -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)

View file

@ -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);
} }