Skip to content

Commit d238444

Browse files
committed
Merge pull request #980 from filipw/bugfix/964
Only use fast path when extension is CSX or none
2 parents 4923313 + 9e7b063 commit d238444

2 files changed

Lines changed: 17 additions & 3 deletions

File tree

src/ScriptCs.Hosting/ModuleLoader.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class ModuleLoader : IModuleLoader
1818
{"mono", "ScriptCs.Engine.Mono.dll"}
1919
};
2020

21+
internal static readonly string DefaultCSharpExtension = ".csx";
22+
2123
private readonly IAssemblyResolver _resolver;
2224
private readonly ILog _logger;
2325
private readonly Action<Assembly, AggregateCatalog> _addToCatalog;
@@ -69,7 +71,8 @@ public void Load(IModuleConfiguration config, string[] modulePackagesPaths, stri
6971
{
7072
if (modulePackagesPaths == null) return;
7173

72-
if (moduleNames.Length == 1 && DefaultCSharpModules.ContainsKey(moduleNames[0])) // only CSharp module needed
74+
// only CSharp module needed - use fast path
75+
if (moduleNames.Length == 1 && DefaultCSharpModules.ContainsKey(moduleNames[0]) && (string.IsNullOrWhiteSpace(extension) || extension.Equals(DefaultCSharpExtension, StringComparison.InvariantCultureIgnoreCase)))
7376
{
7477
_logger.Debug("Only CSharp module is needed - will skip module lookup");
7578
var csharpModuleAssembly = DefaultCSharpModules[moduleNames[0]];

test/ScriptCs.Hosting.Tests/ModuleLoaderTests.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void ShouldLoadEngineAssemblyByHandIfItsTheOnlyModule()
117117
var path = Path.Combine("c:\\foo", ModuleLoader.DefaultCSharpModules["roslyn"]);
118118
_mockAssemblyUtility.Setup(x => x.LoadFile(path));
119119
var loader = new ModuleLoader(_mockAssemblyResolver.Object, _mockLogger.Object, (a, c) => { }, _getModules, _mockFileSystem.Object, _mockAssemblyUtility.Object);
120-
loader.Load(null, new string[0], "c:\\foo", null, "roslyn");
120+
loader.Load(null, new string[0], "c:\\foo", ModuleLoader.DefaultCSharpExtension, "roslyn");
121121

122122
_mockAssemblyUtility.Verify(x => x.LoadFile(path), Times.Once());
123123
}
@@ -130,11 +130,22 @@ public void ShouldLoadEngineModuleFromFile()
130130

131131
var config = new ModuleConfiguration(true, string.Empty, false, LogLevel.Debug, true,
132132
new Dictionary<Type, object> {{typeof (string), "not loaded"}});
133-
loader.Load(config, new string[0], "c:\\foo", null, "roslyn");
133+
loader.Load(config, new string[0], "c:\\foo", ModuleLoader.DefaultCSharpExtension, "roslyn");
134134

135135
config.Overrides[typeof(string)].ShouldEqual("module loaded");
136136
}
137137

138+
[Fact]
139+
public void ShouldNotLoadEngineAssemblyByHandIfItsTheOnlyModuleButExtensionIsNotDefault()
140+
{
141+
var path = Path.Combine("c:\\foo", ModuleLoader.DefaultCSharpModules["roslyn"]);
142+
_mockAssemblyUtility.Setup(x => x.LoadFile(path));
143+
var loader = new ModuleLoader(_mockAssemblyResolver.Object, _mockLogger.Object, (a, c) => { }, _getModules, _mockFileSystem.Object, _mockAssemblyUtility.Object);
144+
145+
loader.Load(null, new string[0], "c:\\foo", ".fsx", "roslyn");
146+
_mockAssemblyUtility.Verify(x => x.LoadFile(It.IsAny<string>()), Times.Never);
147+
}
148+
138149
public class ModuleMetadata : IModuleMetadata
139150
{
140151
public string Name { get; set; }

0 commit comments

Comments
 (0)