[pypy-commit] pypy speedup-list-comprehension: redo the reasonable part
fijal
noreply at buildbot.pypy.org
Fri Feb 24 03:35:05 CET 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: speedup-list-comprehension
Changeset: r52828:45a68e50a262
Date: 2012-02-23 19:34 -0700
http://bitbucket.org/pypy/pypy/changeset/45a68e50a262/
Log: redo the reasonable part
diff --git a/pypy/interpreter/astcompiler/codegen.py b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -965,7 +965,7 @@
self.emit_op_arg(ops.CALL_METHOD, (kwarg_count << 8) | arg_count)
return True
- def _listcomp_generator(self, gens, gen_index, elt, outermost=False):
+ def _listcomp_generator(self, gens, gen_index, elt, single=False):
start = self.new_block()
skip = self.new_block()
if_cleanup = self.new_block()
@@ -973,8 +973,8 @@
gen = gens[gen_index]
assert isinstance(gen, ast.comprehension)
gen.iter.walkabout(self)
- if outermost:
- self.emit_op(ops.BUILD_LIST_FROM_ARG)
+ if single:
+ self.emit_op_arg(ops.BUILD_LIST_FROM_ARG, 0)
self.emit_op(ops.GET_ITER)
self.use_next_block(start)
self.emit_jump(ops.FOR_ITER, anchor)
@@ -1000,7 +1000,12 @@
def visit_ListComp(self, lc):
self.update_position(lc.lineno)
- self._listcomp_generator(lc.generators, 0, lc.elt, outermost=True)
+ if len(lc.generators) != 1 or lc.generators[0].ifs:
+ single = False
+ self.emit_op_arg(ops.BUILD_LIST, 0)
+ else:
+ single = True
+ self._listcomp_generator(lc.generators, 0, lc.elt, single=single)
def _comp_generator(self, node, generators, gen_index):
start = self.new_block()
More information about the pypy-commit
mailing list