Skip to content

Commit 3b2c287

Browse files
committed
[GR-23218] Make test_descr pass - few more mro() fixes.
PullRequest: graalpython/1349
2 parents 59b08ed + dc6df5c commit 3b2c287

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descr.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@
106106
*graalpython.lib-python.3.test.test_descr.MroTest.test_reent_set_bases_on_base
107107
*graalpython.lib-python.3.test.test_descr.MroTest.test_reent_set_bases_on_direct_base
108108
*graalpython.lib-python.3.test.test_descr.MroTest.test_reent_set_bases_tp_base_cycle
109+
*graalpython.lib-python.3.test.test_descr.MroTest.test_tp_subclasses_cycle_error_return_path
110+
*graalpython.lib-python.3.test.test_descr.MroTest.test_tp_subclasses_cycle_in_update_slots
109111
*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_complexes
110112
*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_dicts
111113
*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_explicit_reverse_methods

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonManagedClass.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -241,12 +241,7 @@ public void setSuperClass(PythonAbstractClass... newBaseClasses) {
241241
}
242242

243243
try {
244-
for (PythonAbstractClass base : newBaseClasses) {
245-
if (base != null) {
246-
GetSubclassesNode.getUncached().execute(base).add(this);
247-
}
248-
}
249-
244+
// for what follows see also typeobject.c#type_set_bases()
250245
this.baseClasses = newBaseClasses;
251246
this.methodResolutionOrder.setInternalArrayObject(ComputeMroNode.doSlowPath(this));
252247
this.methodResolutionOrder.lookupChanged();
@@ -258,6 +253,20 @@ public void setSuperClass(PythonAbstractClass... newBaseClasses) {
258253
pmc.methodResolutionOrder.lookupChanged();
259254
}
260255
}
256+
if (this.baseClasses == newBaseClasses) {
257+
// take no action if bases were replaced through reentrance
258+
for (PythonAbstractClass base : oldBaseClasses) {
259+
if (base instanceof PythonManagedClass) {
260+
GetSubclassesNode.getUncached().execute(base).remove(this);
261+
}
262+
}
263+
for (PythonAbstractClass base : newBaseClasses) {
264+
if (base instanceof PythonManagedClass) {
265+
GetSubclassesNode.getUncached().execute(base).add(this);
266+
}
267+
}
268+
}
269+
261270
} catch (PException pe) {
262271
// undo
263272
for (int i = 0; i < newBaseClasses.length; i++) {
@@ -268,8 +277,12 @@ public void setSuperClass(PythonAbstractClass... newBaseClasses) {
268277
s.addAll(newBasesSubclasses.get(i));
269278
}
270279
}
271-
272-
this.baseClasses = oldBaseClasses;
280+
if (this.baseClasses == newBaseClasses) {
281+
// take no action if bases were replaced through reentrance
282+
// revert only if set in this call
283+
// e.g. the mro() call might have manipulated __bases__
284+
this.baseClasses = oldBaseClasses;
285+
}
273286
this.methodResolutionOrder.setInternalArrayObject(oldMRO);
274287
this.methodResolutionOrder.lookupChanged();
275288

0 commit comments

Comments
 (0)