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); }
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); }
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); }
public void HandlersOfEmptyModuleReturnsExpectedResult() { var sut = new EmptyModule(); Assert.Empty(sut.Handlers); }
public void GetEnumeratorReturnsExpectedResult() { var sut = new EmptyModule(); Assert.IsType <CommandHandlerEnumerator>(sut.GetEnumerator()); }
public void IsEnumerableOfCommandHandler() { var sut = new EmptyModule(); Assert.IsAssignableFrom <IEnumerable <CommandHandler> >(sut); }