// Return a new copy of the program public override Program getProgram() { var startTime = DateTime.Now; Program ret; if (unresolved_program != null) { FixedDuplicator dup = new FixedDuplicator(); ret = dup.VisitProgram(unresolved_program); } else { var progStr = ""; if (programStream is FileStream || programStream is MemoryStream) { var stream = programStream as Stream; stream.Seek(0, SeekOrigin.Begin); progStr = ParserHelper.Fill(stream, new List <string>()); } else { Debug.Assert(programStream is string); progStr = (string)programStream; } var v = Parser.Parse(progStr, "PersistentProgram", out ret); if (v != 0) { writeToFile("error.bpl"); throw new InternalError("Illegal program given to PersistentProgram"); } if (PersistentProgram.clearTokens) { PersistentProgram.ClearTokens(ret); } // TODO: use this always (sometimes .NET-2-Boogie programs crash) if (useDuplicator) { FixedDuplicator dup = new FixedDuplicator(); unresolved_program = dup.VisitProgram(ret); } } if (ret.Resolve() != 0) { writeToFile("error.bpl"); throw new InternalError("Illegal program given to PersistentProgram"); } persistenceCost += (DateTime.Now - startTime); return(ret); }