Ejemplo n.º 1
0
        /// <summary>
        /// Creates a ScriptModule consisting of multiple ScriptCode blocks (possibly with each
        /// ScriptCode block belonging to a different language).
        /// Can ONLY be called from ScriptDomainManager.CreateModule factory (due to host notification).
        /// </summary>
        internal ScriptModule(string name, ScriptModuleKind kind, Scope scope, ScriptCode[] codeBlocks)
        {
            Assert.NotNull(name, scope, codeBlocks);
            Assert.NotNull(codeBlocks);

            _codeBlocks     = ArrayUtils.Copy(codeBlocks);
            _name           = name;
            _scope          = scope;
            _kind           = kind;
            _moduleContexts = ModuleContext.EmptyArray;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Compiles a list of source units into a single module.
        /// <c>scope</c> can be <c>null</c>.
        /// <c>options</c> can be <c>null</c>.
        /// <c>errorSink</c> can be <c>null</c>.
        /// </summary>
        public ScriptModule CompileModule(string name, ScriptModuleKind kind, Scope scope, CompilerOptions options, ErrorSink errorSink,
                                          params SourceUnit[] sourceUnits)
        {
            Contract.RequiresNotNull(name, "name");
            Contract.RequiresNotNullItems(sourceUnits, "sourceUnits");

            // TODO: Two phases: parse/compile?

            // compiles all source units:
            ScriptCode[] scriptCodes = new ScriptCode[sourceUnits.Length];
            for (int i = 0; i < sourceUnits.Length; i++)
            {
                scriptCodes[i] = LanguageContext.FromEngine(sourceUnits[i].Engine).CompileSourceCode(sourceUnits[i], options, errorSink);
            }

            return(CreateModule(name, kind, scope, scriptCodes));
        }
Ejemplo n.º 3
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);
        }