[pypy-commit] pypy py3k: in-progress: make list comprehensions in their own function; I just check this is to push it on my notebook :-)
antocuni
noreply at buildbot.pypy.org
Wed Oct 24 12:40:45 CEST 2012
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: py3k
Changeset: r58395:97e1b1af67ce
Date: 2012-10-22 09:55 +0200
http://bitbucket.org/pypy/pypy/changeset/97e1b1af67ce/
Log: in-progress: make list comprehensions in their own function; I just
check this is to push it on my notebook :-)
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
@@ -118,6 +118,19 @@
codegen.emit_op(ops.POP_TOP)
+class __extend__(ast.ListComp):
+
+ def build_container(self, codegen):
+ codegen.emit_op_arg(ops.BUILD_LIST, 0)
+
+ def get_generators(self):
+ return self.generators
+
+ def accept_comp_iteration(self, codegen, index):
+ self.elt.walkabout(codegen)
+ codegen.emit_op_arg(ops.LIST_APPEND, index + 1)
+
+
class __extend__(ast.SetComp):
def build_container(self, codegen):
@@ -1080,13 +1093,17 @@
self.use_next_block(anchor)
def visit_ListComp(self, lc):
- self.update_position(lc.lineno)
- 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)
+ self._compile_comprehension(lc, "<listcomp>",
+ ComprehensionCodeGenerator)
+
+ ## def visit_ListComp(self, lc):
+ ## self.update_position(lc.lineno)
+ ## 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()
diff --git a/pypy/interpreter/astcompiler/symtable.py b/pypy/interpreter/astcompiler/symtable.py
--- a/pypy/interpreter/astcompiler/symtable.py
+++ b/pypy/interpreter/astcompiler/symtable.py
@@ -473,6 +473,9 @@
item.walkabout(self)
self.pop_scope()
+ def visit_ListComp(self, listcomp):
+ self._visit_comprehension(listcomp, listcomp.generators, listcomp.elt)
+
def visit_GeneratorExp(self, genexp):
self._visit_comprehension(genexp, genexp.generators, genexp.elt)
diff --git a/pypy/interpreter/astcompiler/test/test_compiler.py b/pypy/interpreter/astcompiler/test/test_compiler.py
--- a/pypy/interpreter/astcompiler/test/test_compiler.py
+++ b/pypy/interpreter/astcompiler/test/test_compiler.py
@@ -877,6 +877,7 @@
class TestOptimizations:
def count_instructions(self, source):
code, blocks = generate_function_code(source, self.space)
+ import pdb;pdb.set_trace()
instrs = []
for block in blocks:
instrs.extend(block.instructions)
diff --git a/pypy/interpreter/astcompiler/test/test_symtable.py b/pypy/interpreter/astcompiler/test/test_symtable.py
--- a/pypy/interpreter/astcompiler/test/test_symtable.py
+++ b/pypy/interpreter/astcompiler/test/test_symtable.py
@@ -106,6 +106,9 @@
def test_genexp(self):
self.check_comprehension("(%s)")
+ def test_listcomp(self):
+ self.check_comprehension("[%s]")
+
def test_setcomp(self):
self.check_comprehension("{%s}")
More information about the pypy-commit
mailing list