Skip to content

Commit 4c6f3d5

Browse files
committed
on setSuperClass fix subclasses in old base classes
1 parent 11c785d commit 4c6f3d5

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ public void setSuperClass(PythonAbstractClass... newBaseClasses) {
230230
PythonAbstractClass[] oldBaseClasses = getBaseClasses();
231231
Object[] oldMRO = this.methodResolutionOrder.getInternalArray();
232232

233-
Set<PythonAbstractClass> subclasses = GetSubclassesNode.getUncached().execute(this);
233+
Set<PythonAbstractClass> subclasses = getSubClasses();
234234
PythonAbstractClass[] subclassesArray = subclasses.toArray(new PythonAbstractClass[subclasses.size()]);
235235
Object[][] oldSubClasssMROs = new Object[subclasses.size()][];
236236
for (int i = 0; i < subclassesArray.length; i++) {
@@ -251,13 +251,22 @@ public void setSuperClass(PythonAbstractClass... newBaseClasses) {
251251
this.methodResolutionOrder.setInternalArrayObject(ComputeMroNode.doSlowPath(this));
252252
this.methodResolutionOrder.lookupChanged();
253253

254+
if (this.baseClasses == newBaseClasses) {
255+
// take no action if bases were replaced through reentrance
254256
for (PythonAbstractClass scls : subclasses) {
255257
if (scls instanceof PythonManagedClass) {
256258
PythonManagedClass pmc = (PythonManagedClass) scls;
257259
pmc.methodResolutionOrder.setInternalArrayObject(ComputeMroNode.doSlowPath(scls));
258260
pmc.methodResolutionOrder.lookupChanged();
259261
}
260262
}
263+
for (PythonAbstractClass obc : oldBaseClasses) {
264+
if (obc instanceof PythonManagedClass) {
265+
((PythonManagedClass) obc).getSubClasses().remove(this);
266+
}
267+
}
268+
}
269+
261270
} catch (PException pe) {
262271
// undo
263272
for (int i = 0; i < newBaseClasses.length; i++) {

0 commit comments

Comments
 (0)