Commit bf259422 authored by Robert Bradshaw's avatar Robert Bradshaw

Fix PersistentNode analyse

parent 91ffc474
...@@ -4037,6 +4037,7 @@ class PersistentNode(ExprNode): ...@@ -4037,6 +4037,7 @@ class PersistentNode(ExprNode):
subexprs = ["arg"] subexprs = ["arg"]
temp_counter = 0 temp_counter = 0
generate_counter = 0 generate_counter = 0
analyse_counter = 0
result_code = None result_code = None
def __init__(self, arg, uses): def __init__(self, arg, uses):
...@@ -4045,13 +4046,15 @@ class PersistentNode(ExprNode): ...@@ -4045,13 +4046,15 @@ class PersistentNode(ExprNode):
self.uses = uses self.uses = uses
def analyse_types(self, env): def analyse_types(self, env):
self.arg.analyse_types(env) if self.analyse_counter == 0:
self.type = self.arg.type self.arg.analyse_types(env)
self.result_ctype = self.arg.result_ctype self.type = self.arg.type
self.is_temp = 1 self.result_ctype = self.arg.result_ctype
self.is_temp = 1
self.analyse_counter += 1
def calculate_result_code(self): def calculate_result_code(self):
return self.arg.result_code return self.result_code
def generate_evaluation_code(self, code): def generate_evaluation_code(self, code):
if self.generate_counter == 0: if self.generate_counter == 0:
...@@ -4071,13 +4074,16 @@ class PersistentNode(ExprNode): ...@@ -4071,13 +4074,16 @@ class PersistentNode(ExprNode):
def allocate_temps(self, env, result=None): def allocate_temps(self, env, result=None):
if self.temp_counter == 0: if self.temp_counter == 0:
self.arg.allocate_temps(env) self.arg.allocate_temps(env)
if result is None: self.allocate_temp(env, result)
self.result_code = env.allocate_temp(self.type)
else:
self.result_code = result
self.arg.release_temp(env) self.arg.release_temp(env)
self.temp_counter += 1 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): def release_temp(self, env):
if self.temp_counter == self.uses: if self.temp_counter == self.uses:
env.release_temp(self.result_code) env.release_temp(self.result_code)
......
...@@ -354,6 +354,7 @@ def create_generate_code(context, options, result): ...@@ -354,6 +354,7 @@ def create_generate_code(context, options, result):
return generate_code return generate_code
def create_default_pipeline(context, options, result): def create_default_pipeline(context, options, result):
from Visitor import PrintTree
from ParseTreeTransforms import WithTransform, NormalizeTree, PostParse from ParseTreeTransforms import WithTransform, NormalizeTree, PostParse
from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform
......
...@@ -213,6 +213,7 @@ class PrintTree(TreeVisitor): ...@@ -213,6 +213,7 @@ class PrintTree(TreeVisitor):
def __call__(self, tree, phase=None): def __call__(self, tree, phase=None):
print("Parse tree dump at phase '%s'" % phase) print("Parse tree dump at phase '%s'" % phase)
self.visit(tree) self.visit(tree)
return tree
# Don't do anything about process_list, the defaults gives # Don't do anything about process_list, the defaults gives
# nice-looking name[idx] nodes which will visually appear # nice-looking name[idx] nodes which will visually appear
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment