Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
 public void ModuleCreated(IScriptModule module)
 {
     _host.ModuleCreated(module);
 }