Skip to content

Commit 5cdf800

Browse files
msimaceksteve-s
authored andcommitted
Fix setting __bases__
1 parent 896cab1 commit 5cdf800

File tree

3 files changed

+11
-6
lines changed

3 files changed

+11
-6
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOModuleBuiltins.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
import com.oracle.graal.python.builtins.modules.io.IONodes.IOMode;
8686
import com.oracle.graal.python.builtins.objects.PNone;
8787
import com.oracle.graal.python.builtins.objects.object.PythonObject;
88+
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
8889
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
8990
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
9091
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -132,7 +133,8 @@ public void initialize(Python3Core core) {
132133
addBuiltinConstant("SEEK_END", SEEK_END);
133134
addBuiltinConstant("DEFAULT_BUFFER_SIZE", DEFAULT_BUFFER_SIZE);
134135
PythonBuiltinClass unsupportedOpExcType = core.lookupType(IOUnsupportedOperation);
135-
unsupportedOpExcType.setSuperClass(core.lookupType(OSError), core.lookupType(ValueError));
136+
PythonBuiltinClass osError = core.lookupType(OSError);
137+
unsupportedOpExcType.setBases(osError, new PythonAbstractClass[]{osError, core.lookupType(ValueError)});
136138
addBuiltinConstant(IOUnsupportedOperation.getName(), unsupportedOpExcType);
137139
addBuiltinConstant(BlockingIOError.getName(), core.lookupType(BlockingIOError));
138140

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
import com.oracle.truffle.api.strings.TruffleString;
5858

5959
public abstract class PythonManagedClass extends PythonObject implements PythonAbstractClass {
60-
private final Object base;
60+
@CompilationFinal private Object base;
6161
@CompilationFinal(dimensions = 1) private PythonAbstractClass[] baseClasses;
6262

6363
@CompilationFinal private MroSequenceStorage methodResolutionOrder;
@@ -282,12 +282,13 @@ private void unsafeSetSuperClass(PythonAbstractClass... newBaseClasses) {
282282
}
283283

284284
@TruffleBoundary
285-
public final void setSuperClass(PythonAbstractClass... newBaseClasses) {
285+
public final void setBases(Object newBaseClass, PythonAbstractClass[] newBaseClasses) {
286286
ArrayList<Set<PythonAbstractClass>> newBasesSubclasses = new ArrayList<>(newBaseClasses.length);
287-
for (PythonAbstractClass newBase : newBaseClasses) {
288-
newBasesSubclasses.add(GetSubclassesNode.executeUncached(newBase));
287+
for (PythonAbstractClass type : newBaseClasses) {
288+
newBasesSubclasses.add(GetSubclassesNode.executeUncached(type));
289289
}
290290

291+
Object oldBase = getBase();
291292
PythonAbstractClass[] oldBaseClasses = getBaseClasses();
292293
PythonAbstractClass[] oldMRO = (PythonAbstractClass[]) this.methodResolutionOrder.getInternalArray();
293294

@@ -303,6 +304,7 @@ public final void setSuperClass(PythonAbstractClass... newBaseClasses) {
303304

304305
try {
305306
// for what follows see also typeobject.c#type_set_bases()
307+
this.base = newBaseClass;
306308
this.baseClasses = newBaseClasses;
307309
this.methodResolutionOrder.lookupChanged();
308310
this.setMRO(ComputeMroNode.doSlowPath(this));
@@ -342,6 +344,7 @@ public final void setSuperClass(PythonAbstractClass... newBaseClasses) {
342344
// take no action if bases were replaced through reentrance
343345
// revert only if set in this call
344346
// e.g. the mro() call might have manipulated __bases__
347+
this.base = oldBase;
345348
this.baseClasses = oldBaseClasses;
346349
}
347350
this.methodResolutionOrder.lookupChanged();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ Object setBases(VirtualFrame frame, PythonClass cls, PTuple value,
868868
Object oldBase = getBase.execute(inliningTarget, cls);
869869
checkCompatibleForAssigment.execute(frame, oldBase, newBestBase);
870870

871-
cls.setSuperClass(baseClasses);
871+
cls.setBases(newBestBase, baseClasses);
872872
SpecialMethodSlot.reinitializeSpecialMethodSlots(cls, getLanguage());
873873

874874
return PNone.NONE;

0 commit comments

Comments
 (0)