internal void SaveCompiledCode() { string savePath = _context.RubyOptions.SavePath; if (savePath != null) { lock (_compiledFileMutex) { var assemblyPath = Path.Combine(savePath, (Path.GetFileName(_context.RubyOptions.MainFile) ?? "snippets") + ".dll"); Utils.Log(String.Format("SAVING to {0}", Path.GetFullPath(assemblyPath)), "LOADER"); // TODO: allocate eagerly (as soon as config gets fixed) if (_compiledFiles == null) { _compiledFiles = new Dictionary <string, CompiledFile>(); } SavableScriptCode[] codes = new SavableScriptCode[_compiledFiles.Count]; int i = 0; foreach (CompiledFile file in _compiledFiles.Values) { codes[i++] = (SavableScriptCode)file.CompiledCode; } SavableScriptCode.SaveToAssembly(assemblyPath, codes); } } }
private Dictionary <string, CompiledFile> /*!*/ LoadCompiledCode() { Debug.Assert(_context.RubyOptions.LoadFromDisk); Dictionary <string, CompiledFile> result = new Dictionary <string, CompiledFile>(); Utils.Log("LOADING", "LOADER"); ScriptCode[] codes = SavableScriptCode.LoadFromAssembly(_context.DomainManager, Assembly.Load(Path.GetFileName(_context.RubyOptions.MainFile)) ); for (int i = 0; i < codes.Length; i++) { string path = codes[i].SourceUnit.Path; string fullPath = Platform.GetFullPath(path); result[fullPath] = new CompiledFile(codes[i]); } return(result); }
/// <summary> /// Provides a helper for compiling a group of modules into a single assembly. The assembly can later be /// reloaded using the clr.AddReference API. /// </summary> public static void CompileModules(CodeContext /*!*/ context, string /*!*/ assemblyName, [ParamDictionary] IDictionary <string, object> kwArgs, params string /*!*/[] /*!*/ filenames) { ContractUtils.RequiresNotNull(assemblyName, "assemblyName"); ContractUtils.RequiresNotNullItems(filenames, "filenames"); PythonContext pc = PythonContext.GetContext(context); for (int i = 0; i < filenames.Length; i++) { filenames[i] = Path.GetFullPath(filenames[i]); } Dictionary <string, string> packageMap = BuildPackageMap(filenames); List <SavableScriptCode> code = new List <SavableScriptCode>(); foreach (string filename in filenames) { if (!pc.DomainManager.Platform.FileExists(filename)) { throw PythonOps.IOError("Couldn't find file for compilation: {0}", filename); } ScriptCode sc; string modName; string dname = Path.GetDirectoryName(filename); string outFilename = ""; if (Path.GetFileName(filename) == "__init__.py") { // remove __init__.py to get package name dname = Path.GetDirectoryName(dname); if (String.IsNullOrEmpty(dname)) { modName = Path.GetDirectoryName(filename); } else { modName = Path.GetFileNameWithoutExtension(Path.GetDirectoryName(filename)); } outFilename = Path.DirectorySeparatorChar + "__init__.py"; } else { modName = Path.GetFileNameWithoutExtension(filename); } // see if we have a parent package, if so incorporate it into // our name string parentPackage; if (packageMap.TryGetValue(dname, out parentPackage)) { modName = parentPackage + "." + modName; } outFilename = modName.Replace('.', Path.DirectorySeparatorChar) + outFilename; SourceUnit su = pc.CreateSourceUnit( new FileStreamContentProvider( context.LanguageContext.DomainManager.Platform, filename ), outFilename, pc.DefaultEncoding, SourceCodeKind.File ); sc = PythonContext.GetContext(context).GetScriptCode(su, modName, ModuleOptions.Initialize, Compiler.CompilationMode.ToDisk); code.Add((SavableScriptCode)sc); } object mainModule; if (kwArgs != null && kwArgs.TryGetValue("mainModule", out mainModule)) { string strModule = mainModule as string; if (strModule != null) { if (!pc.DomainManager.Platform.FileExists(strModule)) { throw PythonOps.IOError("Couldn't find main file for compilation: {0}", strModule); } SourceUnit su = pc.CreateFileUnit(strModule, pc.DefaultEncoding, SourceCodeKind.File); code.Add((SavableScriptCode)PythonContext.GetContext(context).GetScriptCode(su, "__main__", ModuleOptions.Initialize, Compiler.CompilationMode.ToDisk)); } } SavableScriptCode.SaveToAssembly(assemblyName, code.ToArray()); }