Skip to content

Commit

Permalink
Minor refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
jhonabreul committed Apr 19, 2024
1 parent 5ff973d commit 6402fa5
Showing 1 changed file with 6 additions and 15 deletions.
21 changes: 6 additions & 15 deletions src/runtime/Types/DynamicClassObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ private static CallSite<Func<CallSite, object, object, object>> SetAttrCallSite(
/// </summary>
public static NewReference tp_getattro(BorrowedReference ob, BorrowedReference key)
{
if (!HasNonDynamicMember(ob, key, out var result))
if (!TryGetNonDynamicMember(ob, key, out var result))
{
var clrObj = (CLRObject)GetManagedObject(ob)!;

Expand Down Expand Up @@ -100,23 +100,14 @@ public static NewReference tp_getattro(BorrowedReference ob, BorrowedReference k
/// </summary>
public static int tp_setattro(BorrowedReference ob, BorrowedReference key, BorrowedReference val)
{
var clrObj = (CLRObject)GetManagedObject(ob)!;
var name = Runtime.GetManagedString(key);

// If the key corresponds to a valid property or field of the class, we let the default implementation handle it.
var clrObjectType = clrObj.inst.GetType();
var bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
var property = clrObjectType.GetProperty(name, bindingFlags);
var field = property == null ? clrObjectType.GetField(name, bindingFlags) : null;
if ((property != null && property.SetMethod != null) ||
field != null ||
// Not defined as property in the class, try with the snake case version of it before letting DynamicObject handle it.
HasNonDynamicMember(ob, key, out _, clearExceptions: true))
if (TryGetNonDynamicMember(ob, key, out _, clearExceptions: true))
{
return Runtime.PyObject_GenericSetAttr(ob, key, val);
}

var callsite = SetAttrCallSite(name, clrObjectType);
var clrObj = (CLRObject)GetManagedObject(ob)!;
var name = Runtime.GetManagedString(key);
var callsite = SetAttrCallSite(name, clrObj.inst.GetType());
try
{
callsite.Target(callsite, clrObj.inst, PyObject.FromNullableReference(val));
Expand All @@ -130,7 +121,7 @@ public static int tp_setattro(BorrowedReference ob, BorrowedReference key, Borro
return 0;
}

private static bool HasNonDynamicMember(BorrowedReference ob, BorrowedReference key, out NewReference value, bool clearExceptions = false)
private static bool TryGetNonDynamicMember(BorrowedReference ob, BorrowedReference key, out NewReference value, bool clearExceptions = false)
{
value = Runtime.PyObject_GenericGetAttr(ob, key);
// If AttributeError was raised, we try to get the attribute from the managed object dynamic properties.
Expand Down

0 comments on commit 6402fa5

Please sign in to comment.