示例#1
0
        /// <summary>
        /// Gets the ScriptModule that has been published under the given SourceUnit.
        /// </summary>
        public bool TryGetScriptModule(string publicName, out ScriptModule module)
        {
            if (_modules == null)
            {
                module = null;
                return(false);
            }

            lock (_modules) {
                module = GetCachedModuleNoLock(publicName);
            }

            return(module != null);
        }
示例#2
0
        public ModuleContext EnsureModuleContext(ScriptModule module) {
            Contract.RequiresNotNull(module, "module");
            ModuleContext context = module.GetModuleContext(ContextId);
            
            if (context == null) {
                context = CreateModuleContext(module);
                if (context == null) {
                    throw new InvalidImplementationException("CreateModuleContext must return a module context.");
                }
                return module.SetModuleContext(ContextId, context);
            }

            return context;
        }
示例#3
0
        internal static void Initialize(IronSchemeLanguageProvider ironSchemeLanguageProvider)
        {
            lp = ironSchemeLanguageProvider;
              se = lp.GetEngine() as IronSchemeScriptEngine;

              scriptmodule = ScriptDomainManager.CurrentManager.Host.DefaultModule as ScriptModule;

              ModuleContext mc = new ModuleContext(scriptmodule);

              mc.CompilerContext = new CompilerContext(SourceUnit.CreateSnippet(se, ""));

              cc = new CodeContext(scriptmodule.Scope, se.GetLanguageContext(), mc);

              binder = new IronScheme.Actions.IronSchemeActionBinder(cc);

              Generator.initme = true;
        }
示例#4
0
        public ModuleContext EnsureModuleContext(ScriptModule module)
        {
            Contract.RequiresNotNull(module, "module");
            ModuleContext context = module.GetModuleContext(ContextId);

            if (context == null)
            {
                context = CreateModuleContext(module);
                if (context == null)
                {
                    throw new InvalidImplementationException("CreateModuleContext must return a module context.");
                }
                return(module.SetModuleContext(ContextId, context));
            }

            return(context);
        }
示例#5
0
        public Shell(string languageId, string name)
        {
            this.languageId = languageId;
            this.moduleName = name;
            this.provider = ScriptDomainManager.CurrentManager.GetLanguageProvider(languageId);
            this.engine = provider.GetEngine();
            this.module = ScriptDomainManager.CurrentManager.CreateModule(name);
            this.module.FileName = "SilverStunts";

            reprDelegate = engine.EvaluateAs<ReprDelegate>("repr");

            // TODO: bring WPF symbols into scripting namespace
            //ScriptModule wpf = ScriptDomainManager.CurrentManager.CreateModule("wpf");
            //Stream s = this.GetType().Assembly.GetManifestResourceStream("SilverStunts.WPF.py");
            //string code = new StreamReader(s).ReadToEnd();
            //engine.Execute(code, wpf);
            //module.SetVariable("wpf", wpf);
        }
示例#6
0
 protected override LanguageContext GetLanguageContext(ScriptModule module)
 {
     return _defaultContext;
 }
示例#7
0
 public virtual ScriptCode Reload(ScriptCode original, ScriptModule module)
 {
     original.SourceUnit.Reload();
     return CompileSourceCode(original.SourceUnit, Engine.GetModuleCompilerOptions(module));
 }
示例#8
0
 public ModuleContext GetModuleContext(ScriptModule module)
 {
     Contract.RequiresNotNull(module, "module");
     return module.GetModuleContext(ContextId);
 }
示例#9
0
 /// <summary>
 /// Factory for ModuleContext creation. 
 /// It is guaranteed that this method is called once per each ScriptModule the langauge code is executed within.
 /// </summary>
 /// <param name="module">The module the context will be associated with.</param>
 /// <returns>Non-<c>null</c> module context instance.</returns>
 public virtual ModuleContext CreateModuleContext(ScriptModule module)
 {
     return new ModuleContext(module);
 }
示例#10
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;
        }
示例#11
0
 /// <summary>
 /// Creates a module context.
 /// </summary>
 /// <param name="module">Optional. <c>null</c> for default and invariant contexts.</param>
 public ModuleContext(ScriptModule module)
 {
     _module = module;
 }
示例#12
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);
        }
示例#13
0
 public ModuleContext GetModuleContext(ScriptModule module)
 {
     Contract.RequiresNotNull(module, "module");
     return(module.GetModuleContext(ContextId));
 }
示例#14
0
 public virtual ScriptCode Reload(ScriptCode original, ScriptModule module)
 {
     original.SourceUnit.Reload();
     return(CompileSourceCode(original.SourceUnit, Engine.GetModuleCompilerOptions(module)));
 }
