/// <summary> /// Module creation factory. The only way how to create a module. /// Modules compiled from a single source file unit get <see cref="ScriptModule.FileName"/> property set to a host /// normalized full path of that source unit. The property is set to a <c>null</c> reference for other modules. /// <c>scope</c> can be <c>null</c>. /// /// Ensures creation of module contexts for all languages whose code is assembled into the module. /// </summary> public ScriptModule CreateModule(string name, ScriptModuleKind kind, Scope scope, params ScriptCode[] scriptCodes) { Contract.RequiresNotNull(name, "name"); Contract.RequiresNotNullItems(scriptCodes, "scriptCodes"); CodeGen.SymbolWriters.Clear(); OptimizedModuleGenerator generator = null; if (scope == null) { if (scriptCodes.Length > 0) { if (scriptCodes[0].LanguageContext.Engine.Options.InterpretedMode) { scope = new Scope(); } else { generator = OptimizedModuleGenerator.Create(name, scriptCodes); scope = generator.GenerateScope(); } } else { scope = new Scope(); } } ScriptModule result = new ScriptModule(name, kind, scope, scriptCodes); CodeGen.SymbolWriters.Clear(); { if (name == "ironscheme.boot.new") { return(result); } } // single source file unit modules have unique full path: if (scriptCodes.Length == 1) { result.FileName = scriptCodes[0].SourceUnit.Id; } else { result.FileName = null; } // Initializes module contexts for all contained optimized script codes; // Module contexts stored in optimized module's code contexts cannot be changed from now on. // Such change would require the CodeContexts to be overwritten. if (generator != null) { generator.BindGeneratedCodeToModule(result); } else { foreach (ScriptCode code in scriptCodes) { code.LanguageContext.EnsureModuleContext(result); } } _host.ModuleCreated(result); return(result); }
public void ModuleCreated(IScriptModule module) { _host.ModuleCreated(module); }