Ka-Ping Yee <ping@lfw.org> writes: > I just tried this: > > Python 2.1b1 (#15, Mar 16 2001, 04:31:43) > [GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2 > Type "copyright", "credits" or "license" for more information. > >>> from __future__ import nested_scopes > >>> def f(x): > ... x = x + 1 > ... a = x + 3 > ... b = x + 5 > ... def g(y): > ... def h(z): > ... return a, b, x, y, z > ... return h > ... return g > ... > Fatal Python error: non-string found in code slot > Aborted (core dumped) Here, look at this: static int symtable_freevar_offsets(PyObject *freevars, int offset) { PyObject *name, *v; int pos; /* The cell vars are the first elements of the closure, followed by the free vars. Update the offsets in c_freevars to account for number of cellvars. */ pos = 0; while (PyDict_Next(freevars, &pos, &name, &v)) { int i = PyInt_AS_LONG(v) + offset; PyObject *o = PyInt_FromLong(i); if (o == NULL) return -1; if (PyDict_SetItem(freevars, name, o) < 0) { Py_DECREF(o); return -1; } Py_DECREF(o); } return 0; } this modifies the dictionary you're iterating over. This is, as they say, a Bad Idea[*]. https://sourceforge.net/tracker/index.php?func=detail&aid=409864&group_id=5470&atid=305470 is a minimal-effort/impact fix. I don't know the new compile.c well enough to really judge the best fix. Cheers, M. [*] I thought that if you used the same keys when you were iterating over a dict you were safe. It seems not, at least as far as I could tell with mounds of debugging printf's. -- (Of course SML does have its weaknesses, but by comparison, a discussion of C++'s strengths and flaws always sounds like an argument about whether one should face north or east when one is sacrificing one's goat to the rain god.) -- Thant Tessman
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4