@@ -604,33 +604,35 @@ public static double expectDouble(Object result) throws UnexpectedResultExceptio
604
604
throw new UnexpectedResultException (result );
605
605
}
606
606
607
- public static boolean isBuiltinDict (PythonObject dict ) {
607
+ private static boolean isBuiltinImmutableTypeInstance (PythonObject dict , PythonBuiltinClassType type ) {
608
608
/*
609
- * dict's __class__ cannot be reassigned and other objects cannot have their class assigned
610
- * to builtin dict, so it is enough to look at the initial class. PDict constructor ensures
611
- * that it cannot be PythonBuiltinClass.
609
+ * Immutable types' __class__ cannot be reassigned and other objects cannot have their class
610
+ * assigned to immutable types, so it is enough to look at the initial class. The Java
611
+ * constructor of the object must ensure that it cannot be PythonBuiltinClass, see PDict for
612
+ * an example.
612
613
*/
613
- return dict .getInitialPythonClass () == PythonBuiltinClassType .PDict ;
614
+ assert !(dict .getInitialPythonClass () instanceof PythonBuiltinClass pbc ) || pbc .getType () != type ;
615
+ return dict .getInitialPythonClass () == type ;
616
+ }
617
+
618
+ public static boolean isBuiltinDict (PythonObject dict ) {
619
+ return isBuiltinImmutableTypeInstance (dict , PythonBuiltinClassType .PDict );
614
620
}
615
621
616
622
public static boolean isBuiltinTuple (PythonObject tuple ) {
617
- // See isBuiltinDict for explanation
618
- return tuple .getInitialPythonClass () == PythonBuiltinClassType .PTuple ;
623
+ return isBuiltinImmutableTypeInstance (tuple , PythonBuiltinClassType .PTuple );
619
624
}
620
625
621
626
public static boolean isBuiltinList (PythonObject list ) {
622
- // See isBuiltinDict for explanation
623
- return list .getInitialPythonClass () == PythonBuiltinClassType .PList ;
627
+ return isBuiltinImmutableTypeInstance (list , PythonBuiltinClassType .PList );
624
628
}
625
629
626
630
public static boolean isBuiltinSet (PythonObject set ) {
627
- // See isBuiltinDict for explanation
628
- return set .getInitialPythonClass () == PythonBuiltinClassType .PSet ;
631
+ return isBuiltinImmutableTypeInstance (set , PythonBuiltinClassType .PSet );
629
632
}
630
633
631
634
public static boolean isBuiltinFrozenSet (PythonObject frozenSet ) {
632
- // See isBuiltinDict for explanation
633
- return frozenSet .getInitialPythonClass () == PythonBuiltinClassType .PFrozenSet ;
635
+ return isBuiltinImmutableTypeInstance (frozenSet , PythonBuiltinClassType .PFrozenSet );
634
636
}
635
637
636
638
public static boolean isBuiltinAnySet (PythonObject set ) {
@@ -642,18 +644,15 @@ public static boolean isBuiltinHashingCollection(PythonObject hashingCollection)
642
644
}
643
645
644
646
public static boolean isBuiltinPString (PString string ) {
645
- // See isBuiltinDict for explanation
646
- return string .getInitialPythonClass () == PythonBuiltinClassType .PString ;
647
+ return isBuiltinImmutableTypeInstance (string , PythonBuiltinClassType .PString );
647
648
}
648
649
649
650
public static boolean isBuiltinBytes (PythonObject bytes ) {
650
- // See isBuiltinDict for explanation
651
- return bytes .getInitialPythonClass () == PythonBuiltinClassType .PBytes ;
651
+ return isBuiltinImmutableTypeInstance (bytes , PythonBuiltinClassType .PBytes );
652
652
}
653
653
654
654
public static boolean isBuiltinByteArray (PythonObject byteArray ) {
655
- // See isBuiltinDict for explanation
656
- return byteArray .getInitialPythonClass () == PythonBuiltinClassType .PByteArray ;
655
+ return isBuiltinImmutableTypeInstance (byteArray , PythonBuiltinClassType .PByteArray );
657
656
}
658
657
659
658
public static boolean isBuiltinBytesLike (PythonObject object ) {
0 commit comments