Skip to content

Commit ceec7e0

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

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

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

Lines changed: 15 additions & 15 deletions
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 = getSubClasses();
233+
Set<PythonAbstractClass> subclasses = GetSubclassesNode.getUncached().execute(this);
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++) {
@@ -241,28 +241,28 @@ 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();
253248

249+
for (PythonAbstractClass scls : subclasses) {
250+
if (scls instanceof PythonManagedClass) {
251+
PythonManagedClass pmc = (PythonManagedClass) scls;
252+
pmc.methodResolutionOrder.setInternalArrayObject(ComputeMroNode.doSlowPath(scls));
253+
pmc.methodResolutionOrder.lookupChanged();
254+
}
255+
}
254256
if (this.baseClasses == newBaseClasses) {
255257
// take no action if bases were replaced through reentrance
256-
for (PythonAbstractClass scls : subclasses) {
257-
if (scls instanceof PythonManagedClass) {
258-
PythonManagedClass pmc = (PythonManagedClass) scls;
259-
pmc.methodResolutionOrder.setInternalArrayObject(ComputeMroNode.doSlowPath(scls));
260-
pmc.methodResolutionOrder.lookupChanged();
258+
for (PythonAbstractClass base : oldBaseClasses) {
259+
if (base instanceof PythonManagedClass) {
260+
GetSubclassesNode.getUncached().execute(base).remove(this);
261261
}
262262
}
263-
for (PythonAbstractClass obc : oldBaseClasses) {
264-
if (obc instanceof PythonManagedClass) {
265-
((PythonManagedClass) obc).getSubClasses().remove(this);
263+
for (PythonAbstractClass base : newBaseClasses) {
264+
if (base instanceof PythonManagedClass) {
265+
GetSubclassesNode.getUncached().execute(base).add(this);
266266
}
267267
}
268268
}

0 commit comments

Comments
 (0)