@@ -2341,19 +2341,28 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
23412341 // have slots
23422342
23432343 // Make it into a list
2344- SequenceStorage slotList ;
2344+ SequenceStorage slotsStorage ;
2345+ Object slotsObject ;
23452346 if (slots instanceof String ) {
2346- slotList = factory ().createList (new Object []{slots }).getSequenceStorage ();
2347+ slotsObject = factory ().createList (new Object []{slots });
2348+ slotsStorage = ((PList ) slotsObject ).getSequenceStorage ();
2349+ } else if (slots instanceof PTuple ) {
2350+ slotsObject = slots ;
2351+ slotsStorage = ((PTuple ) slots ).getSequenceStorage ();
2352+ } else if (slots instanceof PList ) {
2353+ slotsObject = slots ;
2354+ slotsStorage = ((PList ) slots ).getSequenceStorage ();
23472355 } else {
2348- slotList = getCastToListNode ().execute (frame , slots ).getSequenceStorage ();
2356+ slotsObject = getCastToListNode ().execute (frame , slots );
2357+ slotsStorage = ((PList ) slotsObject ).getSequenceStorage ();
23492358 }
2350- int slotlen = getListLenNode ().execute (slotList );
2359+ int slotlen = getListLenNode ().execute (slotsStorage );
23512360 // TODO: tfel - check if slots are allowed. They are not if the base class is var
23522361 // sized
23532362
23542363 for (int i = 0 ; i < slotlen ; i ++) {
23552364 String slotName ;
2356- Object element = getSlotItemNode ().execute (frame , slotList , i );
2365+ Object element = getSlotItemNode ().execute (frame , slotsStorage , i );
23572366 // Check valid slot name
23582367 if (element instanceof String ) {
23592368 slotName = (String ) element ;
@@ -2378,13 +2387,15 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
23782387 PythonContext context = getContextRef ().get ();
23792388 Object state = ForeignCallContext .enter (frame , context , this );
23802389 try {
2381- PTuple newSlots = copySlots (name , slotList , slotlen , addDict , false , namespace , nslib );
2382- pythonClass .setAttribute (__SLOTS__ , newSlots );
2390+ pythonClass .setAttribute (__SLOTS__ , slotsObject );
23832391 if (basesArray .length > 1 ) {
23842392 // TODO: tfel - check if secondary bases provide weakref or dict when we
23852393 // don't already have one
23862394 }
23872395
2396+ // checks for some name errors too
2397+ PTuple newSlots = copySlots (name , slotsStorage , slotlen , addDict , false , namespace , nslib );
2398+
23882399 // add native slot descriptors
23892400 if (pythonClass .needsNativeAllocation ()) {
23902401 addNativeSlots (pythonClass , newSlots );
0 commit comments