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] pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy