[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