public override Program VisitProgram(Program node) { //Contract.Requires(node != null); Contract.Ensures(Contract.Result<Program>() != null); // If cloning an entire program we need to ensure that // Implementation.Proc gets resolved to the right Procedure // (i.e. we don't duplicate Procedure twice) and CallCmds // call the right Procedure. // The map below is used to achieve this. OldToNewProcedureMap = new Dictionary<Procedure, Procedure>(); var newProgram = base.VisitProgram((Program)node.Clone()); // We need to make sure that CallCmds get resolved to call Procedures we duplicated // instead of pointing to procedures in the old program var callCmds = newProgram.Blocks().SelectMany(b => b.Cmds).OfType<CallCmd>(); foreach (var callCmd in callCmds) { callCmd.Proc = OldToNewProcedureMap[callCmd.Proc]; } OldToNewProcedureMap = null; // This Visitor could be used for other things later so remove the map. return newProgram; }
public override Program VisitProgram(Program node) { //Contract.Requires(node != null); Contract.Ensures(Contract.Result<Program>() != null); return base.VisitProgram((Program)node.Clone()); }