summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_capi/test_mem.py4
-rw-r--r--Lib/test/test_class.py77
-rw-r--r--Lib/test/test_opcache.py13
3 files changed, 79 insertions, 15 deletions
diff --git a/Lib/test/test_capi/test_mem.py b/Lib/test/test_capi/test_mem.py
index 04f17a9..1958ecc 100644
--- a/Lib/test/test_capi/test_mem.py
+++ b/Lib/test/test_capi/test_mem.py
@@ -148,8 +148,8 @@ class PyMemDebugTests(unittest.TestCase):
self.assertIn(b'MemoryError', out)
*_, count = line.split(b' ')
count = int(count)
- self.assertLessEqual(count, i*5)
- self.assertGreaterEqual(count, i*5-2)
+ self.assertLessEqual(count, i*10)
+ self.assertGreaterEqual(count, i*10-4)
# Py_GIL_DISABLED requires mimalloc (not malloc)
diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py
index 0cf0624..4c18141 100644
--- a/Lib/test/test_class.py
+++ b/Lib/test/test_class.py
@@ -2,7 +2,6 @@
import unittest
-
testmeths = [
# Binary operations
@@ -789,5 +788,81 @@ class ClassTests(unittest.TestCase):
self.assertEqual(calls, 100)
+from _testinternalcapi import has_inline_values
+
+Py_TPFLAGS_MANAGED_DICT = (1 << 2)
+
+class Plain:
+ pass
+
+
+class WithAttrs:
+
+ def __init__(self):
+ self.a = 1
+ self.b = 2
+ self.c = 3
+ self.d = 4
+
+
+class TestInlineValues(unittest.TestCase):
+
+ def test_flags(self):
+ self.assertEqual(Plain.__flags__ & Py_TPFLAGS_MANAGED_DICT, Py_TPFLAGS_MANAGED_DICT)
+ self.assertEqual(WithAttrs.__flags__ & Py_TPFLAGS_MANAGED_DICT, Py_TPFLAGS_MANAGED_DICT)
+
+ def test_has_inline_values(self):
+ c = Plain()
+ self.assertTrue(has_inline_values(c))
+ del c.__dict__
+ self.assertFalse(has_inline_values(c))
+
+ def test_instances(self):
+ self.assertTrue(has_inline_values(Plain()))
+ self.assertTrue(has_inline_values(WithAttrs()))
+
+ def test_inspect_dict(self):
+ for cls in (Plain, WithAttrs):
+ c = cls()
+ c.__dict__
+ self.assertTrue(has_inline_values(c))
+
+ def test_update_dict(self):
+ d = { "e": 5, "f": 6 }
+ for cls in (Plain, WithAttrs):
+ c = cls()
+ c.__dict__.update(d)
+ self.assertTrue(has_inline_values(c))
+
+ @staticmethod
+ def set_100(obj):
+ for i in range(100):
+ setattr(obj, f"a{i}", i)
+
+ def check_100(self, obj):
+ for i in range(100):
+ self.assertEqual(getattr(obj, f"a{i}"), i)
+
+ def test_many_attributes(self):
+ class C: pass
+ c = C()
+ self.assertTrue(has_inline_values(c))
+ self.set_100(c)
+ self.assertFalse(has_inline_values(c))
+ self.check_100(c)
+ c = C()
+ self.assertTrue(has_inline_values(c))
+
+ def test_many_attributes_with_dict(self):
+ class C: pass
+ c = C()
+ d = c.__dict__
+ self.assertTrue(has_inline_values(c))
+ self.set_100(c)
+ self.assertFalse(has_inline_values(c))
+ self.check_100(c)
+
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/Lib/test/test_opcache.py b/Lib/test/test_opcache.py
index 5fb4b81..8829c9a 100644
--- a/Lib/test/test_opcache.py
+++ b/Lib/test/test_opcache.py
@@ -1044,20 +1044,13 @@ class TestInstanceDict(unittest.TestCase):
c.a = 1
c.b = 2
c.__dict__
- self.assertIs(
- _testinternalcapi.get_object_dict_values(c),
- None
- )
+ self.assertEqual(c.__dict__, {"a":1, "b": 2})
def test_dict_dematerialization(self):
c = C()
c.a = 1
c.b = 2
c.__dict__
- self.assertIs(
- _testinternalcapi.get_object_dict_values(c),
- None
- )
for _ in range(100):
c.a
self.assertEqual(
@@ -1072,10 +1065,6 @@ class TestInstanceDict(unittest.TestCase):
d = c.__dict__
for _ in range(100):
c.a
- self.assertIs(
- _testinternalcapi.get_object_dict_values(c),
- None
- )
self.assertIs(c.__dict__, d)
def test_dict_dematerialization_copy(self):