From 23b3fda716b92b2545e0bd5e0362ae365022beb3 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Mon, 11 Mar 2013 11:17:47 +0100 Subject: [PATCH] transform empty comprehensions into empty literals --- Cython/Compiler/Optimize.py | 7 +++++++ tests/run/constant_folding.py | 8 +++++--- tests/run/constant_folding_cy.pyx | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Cython/Compiler/Optimize.py b/Cython/Compiler/Optimize.py index a68dc67..6563dfa 100644 --- a/Cython/Compiler/Optimize.py +++ b/Cython/Compiler/Optimize.py @@ -3233,6 +3233,13 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations): return base return node + def visit_ComprehensionNode(self, node): + self.visitchildren(node) + if isinstance(node.loop, Nodes.StatListNode) and not node.loop.stats: + # loop was pruned already => transform into literal + return node.target + return node + def visit_ForInStatNode(self, node): self.visitchildren(node) sequence = node.iterator.sequence diff --git a/tests/run/constant_folding.py b/tests/run/constant_folding.py index d88978a..2b1ad59 100644 --- a/tests/run/constant_folding.py +++ b/tests/run/constant_folding.py @@ -213,10 +213,11 @@ def for_in_empty_else(): @cython.test_fail_if_path_exists( + "//ComprehensionNode", "//ForInStatNode", ) @cython.test_assert_path_exists( - "//ComprehensionNode", + "//ListNode", ) def for_in_empty_listcomp(): """ @@ -227,10 +228,11 @@ def for_in_empty_listcomp(): @cython.test_fail_if_path_exists( + "//ComprehensionNode", "//ForInStatNode", ) @cython.test_assert_path_exists( - "//ComprehensionNode", + "//ListNode", ) def for_in_empty_nested_listcomp(): """ @@ -242,7 +244,7 @@ def for_in_empty_nested_listcomp(): @cython.test_fail_if_path_exists( "//ForInStatNode//ForInStatNode", - ) +) @cython.test_assert_path_exists( "//ForInStatNode", "//ComprehensionNode", diff --git a/tests/run/constant_folding_cy.pyx b/tests/run/constant_folding_cy.pyx index da9a935..b2ca8ec 100644 --- a/tests/run/constant_folding_cy.pyx +++ b/tests/run/constant_folding_cy.pyx @@ -83,10 +83,11 @@ def unicode_slicing_safe_surrogates2(): @cython.test_fail_if_path_exists( + "//ComprehensionNode", "//ForInStatNode", ) @cython.test_assert_path_exists( - "//ComprehensionNode", + "//SetNode", ) def for_in_empty_setcomp(): """ -- 2.7.4