private void ExtractTemporaryVariables(AST.FunctionDeclaration root) { var variableAccess = this.variableAccessGraphGenerator.GetVariableInfoPerAstNode(root); var result = this.temporaryVariablesExtractor.ExtractTemporaryVariables(variableAccess, root.Body); var instructions = result.Concat(root.Body.Instructions).ToList(); root.Body = new AST.InstructionBlock(root.Body.InputRange, instructions); }
private void BuildVariableUsages( AST.Node node, AST.FunctionDeclaration parent, IDictionary <AST.VariableDeclaration, HashSet <AST.FunctionDeclaration> > result) { var newParent = parent; switch (node) { case AST.FunctionDeclaration declaration: { newParent = declaration; break; } case AST.VariableDeclaration declaration: { if (!result.ContainsKey(declaration)) { result.Add(declaration, new HashSet <AST.FunctionDeclaration>()); } result[declaration].Add(parent); break; } case AST.Variable variable: { if (!result.ContainsKey(variable.Declaration)) { result.Add(variable.Declaration, new HashSet <AST.FunctionDeclaration>()); } result[variable.Declaration].Add(parent); break; } } foreach (var child in node.Children()) { this.BuildVariableUsages(child, newParent, result); } }
public ILabel GenerateBody(Function.Function function, AST.FunctionDeclaration root) { this.ExtractTemporaryVariables(root); return(this.functionBodyGenerator.BuildFunctionBody(function, root.Body)); }