subexprs = ["arg"]
temp_counter = 0
generate_counter = 0
+ analyse_counter = 0
result_code = None
def __init__(self, arg, uses):
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:
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)
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