summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2001-05-08 04:08:59 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2001-05-08 04:08:59 (GMT)
commit4c889011db22df761709ac8f9bc246bf4931e9c4 (patch)
treeda5261c42a69c290aa8aed898a4d86bea5ee0760
parentd37292bb8dcdba176e0898a7a7d114ddd415379d (diff)
downloadcpython-4c889011db22df761709ac8f9bc246bf4931e9c4.zip
cpython-4c889011db22df761709ac8f9bc246bf4931e9c4.tar.gz
cpython-4c889011db22df761709ac8f9bc246bf4931e9c4.tar.bz2
SF patch 419176 from MvL; fixed bug 418977
Two errors in dict_to_map() helper used by PyFrame_LocalsToFast().
-rw-r--r--Lib/test/output/test_scope1
-rw-r--r--Lib/test/test_scope.py20
-rw-r--r--Objects/frameobject.c9
3 files changed, 24 insertions, 6 deletions
diff --git a/Lib/test/output/test_scope b/Lib/test/output/test_scope
index fcd4e7a..1a44bb2 100644
--- a/Lib/test/output/test_scope
+++ b/Lib/test/output/test_scope
@@ -18,3 +18,4 @@ test_scope
17. class and global
18. verify that locals() works
19. var is bound and free in class
+20. interaction with trace function
diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py
index c42d881..fb53790 100644
--- a/Lib/test/test_scope.py
+++ b/Lib/test/test_scope.py
@@ -447,3 +447,23 @@ def f(x):
inst = f(3)()
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)
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 8e78f0f..6e66d23 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -283,12 +283,9 @@ dict_to_map(PyObject *map, int nmap, PyObject *dict, PyObject **values,
PyObject *value = PyDict_GetItem(dict, key);
Py_XINCREF(value);
if (deref) {
- if (value) {
+ if (value || clear) {
if (PyCell_Set(values[j], value) < 0)
PyErr_Clear();
- } else if (clear) {
- Py_XDECREF(values[j]);
- values[j] = value;
}
} else if (value != NULL || clear) {
Py_XDECREF(values[j]);
@@ -370,10 +367,10 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)
return;
dict_to_map(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,
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);
}