示例#15
0
 /// <summary>
 /// Factory for ModuleContext creation.
 /// It is guaranteed that this method is called once per each ScriptModule the langauge code is executed within.
 /// </summary>
 /// <param name="module">The module the context will be associated with.</param>
 /// <returns>Non-<c>null</c> module context instance.</returns>
 public virtual ModuleContext CreateModuleContext(ScriptModule module)
 {
     return(new ModuleContext(module));
 }
示例#16
0
        /// <summary>
        /// Gets the ScriptModule that has been published under the given SourceUnit.
        /// </summary>
        public bool TryGetScriptModule(string publicName, out ScriptModule module)
        {
            if (_modules == null) {
                module = null;
                return false;
            }

            lock(_modules) {
                module = GetCachedModuleNoLock(publicName);
            }

            return module != null;
        }
示例#17
0
        /// <summary>
        /// Sets the ScriptModule that is registered for the given SourceUnit.
        /// </summary>
        public void PublishModule(ScriptModule module, string publicName)
        {
            Contract.RequiresNotNull(module, "module");
            Contract.RequiresNotNull(publicName, "publicName");

            EnsureModules();

            lock (_modules) {
                _modules[publicName] = new WeakReference(module);
            }
        }
示例#18
0
 public void PublishModule(ScriptModule module)
 {
     Contract.RequiresNotNull(module, "module");
     Contract.Requires(module.FileName != null, "module", "Cannot publish module with null file name");
     PublishModule(module, module.FileName);
 }
示例#19
0
 public void PublishModule(ScriptModule module)
 {
     Contract.RequiresNotNull(module, "module");
     Contract.Requires(module.FileName != null, "module", "Cannot publish module with null file name");
     PublishModule(module, module.FileName);
 }
示例#20
0
        private ScriptModule CompileAndPublishModule(string moduleName, SourceUnit su)
        {
            Assert.NotNull(moduleName, su);

            EnsureModules();

            string key = su.Id ?? moduleName;

            // check if we've already published this SourceUnit
            lock (_modules) {
                ScriptModule tmp = GetCachedModuleNoLock(key);
                if (tmp != null)
                {
                    return(tmp);
                }
            }

            // compile and initialize the module...
            ScriptModule mod = CompileModule(moduleName, su);

            lock (_modules) {
                // check if someone else compiled it first...
                ScriptModule tmp = GetCachedModuleNoLock(key);
                if (tmp != null)
                {
                    return(tmp);
                }

                LoadInfo load;
                if (_loading.TryGetValue(key, out load))
                {
                    if (load.Thread == Thread.CurrentThread)
                    {
                        return(load.Module);
                    }

                    Monitor.Exit(_modules);
                    try {
                        lock (load) {
                            if (!load.Done)
                            {
                                if (load.Mre == null)
                                {
                                    load.Mre = new ManualResetEvent(false);
                                }

                                Monitor.Exit(load);
                                try {
                                    load.Mre.WaitOne();
                                } finally {
                                    Monitor.Enter(load);
                                }
                            }
                        }
                        if (load.Module != null)
                        {
                            return(load.Module);
                        }

                        throw load.Exception;
                    } finally {
                        Monitor.Enter(_modules);
                    }
                }
                load          = new LoadInfo();
                load.Module   = mod;
                load.Thread   = Thread.CurrentThread;
                _loading[key] = load;

                bool success = false;

                Monitor.Exit(_modules);
                try {
                    mod.Execute();
                    success = true;
                    lock (load) {
                        load.Done = true;
                        if (load.Mre != null)
                        {
                            load.Mre.Set();
                        }
                    }
                    return(mod);
                } catch (Exception e) {
                    lock (load) {
                        load.Exception = e;
                        load.Done      = true;
                        if (load.Mre != null)
                        {
                            load.Mre.Set();
                        }
                    }
                    throw;
                } finally {
                    Monitor.Enter(_modules);
                    _loading.Remove(key);
                    if (success)
                    {
                        _modules[key] = new WeakReference(mod);
                    }
                }
            }
        }
示例#21
0
 internal RemoteScriptModule(ScriptModule module)
 {
     Debug.Assert(module != null);
     _module = module;
 }
 public void BindGeneratedCodeToModule(ScriptModule module)
 {
     Assert.NotNull(module);
     foreach (CodeContext codeContext in _codeContexts) {
         codeContext.ModuleContext = codeContext.LanguageContext.EnsureModuleContext(module);
     }
 }
示例#23
0
        public object Run(ScriptModule module) {
            Contract.RequiresNotNull(module, "module");

            ModuleContext moduleContext = _languageContext.EnsureModuleContext(module);
            return Run(new CodeContext(module.Scope, _languageContext, moduleContext), false);
        }
示例#24
0
 protected override LanguageContext GetLanguageContext(ScriptModule module)
 {
     return this.LanguageContext;
 }
 internal RemoteScriptModule(ScriptModule module) {
     Debug.Assert(module != null);
     _module = module;
 }