Skip to content

Commit 9ecd756

Browse files
committed
Further refinements to setattr logic on ModuleObjects
1 parent b2fa5cc commit 9ecd756

File tree

1 file changed

+11
-13
lines changed

1 file changed

+11
-13
lines changed

src/runtime/moduleobject.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ internal class ModuleObject : ExtensionType
2121
protected string _namespace;
2222
private IntPtr __all__ = IntPtr.Zero;
2323

24+
// Attributes to be set on the module according to PEP302 and 451
25+
// by the import machinery.
26+
static readonly HashSet<string> settableAttributes =
27+
new HashSet<string> {"__spec__", "__file__", "__name__", "__path__", "__loader__", "__package__"};
28+
2429
public ModuleObject(string name)
2530
{
2631
if (name == string.Empty)
@@ -363,22 +368,15 @@ public static int tp_clear(IntPtr ob)
363368
[ForbidPythonThreads]
364369
public new static int tp_setattro(IntPtr ob, IntPtr key, IntPtr val)
365370
{
366-
var self = (ModuleObject)ManagedType.GetManagedObject(ob);
367-
var dict = self.dict;
368-
369-
var current = Runtime.PyDict_GetItem(dict, key);
370-
if (current == val)
371-
{
372-
return 0;
373-
}
374-
else if (ManagedType.GetManagedObject(current) != null)
371+
var managedKey = Runtime.GetManagedString(key);
372+
if ((settableAttributes.Contains(managedKey)) ||
373+
(ManagedType.GetManagedObject(val)?.GetType() == typeof(ModuleObject)) )
375374
{
376-
var message = "Can't override a .NET object";
377-
Exceptions.SetError(Exceptions.AttributeError, message);
378-
return -1;
375+
var self = (ModuleObject)ManagedType.GetManagedObject(ob);
376+
return Runtime.PyDict_SetItem(self.dict, key, val);
379377
}
380378

381-
return Runtime.PyDict_SetItem(dict, key, val);
379+
return ExtensionType.tp_setattro(ob, key, val);
382380
}
383381

384382
protected override void OnSave(InterDomainContext context)

0 commit comments

Comments
 (0)