From: Stefan Behnel Date: Tue, 2 Dec 2008 19:24:44 +0000 (+0100) Subject: fix FlattenInListTransform for the trivial case X-Git-Tag: 0.11-beta~173 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=cde600a158628944ff0e81db94dbc591f27df622;p=cython.git fix FlattenInListTransform for the trivial case --- diff --git a/Cython/Compiler/Main.py b/Cython/Compiler/Main.py index 330e7554..14cc6a63 100644 --- a/Cython/Compiler/Main.py +++ b/Cython/Compiler/Main.py @@ -114,7 +114,7 @@ class Context: _specific_post_parse, InterpretCompilerDirectives(self, self.pragma_overrides), _align_function_definitions, -# FlattenInListTransform(), + FlattenInListTransform(), WithTransform(self), DecoratorTransform(self), AnalyseDeclarationsTransform(self), diff --git a/Cython/Compiler/Optimize.py b/Cython/Compiler/Optimize.py index a9021662..f333d3dd 100644 --- a/Cython/Compiler/Optimize.py +++ b/Cython/Compiler/Optimize.py @@ -311,27 +311,33 @@ class FlattenInListTransform(Visitor.VisitorTransform): args = node.operand2.args if len(args) == 0: return ExprNodes.BoolNode(pos = node.pos, value = node.operator == 'not_in') + + if node.operand1.is_temp or node.operand1.is_simple(): + lhs = node.operand1 else: - lhs = ExprNodes.PersistentNode(node.operand1, len(args)) - conds = [] - for arg in args: - cond = ExprNodes.PrimaryCmpNode( - pos = node.pos, - operand1 = lhs, - operator = eq_or_neq, - operand2 = arg, - cascade = None) - conds.append(ExprNodes.TypecastNode( - pos = node.pos, - operand = cond, - type = PyrexTypes.c_bint_type)) - def concat(left, right): - return ExprNodes.BoolBinopNode( - pos = node.pos, - operator = conjunction, - operand1 = left, - operand2 = right) - return reduce(concat, conds) + # FIXME: allocate temp for evaluated node.operand1 + return node + + conds = [] + for arg in args: + cond = ExprNodes.PrimaryCmpNode( + pos = node.pos, + operand1 = lhs, + operator = eq_or_neq, + operand2 = arg, + cascade = None) + conds.append(ExprNodes.TypecastNode( + pos = node.pos, + operand = cond, + type = PyrexTypes.c_bint_type)) + def concat(left, right): + return ExprNodes.BoolBinopNode( + pos = node.pos, + operator = conjunction, + operand1 = left, + operand2 = right) + + return reduce(concat, conds) else: return node