From b8964f4d9001b0adad338944da2797350530cccd Mon Sep 17 00:00:00 2001 From: filipw Date: Sat, 21 Mar 2015 20:18:10 +0100 Subject: [PATCH 1/3] only use fast path when extension is CSX or none --- src/ScriptCs.Hosting/ModuleLoader.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ScriptCs.Hosting/ModuleLoader.cs b/src/ScriptCs.Hosting/ModuleLoader.cs index 0f460596..b706f382 100644 --- a/src/ScriptCs.Hosting/ModuleLoader.cs +++ b/src/ScriptCs.Hosting/ModuleLoader.cs @@ -18,6 +18,8 @@ public class ModuleLoader : IModuleLoader {"mono", "ScriptCs.Engine.Mono.dll"} }; + internal static readonly string DefaultCSharpExtension = ".csx"; + private readonly IAssemblyResolver _resolver; private readonly ILog _logger; private readonly Action _addToCatalog; @@ -69,7 +71,8 @@ public void Load(IModuleConfiguration config, string[] modulePackagesPaths, stri { if (modulePackagesPaths == null) return; - if (moduleNames.Length == 1 && DefaultCSharpModules.ContainsKey(moduleNames[0])) // only CSharp module needed + // only CSharp module needed - use fast path + if (moduleNames.Length == 1 && DefaultCSharpModules.ContainsKey(moduleNames[0]) && (extension == DefaultCSharpExtension || string.IsNullOrWhiteSpace(extension))) { _logger.Debug("Only CSharp module is needed - will skip module lookup"); var csharpModuleAssembly = DefaultCSharpModules[moduleNames[0]]; From 88144366807861181a60283d59eb160317d72c5a Mon Sep 17 00:00:00 2001 From: filipw Date: Sat, 21 Mar 2015 20:18:19 +0100 Subject: [PATCH 2/3] added tests --- test/ScriptCs.Hosting.Tests/ModuleLoaderTests.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/test/ScriptCs.Hosting.Tests/ModuleLoaderTests.cs b/test/ScriptCs.Hosting.Tests/ModuleLoaderTests.cs index 8439162a..8266b601 100644 --- a/test/ScriptCs.Hosting.Tests/ModuleLoaderTests.cs +++ b/test/ScriptCs.Hosting.Tests/ModuleLoaderTests.cs @@ -117,7 +117,7 @@ public void ShouldLoadEngineAssemblyByHandIfItsTheOnlyModule() var path = Path.Combine("c:\\foo", ModuleLoader.DefaultCSharpModules["roslyn"]); _mockAssemblyUtility.Setup(x => x.LoadFile(path)); var loader = new ModuleLoader(_mockAssemblyResolver.Object, _mockLogger.Object, (a, c) => { }, _getModules, _mockFileSystem.Object, _mockAssemblyUtility.Object); - loader.Load(null, new string[0], "c:\\foo", null, "roslyn"); + loader.Load(null, new string[0], "c:\\foo", ModuleLoader.DefaultCSharpExtension, "roslyn"); _mockAssemblyUtility.Verify(x => x.LoadFile(path), Times.Once()); } @@ -130,11 +130,22 @@ public void ShouldLoadEngineModuleFromFile() var config = new ModuleConfiguration(true, string.Empty, false, LogLevel.Debug, true, new Dictionary {{typeof (string), "not loaded"}}); - loader.Load(config, new string[0], "c:\\foo", null, "roslyn"); + loader.Load(config, new string[0], "c:\\foo", ModuleLoader.DefaultCSharpExtension, "roslyn"); config.Overrides[typeof(string)].ShouldEqual("module loaded"); } + [Fact] + public void ShouldNotLoadEngineAssemblyByHandIfItsTheOnlyModuleButExtensionIsNotDefault() + { + var path = Path.Combine("c:\\foo", ModuleLoader.DefaultCSharpModules["roslyn"]); + _mockAssemblyUtility.Setup(x => x.LoadFile(path)); + var loader = new ModuleLoader(_mockAssemblyResolver.Object, _mockLogger.Object, (a, c) => { }, _getModules, _mockFileSystem.Object, _mockAssemblyUtility.Object); + + loader.Load(null, new string[0], "c:\\foo", ".fsx", "roslyn"); + _mockAssemblyUtility.Verify(x => x.LoadFile(It.IsAny()), Times.Never); + } + public class ModuleMetadata : IModuleMetadata { public string Name { get; set; } From 9e7b063ec2111d16e27dc9cd3ee009da9d3d5d02 Mon Sep 17 00:00:00 2001 From: filipw Date: Sat, 21 Mar 2015 21:53:53 +0100 Subject: [PATCH 3/3] ignore case when comparing extension --- src/ScriptCs.Hosting/ModuleLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ScriptCs.Hosting/ModuleLoader.cs b/src/ScriptCs.Hosting/ModuleLoader.cs index b706f382..3046753b 100644 --- a/src/ScriptCs.Hosting/ModuleLoader.cs +++ b/src/ScriptCs.Hosting/ModuleLoader.cs @@ -72,7 +72,7 @@ public void Load(IModuleConfiguration config, string[] modulePackagesPaths, stri if (modulePackagesPaths == null) return; // only CSharp module needed - use fast path - if (moduleNames.Length == 1 && DefaultCSharpModules.ContainsKey(moduleNames[0]) && (extension == DefaultCSharpExtension || string.IsNullOrWhiteSpace(extension))) + if (moduleNames.Length == 1 && DefaultCSharpModules.ContainsKey(moduleNames[0]) && (string.IsNullOrWhiteSpace(extension) || extension.Equals(DefaultCSharpExtension, StringComparison.InvariantCultureIgnoreCase))) { _logger.Debug("Only CSharp module is needed - will skip module lookup"); var csharpModuleAssembly = DefaultCSharpModules[moduleNames[0]];