57
57
import com .oracle .truffle .api .strings .TruffleString ;
58
58
59
59
public abstract class PythonManagedClass extends PythonObject implements PythonAbstractClass {
60
- private final Object base ;
60
+ @ CompilationFinal private Object base ;
61
61
@ CompilationFinal (dimensions = 1 ) private PythonAbstractClass [] baseClasses ;
62
62
63
63
@ CompilationFinal private MroSequenceStorage methodResolutionOrder ;
@@ -282,12 +282,13 @@ private void unsafeSetSuperClass(PythonAbstractClass... newBaseClasses) {
282
282
}
283
283
284
284
@ TruffleBoundary
285
- public final void setSuperClass ( PythonAbstractClass ... newBaseClasses ) {
285
+ public final void setBases ( Object newBaseClass , PythonAbstractClass [] newBaseClasses ) {
286
286
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 ));
289
289
}
290
290
291
+ Object oldBase = getBase ();
291
292
PythonAbstractClass [] oldBaseClasses = getBaseClasses ();
292
293
PythonAbstractClass [] oldMRO = (PythonAbstractClass []) this .methodResolutionOrder .getInternalArray ();
293
294
@@ -303,6 +304,7 @@ public final void setSuperClass(PythonAbstractClass... newBaseClasses) {
303
304
304
305
try {
305
306
// for what follows see also typeobject.c#type_set_bases()
307
+ this .base = newBaseClass ;
306
308
this .baseClasses = newBaseClasses ;
307
309
this .methodResolutionOrder .lookupChanged ();
308
310
this .setMRO (ComputeMroNode .doSlowPath (this ));
@@ -342,6 +344,7 @@ public final void setSuperClass(PythonAbstractClass... newBaseClasses) {
342
344
// take no action if bases were replaced through reentrance
343
345
// revert only if set in this call
344
346
// e.g. the mro() call might have manipulated __bases__
347
+ this .base = oldBase ;
345
348
this .baseClasses = oldBaseClasses ;
346
349
}
347
350
this .methodResolutionOrder .lookupChanged ();
0 commit comments