From 0295dd274b9dd87de388f746d876af5ac6f8dfb9 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 13 Jan 2025 09:27:50 -0600 Subject: [PATCH] Implement binding manager to hold binding overrides --- src/runtime/BindingOptions.cs | 65 ++++++++++++++++++++++++++++++++++ src/runtime/ClassManager.cs | 5 +-- src/runtime/Types/ClrModule.cs | 13 +++---- 3 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 src/runtime/BindingOptions.cs diff --git a/src/runtime/BindingOptions.cs b/src/runtime/BindingOptions.cs new file mode 100644 index 000000000..6541d6580 --- /dev/null +++ b/src/runtime/BindingOptions.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace Python.Runtime +{ + public class BindingOptions + { + private bool _SuppressDocs = false; + private bool _SuppressOverloads = false; + + //[ModuleProperty] + public bool SuppressDocs + { + get { return _SuppressDocs; } + set { _SuppressDocs = value; } + } + + //[ModuleProperty] + public bool SuppressOverloads + { + get { return _SuppressOverloads; } + set { _SuppressOverloads = value; } + } + } + + public class BindingManager + { + static IDictionary _typeOverrides = new Dictionary(); + static IDictionary _assemblyOverrides = new Dictionary(); + static BindingOptions _defaultBindingOptions = new BindingOptions(); + + public static BindingOptions GetBindingOptions(Type type) + { + if (_typeOverrides.ContainsKey(type)) + { + return _typeOverrides[type]; + } + + if (_assemblyOverrides.ContainsKey(type.Assembly)) + { + return _assemblyOverrides[type.Assembly]; + } + return _defaultBindingOptions; + } + + public static BindingOptions DefaultBindingOptions => _defaultBindingOptions; + + public static void SetBindingOptions(Type type, BindingOptions options) + { + _typeOverrides[type] = options; + } + + public static void SetBindingOptions(Assembly assembly, BindingOptions options) + { + _assemblyOverrides[assembly] = options; + } + + public static void Clear() + { + _typeOverrides.Clear(); + _assemblyOverrides.Clear(); + } + } +} diff --git a/src/runtime/ClassManager.cs b/src/runtime/ClassManager.cs index d743bc006..fe6785f63 100644 --- a/src/runtime/ClassManager.cs +++ b/src/runtime/ClassManager.cs @@ -210,6 +210,7 @@ internal static void InitClassBase(Type type, ClassBase impl, ReflectedClrType p // information, including generating the member descriptors // that we'll be putting in the Python class __dict__. + var bindingOptions = BindingManager.GetBindingOptions(type); ClassInfo info = GetClassInfo(type, impl); impl.indexer = info.indexer; @@ -254,7 +255,7 @@ internal static void InitClassBase(Type type, ClassBase impl, ReflectedClrType p if (co.NumCtors > 0 && !co.HasCustomNew()) { // Implement Overloads on the class object - if (!CLRModule._SuppressOverloads) + if (!bindingOptions.SuppressOverloads) { // HACK: __init__ points to instance constructors. // When unbound they fully instantiate object, so we get overloads for free from MethodBinding. @@ -265,7 +266,7 @@ internal static void InitClassBase(Type type, ClassBase impl, ReflectedClrType p } // don't generate the docstring if one was already set from a DocStringAttribute. - if (!CLRModule._SuppressDocs && doc.IsNull()) + if (!bindingOptions.SuppressDocs && doc.IsNull()) { doc = co.GetDocString(); Runtime.PyDict_SetItem(dict, PyIdentifier.__doc__, doc.Borrow()); diff --git a/src/runtime/Types/ClrModule.cs b/src/runtime/Types/ClrModule.cs index b7d10260c..c99152787 100644 --- a/src/runtime/Types/ClrModule.cs +++ b/src/runtime/Types/ClrModule.cs @@ -16,7 +16,6 @@ internal class CLRModule : ModuleObject protected static bool interactive_preload = true; internal static bool preload; // XXX Test performance of new features // - internal static bool _SuppressDocs = false; internal static bool _SuppressOverloads = false; static CLRModule() @@ -39,10 +38,6 @@ public static void Reset() { interactive_preload = true; preload = false; - - // XXX Test performance of new features // - _SuppressDocs = false; - _SuppressOverloads = false; } /// @@ -82,15 +77,15 @@ public static void setPreload(bool preloadFlag) //[ModuleProperty] public static bool SuppressDocs { - get { return _SuppressDocs; } - set { _SuppressDocs = value; } + get { return BindingManager.DefaultBindingOptions.SuppressDocs; } + set { BindingManager.DefaultBindingOptions.SuppressDocs = value; } } //[ModuleProperty] public static bool SuppressOverloads { - get { return _SuppressOverloads; } - set { _SuppressOverloads = value; } + get { return BindingManager.DefaultBindingOptions.SuppressOverloads; } + set { BindingManager.DefaultBindingOptions.SuppressOverloads = value; } } [ModuleFunction]