From bf2594221f2f3adb6cf183b13c1c82a685ed3606 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Tue, 15 Jul 2008 20:37:27 -0700 Subject: [PATCH] Fix PersistentNode analyse --- Cython/Compiler/ExprNodes.py | 24 +++++++++++++++--------- Cython/Compiler/Main.py | 1 + Cython/Compiler/Visitor.py | 1 + 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 7d7149bf..bf94764a 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -4037,6 +4037,7 @@ class PersistentNode(ExprNode): subexprs = ["arg"] temp_counter = 0 generate_counter = 0 + analyse_counter = 0 result_code = None def __init__(self, arg, uses): @@ -4045,13 +4046,15 @@ class PersistentNode(ExprNode): self.uses = uses def analyse_types(self, env): - self.arg.analyse_types(env) - self.type = self.arg.type - self.result_ctype = self.arg.result_ctype - self.is_temp = 1 + if self.analyse_counter == 0: + self.arg.analyse_types(env) + self.type = self.arg.type + self.result_ctype = self.arg.result_ctype + self.is_temp = 1 + self.analyse_counter += 1 def calculate_result_code(self): - return self.arg.result_code + return self.result_code def generate_evaluation_code(self, code): if self.generate_counter == 0: @@ -4071,13 +4074,16 @@ class PersistentNode(ExprNode): def allocate_temps(self, env, result=None): if self.temp_counter == 0: self.arg.allocate_temps(env) - if result is None: - self.result_code = env.allocate_temp(self.type) - else: - self.result_code = result + self.allocate_temp(env, result) self.arg.release_temp(env) self.temp_counter += 1 + def allocate_temp(self, env, result=None): + if result is None: + self.result_code = env.allocate_temp(self.type) + else: + self.result_code = result + def release_temp(self, env): if self.temp_counter == self.uses: env.release_temp(self.result_code) diff --git a/Cython/Compiler/Main.py b/Cython/Compiler/Main.py index c52b46ec..59fdf840 100644 --- a/Cython/Compiler/Main.py +++ b/Cython/Compiler/Main.py @@ -354,6 +354,7 @@ def create_generate_code(context, options, result): return generate_code def create_default_pipeline(context, options, result): + from Visitor import PrintTree from ParseTreeTransforms import WithTransform, NormalizeTree, PostParse from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform diff --git a/Cython/Compiler/Visitor.py b/Cython/Compiler/Visitor.py index 52fe2c2b..3da3403b 100644 --- a/Cython/Compiler/Visitor.py +++ b/Cython/Compiler/Visitor.py @@ -213,6 +213,7 @@ class PrintTree(TreeVisitor): def __call__(self, tree, phase=None): print("Parse tree dump at phase '%s'" % phase) self.visit(tree) + return tree # Don't do anything about process_list, the defaults gives # nice-looking name[idx] nodes which will visually appear -- 2.26.2