Commit 81e6c4fe authored by Tres Seaver's avatar Tres Seaver

Don't use __dict__ for BTrees objects in Python.

parent a3debcf3
...@@ -28,6 +28,7 @@ _marker = object() ...@@ -28,6 +28,7 @@ _marker = object()
class _Base(Persistent): class _Base(Persistent):
__slots__ = ()
_key_type = list _key_type = list
def __init__(self, items=None): def __init__(self, items=None):
...@@ -38,6 +39,11 @@ class _Base(Persistent): ...@@ -38,6 +39,11 @@ class _Base(Persistent):
class _BucketBase(_Base): class _BucketBase(_Base):
__slots__ = ('_keys',
'_next',
'_to_key',
)
def clear(self): def clear(self):
self._keys = self._key_type() self._keys = self._key_type()
self._next = None self._next = None
...@@ -148,6 +154,16 @@ class _BucketBase(_Base): ...@@ -148,6 +154,16 @@ class _BucketBase(_Base):
class _SetIteration(object): class _SetIteration(object):
__slots__ = ('to_iterate',
'useValues',
'_next',
'active',
'position',
'key',
'value',
)
def __init__(self, to_iterate, useValues=False, default=None): def __init__(self, to_iterate, useValues=False, default=None):
if to_iterate is None: if to_iterate is None:
to_iterate = () to_iterate = ()
...@@ -167,6 +183,7 @@ class _SetIteration(object): ...@@ -167,6 +183,7 @@ class _SetIteration(object):
self._next = itmeth().next self._next = itmeth().next
self.active = True self.active = True
self.position = 0 self.position = 0
self.key = _marker
self.value = default self.value = default
self.advance() self.advance()
...@@ -186,6 +203,7 @@ class _SetIteration(object): ...@@ -186,6 +203,7 @@ class _SetIteration(object):
class Bucket(_BucketBase): class Bucket(_BucketBase):
__slots__ = ()
_value_type = list _value_type = list
_to_value = lambda self, x: x _to_value = lambda self, x: x
VALUE_SAME_CHECK = False VALUE_SAME_CHECK = False
...@@ -479,6 +497,8 @@ class Bucket(_BucketBase): ...@@ -479,6 +497,8 @@ class Bucket(_BucketBase):
class Set(_BucketBase): class Set(_BucketBase):
__slots__ = ()
def add(self, key): def add(self, key):
return self._set(self._to_key(key))[0] return self._set(self._to_key(key))[0]
...@@ -670,7 +690,9 @@ class Set(_BucketBase): ...@@ -670,7 +690,9 @@ class Set(_BucketBase):
class _TreeItem(object): class _TreeItem(object):
__slots__ = 'key', 'child' __slots__ = ('key',
'child',
)
def __init__(self, key, child): def __init__(self, key, child):
self.key = key self.key = key
...@@ -679,6 +701,10 @@ class _TreeItem(object): ...@@ -679,6 +701,10 @@ class _TreeItem(object):
class _Tree(_Base): class _Tree(_Base):
__slots__ = ('_data',
'_firstbucket',
)
def setdefault(self, key, value): def setdefault(self, key, value):
return self._set(self._to_key(key), self._to_value(value), True)[1] return self._set(self._to_key(key), self._to_value(value), True)[1]
...@@ -1025,12 +1051,23 @@ def _get_simple_btree_bucket_state(state): ...@@ -1025,12 +1051,23 @@ def _get_simple_btree_bucket_state(state):
class _TreeItems(object): class _TreeItems(object):
__slots__ = ('firstbucket',
'itertype',
'iterargs',
'index',
'it',
'v',
'_len',
)
def __init__(self, firstbucket, itertype, iterargs): def __init__(self, firstbucket, itertype, iterargs):
self.firstbucket = firstbucket self.firstbucket = firstbucket
self.itertype = itertype self.itertype = itertype
self.iterargs = iterargs self.iterargs = iterargs
self.index = -1 self.index = -1
self.it = iter(self) self.it = iter(self)
self.v = None
self._len = None
def __getitem__(self, i): def __getitem__(self, i):
if isinstance(i, slice): if isinstance(i, slice):
...@@ -1054,9 +1091,7 @@ class _TreeItems(object): ...@@ -1054,9 +1091,7 @@ class _TreeItems(object):
return self.v return self.v
def __len__(self): def __len__(self):
try: if self._len is None:
return self._len
except AttributeError:
i = 0 i = 0
for _ in self: for _ in self:
i += 1 i += 1
...@@ -1082,6 +1117,8 @@ class _TreeItems(object): ...@@ -1082,6 +1117,8 @@ class _TreeItems(object):
class Tree(_Tree): class Tree(_Tree):
__slots__ = ()
def get(self, key, default=None): def get(self, key, default=None):
bucket = self._findbucket(key) bucket = self._findbucket(key)
if bucket: if bucket:
...@@ -1119,6 +1156,8 @@ class Tree(_Tree): ...@@ -1119,6 +1156,8 @@ class Tree(_Tree):
class TreeSet(_Tree): class TreeSet(_Tree):
__slots__ = ()
#_next = None #_next = None
def add(self, key): def add(self, key):
return self._set(self._to_key(key))[0] return self._set(self._to_key(key))[0]
...@@ -1138,6 +1177,10 @@ class TreeSet(_Tree): ...@@ -1138,6 +1177,10 @@ class TreeSet(_Tree):
class set_operation(object): class set_operation(object):
__slots__ = ('func',
'set_type',
)
def __init__(self, func, set_type): def __init__(self, func, set_type):
self.func = func self.func = func
self.set_type = set_type self.set_type = set_type
......
...@@ -398,9 +398,10 @@ class Test_SetIteration(unittest.TestCase): ...@@ -398,9 +398,10 @@ class Test_SetIteration(unittest.TestCase):
return self._getTargetClass()(to_iterate, useValues, default) return self._getTargetClass()(to_iterate, useValues, default)
def test_ctor_w_None(self): def test_ctor_w_None(self):
from .._base import _marker
si = self._makeOne(None) si = self._makeOne(None)
self.assertEqual(si.useValues, False) self.assertEqual(si.useValues, False)
self.failIf('key' in si.__dict__) self.assertTrue(si.key is _marker)
self.assertEqual(si.value, None) self.assertEqual(si.value, None)
self.assertEqual(si.active, False) self.assertEqual(si.active, False)
self.assertEqual(si.position, -1) self.assertEqual(si.position, -1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment