@@ -841,7 +841,12 @@ def __init__(self, obj):
841841
842842from _testinternalcapi import has_inline_values
843843
844- Py_TPFLAGS_MANAGED_DICT = (1 << 2 )
844+ Py_TPFLAGS_INLINE_VALUES = (1 << 2 )
845+ Py_TPFLAGS_MANAGED_DICT = (1 << 4 )
846+
847+ class NoManagedDict :
848+ __slots__ = ('a' ,)
849+
845850
846851class Plain :
847852 pass
@@ -856,11 +861,31 @@ def __init__(self):
856861 self .d = 4
857862
858863
864+ class VarSizedSubclass (tuple ):
865+ pass
866+
867+
859868class TestInlineValues (unittest .TestCase ):
860869
861- def test_flags (self ):
862- self .assertEqual (Plain .__flags__ & Py_TPFLAGS_MANAGED_DICT , Py_TPFLAGS_MANAGED_DICT )
863- self .assertEqual (WithAttrs .__flags__ & Py_TPFLAGS_MANAGED_DICT , Py_TPFLAGS_MANAGED_DICT )
870+ def test_no_flags_for_slots_class (self ):
871+ flags = NoManagedDict .__flags__
872+ self .assertEqual (flags & Py_TPFLAGS_MANAGED_DICT , 0 )
873+ self .assertEqual (flags & Py_TPFLAGS_INLINE_VALUES , 0 )
874+ self .assertFalse (has_inline_values (NoManagedDict ()))
875+
876+ def test_both_flags_for_regular_class (self ):
877+ for cls in (Plain , WithAttrs ):
878+ with self .subTest (cls = cls .__name__ ):
879+ flags = cls .__flags__
880+ self .assertEqual (flags & Py_TPFLAGS_MANAGED_DICT , Py_TPFLAGS_MANAGED_DICT )
881+ self .assertEqual (flags & Py_TPFLAGS_INLINE_VALUES , Py_TPFLAGS_INLINE_VALUES )
882+ self .assertTrue (has_inline_values (cls ()))
883+
884+ def test_managed_dict_only_for_varsized_subclass (self ):
885+ flags = VarSizedSubclass .__flags__
886+ self .assertEqual (flags & Py_TPFLAGS_MANAGED_DICT , Py_TPFLAGS_MANAGED_DICT )
887+ self .assertEqual (flags & Py_TPFLAGS_INLINE_VALUES , 0 )
888+ self .assertFalse (has_inline_values (VarSizedSubclass ()))
864889
865890 def test_has_inline_values (self ):
866891 c = Plain ()
0 commit comments