]> granicus.if.org Git - python/commitdiff
Fix SF bug #505315: Make free and cell vars show up consistently in locals().
authorJeremy Hylton <jeremy@alum.mit.edu>
Sat, 20 Apr 2002 04:46:55 +0000 (04:46 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Sat, 20 Apr 2002 04:46:55 +0000 (04:46 +0000)
PyFrame_FastToLocals() and PyFrame_LocalsToFast() had a return if
f_nlocals was 0.  I think this was a holdover from the pre 2.1 days
when regular locals were the only kind of local variables.

The change makes it possible to use a free variable in eval or exec if
it the variable is also used elsewhere in the same block, which is
what the documentation says.

Objects/frameobject.c

index 165121d8f8715505ff3254e28a9fd23136438c95..6adc0364aa0c16b7733b26e4230d90532fc17430 100644 (file)
@@ -416,8 +416,6 @@ PyFrame_FastToLocals(PyFrameObject *f)
                        return;
                }
        }
-       if (f->f_nlocals == 0)
-               return;
        map = f->f_code->co_varnames;
        if (!PyDict_Check(locals) || !PyTuple_Check(map))
                return;
@@ -426,7 +424,8 @@ PyFrame_FastToLocals(PyFrameObject *f)
        j = PyTuple_Size(map);
        if (j > f->f_nlocals)
                j = f->f_nlocals;
-       map_to_dict(map, j, locals, fast, 0);
+       if (f->f_nlocals)
+           map_to_dict(map, j, locals, fast, 0);
        if (f->f_ncells || f->f_nfreevars) {
                if (!(PyTuple_Check(f->f_code->co_cellvars)
                      && PyTuple_Check(f->f_code->co_freevars))) {
@@ -455,7 +454,7 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)
                return;
        locals = f->f_locals;
        map = f->f_code->co_varnames;
-       if (locals == NULL || f->f_code->co_nlocals == 0)
+       if (locals == NULL)
                return;
        if (!PyDict_Check(locals) || !PyTuple_Check(map))
                return;
@@ -464,7 +463,8 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)
        j = PyTuple_Size(map);
        if (j > f->f_nlocals)
                j = f->f_nlocals;
-       dict_to_map(f->f_code->co_varnames, j, locals, fast, 0, clear);
+       if (f->f_nlocals)
+           dict_to_map(f->f_code->co_varnames, j, locals, fast, 0, clear);
        if (f->f_ncells || f->f_nfreevars) {
                if (!(PyTuple_Check(f->f_code->co_cellvars)
                      && PyTuple_Check(f->f_code->co_freevars)))
@@ -474,7 +474,8 @@ PyFrame_LocalsToFast(PyFrameObject *f, int 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 + f->f_nlocals + f->f_ncells, 1, clear);
+                           locals, fast + f->f_nlocals + f->f_ncells, 1, 
+                           clear);
        }
        PyErr_Restore(error_type, error_value, error_traceback);
 }