@@ -859,7 +859,12 @@ def __init__(self, arg):
859859
860860from _testinternalcapi import has_inline_values
861861
862- Py_TPFLAGS_MANAGED_DICT = (1 << 2 )
862+ Py_TPFLAGS_INLINE_VALUES = (1 << 2 )
863+ Py_TPFLAGS_MANAGED_DICT = (1 << 4 )
864+
865+ class NoManagedDict :
866+ __slots__ = ('a' ,)
867+
863868
864869class Plain :
865870 pass
@@ -874,11 +879,31 @@ def __init__(self):
874879 self .d = 4
875880
876881
882+ class VarSizedSubclass (tuple ):
883+ pass
884+
885+
877886class TestInlineValues (unittest .TestCase ):
878887
879- def test_flags (self ):
880- self .assertEqual (Plain .__flags__ & Py_TPFLAGS_MANAGED_DICT , Py_TPFLAGS_MANAGED_DICT )
881- self .assertEqual (WithAttrs .__flags__ & Py_TPFLAGS_MANAGED_DICT , Py_TPFLAGS_MANAGED_DICT )
888+ def test_no_flags_for_slots_class (self ):
889+ flags = NoManagedDict .__flags__
890+ self .assertEqual (flags & Py_TPFLAGS_MANAGED_DICT , 0 )
891+ self .assertEqual (flags & Py_TPFLAGS_INLINE_VALUES , 0 )
892+ self .assertFalse (has_inline_values (NoManagedDict ()))
893+
894+ def test_both_flags_for_regular_class (self ):
895+ for cls in (Plain , WithAttrs ):
896+ with self .subTest (cls = cls .__name__ ):
897+ flags = cls .__flags__
898+ self .assertEqual (flags & Py_TPFLAGS_MANAGED_DICT , Py_TPFLAGS_MANAGED_DICT )
899+ self .assertEqual (flags & Py_TPFLAGS_INLINE_VALUES , Py_TPFLAGS_INLINE_VALUES )
900+ self .assertTrue (has_inline_values (cls ()))
901+
902+ def test_managed_dict_only_for_varsized_subclass (self ):
903+ flags = VarSizedSubclass .__flags__
904+ self .assertEqual (flags & Py_TPFLAGS_MANAGED_DICT , Py_TPFLAGS_MANAGED_DICT )
905+ self .assertEqual (flags & Py_TPFLAGS_INLINE_VALUES , 0 )
906+ self .assertFalse (has_inline_values (VarSizedSubclass ()))
882907
883908 def test_has_inline_values (self ):
884909 c = Plain ()
0 commit comments