Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 16540:8236f3e7585e legacy-trunk
SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
(Nick Mathewson)
Remove to XXX comments
| author | Jeremy Hylton <jeremy@alum.mit.edu> |
|---|---|
| date | Fri, 09 Feb 2001 22:55:26 +0000 |
| parents | a47d93ef103a |
| children | 2c6417ef4628 |
line wrap: on
line diff
--- a/Python/compile.c Fri Feb 09 22:22:18 2001 +0000 +++ b/Python/compile.c Fri Feb 09 22:55:26 2001 +0000 @@ -2486,10 +2486,6 @@ where <message> is the second test, if present. */ - /* XXX should __debug__ and AssertionError get inserted into - the symbol table? they don't follow the normal rules - because they are always loaded as globals */ - if (Py_OptimizeFlag) return; com_addop_name(c, LOAD_GLOBAL, "__debug__"); @@ -3524,10 +3520,6 @@ } } -/* XXX This function could probably be made simpler, because it - doesn't do anything except generate code for complex arguments. -*/ - static void com_arglist(struct compiling *c, node *n) { @@ -3579,12 +3571,22 @@ REQ(ch, STAR); ch = CHILD(n, i+1); if (TYPE(ch) == NAME) { + PyObject *v; i += 3; + v = PyDict_GetItemString(c->c_cellvars, + STR(ch)); + if (v) { + com_addoparg(c, LOAD_FAST, narg); + com_addoparg(c, STORE_DEREF, + PyInt_AS_LONG(v)); } + narg++; } } + } /* Handle **keywords */ if (i < nch) { + PyObject *v; node *ch; ch = CHILD(n, i); if (TYPE(ch) != DOUBLESTAR) { @@ -3596,6 +3598,11 @@ else ch = CHILD(n, i+1); REQ(ch, NAME); + v = PyDict_GetItemString(c->c_cellvars, STR(ch)); + if (v) { + com_addoparg(c, LOAD_FAST, narg); + com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v)); + } } if (complex) { /* Generate code for complex arguments only after
