From: Stefan Behnel Date: Sun, 6 Dec 2009 13:29:05 +0000 (+0100) Subject: fix declaration analysis (and type inference) for comprehensions X-Git-Tag: 0.12.1~71 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=8151c0ef95c1e673f09c37062f70490d804fc70a;p=cython.git fix declaration analysis (and type inference) for comprehensions --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index bcc993d5..ae90a98e 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -3630,15 +3630,14 @@ class ComprehensionNode(ExprNode): def infer_type(self, env): return self.target.infer_type(env) - + + def analyse_declarations(self, env): + self.append.target = self # this is used in the PyList_Append of the inner loop + self.loop.analyse_declarations(env) + def analyse_types(self, env): self.target.analyse_expressions(env) self.type = self.target.type - self.append.target = self # this is a CloneNode used in the PyList_Append in the inner loop - # We are analysing declarations to late. - self.loop.target.analyse_target_declaration(env) - env.infer_types() - self.loop.analyse_declarations(env) self.loop.analyse_expressions(env) def calculate_result_code(self): diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index 8abbd76b..cffc1ae5 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -724,7 +724,12 @@ property NAME: self.env_stack.pop() self.seen_vars_stack.pop() return node - + + def visit_ComprehensionNode(self, node): + self.visitchildren(node) + node.analyse_declarations(self.env_stack[-1]) + return node + # Some nodes are no longer needed after declaration # analysis and can be dropped. The analysis was performed # on these nodes in a seperate recursive process from the diff --git a/Cython/Compiler/TypeInference.py b/Cython/Compiler/TypeInference.py index 2e64e45f..eb1e7dbe 100644 --- a/Cython/Compiler/TypeInference.py +++ b/Cython/Compiler/TypeInference.py @@ -25,7 +25,6 @@ class MarkAssignments(CythonTransform): if isinstance(lhs, (ExprNodes.NameNode, Nodes.PyArgDeclNode)): if lhs.entry is None: # TODO: This shouldn't happen... - # It looks like comprehension loop targets are not declared soon enough. return lhs.entry.assignments.append(rhs) elif isinstance(lhs, ExprNodes.SequenceNode):