mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-115776: Embed the values array into the object, for "normal" Python objects. (GH-116115)
This commit is contained in:
parent
c97d3af239
commit
c32dc47aca
35 changed files with 787 additions and 537 deletions
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue