Esempio n. 1
0
        private IPythonModule GetModule()
        {
            var mod = Volatile.Read(ref _module);

            if (mod != null)
            {
                return(mod);
            }

            foreach (var n in _importNames)
            {
                mod = _interpreter.ImportModule(n);
                if (mod != null)
                {
                    Debug.Assert(!(mod is AstNestedPythonModule), "ImportModule should not return nested module");
                    break;
                }
            }
            if (mod == null)
            {
                mod = new EmptyModule();
            }

            return(Interlocked.CompareExchange(ref _module, mod, null) ?? mod);
        }
Esempio n. 2
0
        public IPythonModule ImportModule(string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                return(null);
            }

            // Handle builtins explicitly
            if (name == BuiltinModuleName)
            {
                if (_builtinModule == null)
                {
                    _modules[BuiltinModuleName] = _builtinModule = new AstBuiltinsPythonModule(_factory.LanguageVersion);
                    _builtinModule.Imported(this);
                    var bmn = ((AstBuiltinsPythonModule)_builtinModule).GetAnyMember("__builtin_module_names") as AstPythonStringLiteral;
                    _builtinModuleNames = bmn?.Value?.Split(',');
                }
                return(_builtinModule);
            }

            IPythonModule mod;

            // Return any existing module
            if (_modules.TryGetValue(name, out mod) && mod != null)
            {
                if (mod is EmptyModule)
                {
                    Trace.TraceWarning($"Recursively importing {name}");
                }
                return(mod);
            }

            // Set up a sentinel so we can detect recursive imports
            var sentinalValue = new EmptyModule();

            if (!_modules.TryAdd(name, sentinalValue))
            {
                return(_modules[name]);
            }

            // Do normal searches
            mod = ImportFromBuiltins(name) ?? ImportFromSearchPaths(name);

            // Replace our sentinel, or if we raced, get the current
            // value and abandon the one we just created.
            if (!_modules.TryUpdate(name, mod, sentinalValue))
            {
                mod = _modules[name];
            }

            return(mod);
        }
Esempio n. 3
0
        public IPythonModule ImportModule(string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                return(null);
            }

            IPythonModule mod;

            if (_modules.TryGetValue(name, out mod) && mod != null)
            {
                if (mod is EmptyModule)
                {
                    Trace.TraceWarning($"Recursively importing {name}");
                }
                return(mod);
            }
            var sentinalValue = new EmptyModule();

            if (!_modules.TryAdd(name, sentinalValue))
            {
                return(_modules[name]);
            }

            var mmp = FindModuleInSearchPath(_userSearchPaths, GetUserSearchPathPackages(), name);

            if (mmp.HasValue)
            {
                lock (_userSearchPathsLock) {
                    if (_userSearchPathImported == null)
                    {
                        _userSearchPathImported = new HashSet <string>();
                    }
                    _userSearchPathImported.Add(name);
                }
            }
            else
            {
                mmp = FindModuleInSearchPath(_factory.GetSearchPaths(), _factory.GetImportableModules(), name);
            }

            if (!mmp.HasValue)
            {
                if (!_modules.TryUpdate(name, null, sentinalValue))
                {
                    return(_modules[name]);
                }
                return(null);
            }

            var mp = mmp.Value;

            if (mp.IsCompiled)
            {
                mod = new AstScrapedPythonModule(mp.FullName, mp.SourceFile);
            }
            else
            {
                mod = AstPythonModule.FromFile(this, mp.SourceFile, _factory.LanguageVersion, mp.FullName);
            }

            if (!_modules.TryUpdate(name, mod, sentinalValue))
            {
                mod = _modules[name];
            }

            return(mod);
        }
Esempio n. 4
0
        public void HandlersOfEmptyModuleReturnsExpectedResult()
        {
            var sut = new EmptyModule();

            Assert.Empty(sut.Handlers);
        }
Esempio n. 5
0
        public void GetEnumeratorReturnsExpectedResult()
        {
            var sut = new EmptyModule();

            Assert.IsType <CommandHandlerEnumerator>(sut.GetEnumerator());
        }
Esempio n. 6
0
        public void IsEnumerableOfCommandHandler()
        {
            var sut = new EmptyModule();

            Assert.IsAssignableFrom <IEnumerable <CommandHandler> >(sut);
        }