◐ Shell
reader mode source ↗
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
File filter
Conversations
Jump to
Diff view
Apply and reload
Show whitespace
Diff view
Apply and reload
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
### Fixed

- Fixed RecursionError for reverse operators on C# operable types from python. See #2240
- Fixed probing for assemblies in `sys.path` failing when a path in `sys.path` has invalid characters. See #2376

## [3.0.3](https://github.com/pythonnet/pythonnet/releases/tag/v3.0.3) - 2023-10-11
Expand Down
4 changes: 3 additions & 1 deletion src/runtime/ClassManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -290,11 +290,13 @@ internal static void InitClassBase(Type type, ClassBase impl, ReflectedClrType p

internal static bool ShouldBindMethod(MethodBase mb)
{
return (mb.IsPublic || mb.IsFamily || mb.IsFamilyOrAssembly);
}

internal static bool ShouldBindField(FieldInfo fi)
{
return (fi.IsPublic || fi.IsFamily || fi.IsFamilyOrAssembly);
}

Expand Down Expand Up @@ -326,7 +328,7 @@ internal static bool ShouldBindProperty(PropertyInfo pi)

internal static bool ShouldBindEvent(EventInfo ei)
{
return ShouldBindMethod(ei.GetAddMethod(true));
}

private static ClassInfo GetClassInfo(Type type, ClassBase impl)
Expand Down
9 changes: 9 additions & 0 deletions src/runtime/InternalPythonnetException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
31 changes: 19 additions & 12 deletions src/runtime/Types/ReflectedClrType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,29 @@ public static ReflectedClrType GetOrCreate(Type type)
return pyType;
}

// Ensure, that matching Python type exists first.
// It is required for self-referential classes
// (e.g. with members, that refer to the same class)
pyType = AllocateClass(type);
ClassManager.cache.Add(type, pyType);

var impl = ClassManager.CreateClass(type);

TypeManager.InitializeClassCore(type, pyType, impl);

ClassManager.InitClassBase(type, impl, pyType);

// Now we force initialize the Python type object to reflect the given
// managed type, filling the Python type slots with thunks that
// point to the managed methods providing the implementation.
TypeManager.InitializeClass(pyType, impl, type);

return pyType;
}
Expand Down
Toggle all file notes Toggle all file annotations