Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9c07278

Browse files
committed
fixed ImportHook not seeing namespaces in assemblies loaded via direct call to Assembly.Load* methods
1 parent0a68ca7 commit9c07278

File tree

5 files changed

+36
-9
lines changed

5 files changed

+36
-9
lines changed

‎src/python_tests_runner/PythonTestRunner.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ static IEnumerable<string[]> PythonTestCases()
3434
{
3535
// Add the test that you want to debug here.
3636
yieldreturnnew[]{"test_enum","test_enum_standard_attrs"};
37-
yieldreturnnew[]{"test_module","test_explicit_assembly_load"};
37+
yieldreturnnew[]{"test_generic","test_missing_generic_type"};
3838
}
3939

4040
/// <summary>

‎src/runtime/assemblymanager.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,10 @@ internal static void ScanAssembly(Assembly assembly)
290290
for(varn=0;n<names.Length;n++)
291291
{
292292
s=n==0?names[0]:s+"."+names[n];
293-
namespaces.TryAdd(s,newConcurrentDictionary<Assembly,string>());
293+
if(namespaces.TryAdd(s,newConcurrentDictionary<Assembly,string>()))
294+
{
295+
ImportHook.AddNamespace(s);
296+
}
294297
}
295298
}
296299

‎src/runtime/importhook.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
usingSystem;
2-
usingSystem.Collections.Generic;
3-
usingSystem.Runtime.InteropServices;
2+
usingSystem.Collections.Concurrent;
43

54
namespacePython.Runtime
65
{
@@ -37,6 +36,11 @@ def find_spec(klass, fullname, paths=None, target=None):
3736
if 'clr' not in sys.modules:
3837
return None
3938
clr = sys.modules['clr']
39+
40+
_add_pending = clr._add_pending_namespaces
41+
if _add_pending:
42+
_add_pending()
43+
4044
if clr._available_namespaces and fullname in clr._available_namespaces:
4145
return importlib.machinery.ModuleSpec(fullname, DotNetLoader(), is_package=True)
4246
return None
@@ -169,12 +173,26 @@ static void TeardownNameSpaceTracking()
169173
Runtime.PyDict_SetItemString(root.dict,availableNsKey,Runtime.PyNone);
170174
}
171175

172-
publicstaticvoidAddNamespace(stringname)
176+
staticreadonlyConcurrentQueue<string>addPending=new();
177+
publicstaticvoidAddNamespace(stringname)=>addPending.Enqueue(name);
178+
179+
internalstaticintAddPendingNamespaces()
180+
{
181+
intadded=0;
182+
while(addPending.TryDequeue(outstringns))
183+
{
184+
AddNamespaceWithGIL(ns);
185+
added++;
186+
}
187+
returnadded;
188+
}
189+
190+
internalstaticvoidAddNamespaceWithGIL(stringname)
173191
{
174192
varpyNs=Runtime.PyString_FromString(name);
175193
try
176194
{
177-
varnsSet=Runtime.PyDict_GetItemString(newBorrowedReference(root.dict),availableNsKey);
195+
varnsSet=Runtime.PyDict_GetItemString(root.DictRef,availableNsKey);
178196
if(!(nsSet.IsNull||nsSet.DangerousGetAddress()==Runtime.PyNone))
179197
{
180198
if(Runtime.PySet_Add(nsSet,newBorrowedReference(pyNs))!=0)

‎src/runtime/moduleobject.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -535,8 +535,9 @@ public static Assembly AddReference(string name)
535535
// method because it may be called from other threads, leading to deadlocks
536536
// if it is called while Python code is executing.
537537
varcurrNs=AssemblyManager.GetNamespaces().Except(origNs);
538-
foreach(varnsincurrNs){
539-
ImportHook.AddNamespace(ns);
538+
foreach(varnsincurrNs)
539+
{
540+
ImportHook.AddNamespaceWithGIL(ns);
540541
}
541542
returnassembly;
542543
}
@@ -602,5 +603,9 @@ public static ModuleObject _load_clr_module(PyObject spec)
602603
mod=ImportHook.Import(modname.ToString());
603604
returnmod;
604605
}
606+
607+
[ModuleFunction]
608+
[ForbidPythonThreads]
609+
publicstaticint_add_pending_namespaces()=>ImportHook.AddPendingNamespaces();
605610
}
606611
}

‎src/runtime/native/TypeOffset.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ static void ValidateRequiredOffsetsPresent(PropertyInfo[] offsetProperties)
161161
"Initialize",
162162
"InitializeSlots",
163163
"ListAssemblies",
164-
"_load_clr_module",
164+
nameof(CLRModule._load_clr_module),
165+
nameof(CLRModule._add_pending_namespaces),
165166
"Release",
166167
"Reset",
167168
"set_SuppressDocs",

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp