Skip to content

Commit 6b20409

Browse files
committed
refactored LoadExtraModules for Mixins into LoadSubmodule + LoadMixins
1 parent a38849e commit 6b20409

File tree

2 files changed

+35
-14
lines changed

2 files changed

+35
-14
lines changed

src/runtime/Util.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,17 @@ internal static void WriteCLong(IntPtr type, int offset, Int64 flags)
4444
/// </summary>
4545
internal static IntPtr Coalesce(this IntPtr primary, IntPtr fallback)
4646
=> primary == IntPtr.Zero ? fallback : primary;
47+
48+
/// <summary>
49+
/// Gets substring after last occurrence of <paramref name="symbol"/>
50+
/// </summary>
51+
internal static string AfterLast(this string str, char symbol)
52+
{
53+
if (str is null)
54+
throw new ArgumentNullException(nameof(str));
55+
56+
int last = str.LastIndexOf(symbol);
57+
return last >= 0 ? str.Substring(last + 1) : null;
58+
}
4759
}
4860
}

src/runtime/pythonengine.cs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.IO;
45
using System.Linq;
56
using System.Reflection;
@@ -235,7 +236,7 @@ public static void Initialize(IEnumerable<string> args, bool setSysArgv = true,
235236
Exec(clr_py, module_globals, locals.Reference);
236237
}
237238

238-
LoadExtraModules(module_globals);
239+
LoadMixins(module_globals);
239240

240241
// add the imported module to the clr module, and copy the API functions
241242
// and decorators into the main clr module.
@@ -267,23 +268,31 @@ static BorrowedReference DefineModule(string name)
267268
return module;
268269
}
269270

270-
static void LoadExtraModules(BorrowedReference targetModuleDict)
271+
static void LoadMixins(BorrowedReference targetModuleDict)
271272
{
272-
Assembly assembly = Assembly.GetExecutingAssembly();
273-
foreach (string nested in new[] { "collections" })
273+
foreach (string nested in new[] {"collections"})
274274
{
275-
var module = DefineModule("clr._extras." + nested);
276-
var module_globals = Runtime.PyModule_GetDict(module);
277-
string resourceName = typeof(PythonEngine).Namespace + ".Mixins." + nested + ".py";
278-
using (var stream = assembly.GetManifestResourceStream(resourceName))
279-
using (var reader = new StreamReader(stream))
280-
{
281-
string pyCode = reader.ReadToEnd();
282-
Exec(pyCode, module_globals.DangerousGetAddress(), module_globals.DangerousGetAddress());
283-
}
275+
LoadSubmodule(targetModuleDict,
276+
fullName: "clr._extras." + nested,
277+
resourceName: typeof(PythonEngine).Namespace + ".Mixins." + nested + ".py");
278+
}
279+
}
284280

285-
Runtime.PyDict_SetItemString(targetModuleDict, nested, module);
281+
static void LoadSubmodule(BorrowedReference targetModuleDict, string fullName, string resourceName)
282+
{
283+
string memberName = fullName.AfterLast('.');
284+
Debug.Assert(memberName != null);
285+
Assembly assembly = Assembly.GetExecutingAssembly();
286+
var module = DefineModule(fullName);
287+
var module_globals = Runtime.PyModule_GetDict(module);
288+
using (var stream = assembly.GetManifestResourceStream(resourceName))
289+
using (var reader = new StreamReader(stream))
290+
{
291+
string pyCode = reader.ReadToEnd();
292+
Exec(pyCode, module_globals.DangerousGetAddress(), module_globals.DangerousGetAddress());
286293
}
294+
295+
Runtime.PyDict_SetItemString(targetModuleDict, memberName, module);
287296
}
288297

289298
static void OnDomainUnload(object _, EventArgs __)

0 commit comments

Comments
 (0)