[Python-Dev] no remaining issues blocking 2.5 release
Neal Norwitz
nnorwitz at gmail.com
Wed Aug 16 09:06:39 CEST 2006
On 8/15/06, Neil Schemenauer <nas at arctrix.com> wrote:
>
> It would be nice if someone could bytecompile Lib using
> Tools/compiler/compile.py and then run the test suite. I'd do it
> myself but can't spare the time at the moment (I started but ran
> into what seems to be a gcc bug along the way).
Has this been done before?
# This code causes python to segfault
def foo(S):
all(x > 42 for x in S)
# around Python/ceval.c 2167: x = (*v->ob_type->tp_iternext)(v);
# tp_iternext is NULL
I added the changes below to Lib/compiler/pycodegen.py which are
clearly wrong. It just crashes in a diff place. I think the changes
to genxpr inner may be close to correct. The changes to _makeClosure
and visitGenExpr are clearly wrong. I was just wondering how far it
would go. There are a bunch of differences. Some are the bytecode
optimizations or different ordering, but others are things dealing
with co_names, co_varnames.
Hopefully someone has time to look into this. Otherwise, it will have
to wait for 2.5.1
n
--
Index: Lib/compiler/pycodegen.py
===================================================================
--- Lib/compiler/pycodegen.py (revision 51305)
+++ Lib/compiler/pycodegen.py (working copy)
@@ -628,9 +628,9 @@
self.newBlock()
self.emit('POP_TOP')
- def _makeClosure(self, gen, args):
+ def _makeClosure(self, gen, args, gen_outer=False):
frees = gen.scope.get_free_vars()
- if frees:
+ if frees and not gen_outer:
for name in frees:
self.emit('LOAD_CLOSURE', name)
self.emit('BUILD_TUPLE', len(frees))
@@ -646,7 +646,7 @@
walk(node.code, gen)
gen.finish()
self.set_lineno(node)
- self._makeClosure(gen, 0)
+ self._makeClosure(gen, 0, True)
# precomputation of outmost iterable
self.visit(node.code.quals[0].iter)
self.emit('GET_ITER')
@@ -655,6 +655,11 @@
def visitGenExprInner(self, node):
self.set_lineno(node)
# setup list
+ after = self.newBlock()
+ start = self.newBlock()
+ self.setups.push((LOOP, start))
+ self.emit('SETUP_LOOP', after)
+ self.nextBlock(start)
stack = []
for i, for_ in zip(range(len(node.quals)), node.quals):
@@ -676,8 +681,12 @@
self.startBlock(cont)
self.emit('POP_TOP')
self.nextBlock(skip_one)
+ self.emit('POP_TOP')
self.emit('JUMP_ABSOLUTE', start)
self.startBlock(anchor)
+ self.emit('POP_BLOCK')
+ self.setups.pop()
+ self.nextBlock(after)
self.emit('LOAD_CONST', None)
def visitGenExprFor(self, node):
More information about the Python-Dev
mailing list