From: Thomas Wouters Date: Wed, 23 May 2001 13:26:29 +0000 (+0000) Subject: Backport Jeremy's checkins (frameobject.c:2.50, test_scope.py:1.16, X-Git-Tag: v2.1.1c1~109 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e98c5fd575990136755d05615ecba31c787f06d2;p=thirdparty%2FPython%2Fcpython.git Backport Jeremy's checkins (frameobject.c:2.50, test_scope.py:1.16, test_scope:1.8): SF patch 419176 from MvL; fixed bug 418977 Two errors in dict_to_map() helper used by PyFrame_LocalsToFast(). --- diff --git a/Lib/test/output/test_scope b/Lib/test/output/test_scope index fcd4e7a9793f..1a44bb2d14ba 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 c42d881402be..fb5379067d68 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 8e78f0f7f799..6e66d23b420c 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); }