[pypy-svn] r31332 - pypy/dist/pypy/objspace/std
mwh at codespeak.net
mwh at codespeak.net
Wed Aug 16 11:26:19 CEST 2006
Author: mwh
Date: Wed Aug 16 11:26:18 2006
New Revision: 31332
Modified:
pypy/dist/pypy/objspace/std/dictmultiobject.py
Log:
streamline DictImplementation interface.
Modified: pypy/dist/pypy/objspace/std/dictmultiobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/dictmultiobject.py (original)
+++ pypy/dist/pypy/objspace/std/dictmultiobject.py Wed Aug 16 11:26:18 2006
@@ -5,21 +5,15 @@
class DictImplementation(object):
-## def getitem(self, w_key):
-## pass
+## def get(self, w_lookup):
+## return w_value or None
## def setitem(self, w_key, w_value):
-## pass
+## return implementation
## def delitem(self, w_key):
-## pass
+## return implementation
## def length(self):
## pass
-## def clear(self, w_dict):
-## pass
-## def has_key(self, w_lookup):
-## pass
-## def get(self, w_lookup, w_default):
-## pass
## def iteritems(self):
## pass
@@ -39,21 +33,15 @@
def __init__(self, space):
self.space = space
- def getitem(self, w_key):
- raise KeyError
+ def get(self, w_lookup):
+ return None
def setitem(self, w_key, w_value):
- return SmallDictImplementation(self.space).setitem(w_key, w_value)
+ return SmallDictImplementation(self.space, w_key, w_value)
def delitem(self, w_key):
raise KeyError
def length(self):
return 0
- def clear(self):
- return self
- def has_key(self, w_lookup):
- return False
- def get(self, w_lookup, w_default):
- return w_default
def iteritems(self):
return RDictImplementation(self.space).iteritems()
@@ -80,16 +68,19 @@
class SmallDictImplementation(DictImplementation):
# XXX document the invariants here!
- def __init__(self, space):
+ def __init__(self, space, w_key, w_value):
self.space = space
self.entries = [Entry(), Entry(), Entry(), Entry(), Entry()]
- self.valid = 0
+ self.entries[0].hash = space.hash_w(w_key)
+ self.entries[0].w_key = w_key
+ self.entries[0].w_value = w_value
+ self.valid = 1
def _lookup(self, w_key):
- for i in range(self.valid):
- assert self.entries[i].w_value is not None
- for i in range(self.valid+1, 5):
- assert self.entries[i].w_value is None
+## for i in range(self.valid):
+## assert self.entries[i].w_value is not None
+## for i in range(self.valid+1, 5):
+## assert self.entries[i].w_value is None
hash = self.space.hash_w(w_key)
i = 0
last = self.entries[self.valid]
@@ -112,12 +103,6 @@
i += 1
return newimpl
- def getitem(self, w_key):
- entry = self._lookup(w_key)
- if entry.w_value:
- return entry.w_value
- else:
- raise KeyError
def setitem(self, w_key, w_value):
if self.valid == 4:
return self._convert_to_rdict().setitem(w_key, w_value)
@@ -140,17 +125,8 @@
def length(self):
return self.valid
- def clear(self):
- return EmptyDictImplementation(self.space)
- def has_key(self, w_lookup):
- return self._lookup(w_lookup).w_value is not None
- def get(self, w_lookup, w_default):
- entry = self._lookup(w_lookup)
- w_value = entry.w_value
- if w_value:
- return w_value
- else:
- return w_default
+ def get(self, w_lookup):
+ return self._lookup(w_lookup).w_value
def iteritems(self):
return self._convert_to_rdict().iteritems()
@@ -174,8 +150,6 @@
def __repr__(self):
return "%s<%s>" % (self.__class__.__name__, self.content)
- def getitem(self, w_key):
- return self.content[w_key]
def setitem(self, w_key, w_value):
self.content[w_key] = w_value
return self
@@ -188,12 +162,8 @@
def length(self):
return len(self.content)
- def clear(self):
- return EmptyDictImplementation(self.space)
- def has_key(self, w_lookup):
- return w_lookup in self.content
- def get(self, w_lookup, w_default):
- return self.content.get(w_lookup, w_default)
+ def get(self, w_lookup):
+ return self.content.get(w_lookup, None)
def iteritems(self):
return self.content.iteritems()
@@ -216,8 +186,8 @@
def __init__(self):
self.id = len(self._dict_infos)
- self.getitems = 0; self.setitems = 0; self.delitems = 0
- self.lengths = 0; self.clears = 0; self.has_keys = 0; self.gets = 0
+ self.setitems = 0; self.delitems = 0
+ self.lengths = 0; self.gets = 0
self.iteritems = 0; self.iterkeys = 0; self.itervalues = 0
self.keys = 0; self.values = 0; self.items = 0
@@ -292,10 +262,6 @@
else:
self.info.misses += 1
- def getitem(self, w_key):
- self.info.getitems += 1
- self._read(w_key)
- return self.content[w_key]
def setitem(self, w_key, w_value):
if not self.info.seen_non_string_in_write and not self._is_str(w_key):
self.info.seen_non_string_in_write = True
@@ -319,15 +285,6 @@
def length(self):
self.info.lengths += 1
return len(self.content)
- def clear(self):
- self.info.clears += 1
- self.info.writes += 1
- self.content.clear()
- return self
- def has_key(self, w_lookup):
- self.info.has_keys += 1
- self._read(w_lookup)
- return w_lookup in self.content
def get(self, w_lookup, w_default):
self.info.gets += 1
self._read(w_lookup)
@@ -414,7 +371,11 @@
return w_self.implementation.length()
def get(w_dict, w_key, w_default):
- return w_dict.implementation.get(w_key, w_default)
+ w_value = w_dict.implementation.get(w_key)
+ if w_value is not None:
+ return w_value
+ else:
+ return w_default
def set_str_keyed_item(w_dict, w_key, w_value):
w_dict.implementation = w_dict.implementation.setitem(w_key, w_value)
@@ -426,7 +387,7 @@
w_src, w_kwds = __args__.parse('dict',
(['seq_or_map'], None, 'kwargs'), # signature
[W_DictMultiObject(space)]) # default argument
- # w_dict.implementation = w_dict.implementation.clear()
+ # w_dict.implementation = EmptyDictImplementation(self.space)
# ^^^ disabled only for CPython compatibility
try:
space.getattr(w_src, space.wrap("keys"))
@@ -448,10 +409,10 @@
dict_update__ANY_ANY(space, w_dict, w_kwds)
def getitem__DictMulti_ANY(space, w_dict, w_lookup):
- try:
- return w_dict.implementation.getitem(w_lookup)
- except KeyError:
- raise OperationError(space.w_KeyError, w_lookup)
+ w_value = w_dict.implementation.get(w_lookup)
+ if w_value is not None:
+ return w_value
+ raise OperationError(space.w_KeyError, w_lookup)
def setitem__DictMulti_ANY_ANY(space, w_dict, w_newkey, w_newvalue):
w_dict.implementation = w_dict.implementation.setitem(w_newkey, w_newvalue)
@@ -466,7 +427,7 @@
return space.wrap(w_dict.implementation.length())
def contains__DictMulti_ANY(space, w_dict, w_lookup):
- return space.newbool(w_dict.implementation.has_key(w_lookup))
+ return space.newbool(w_dict.implementation.get(w_lookup) is not None)
dict_has_key__DictMulti_ANY = contains__DictMulti_ANY
@@ -480,9 +441,8 @@
if w_left.implementation.length() != w_right.implementation.length():
return space.w_False
for w_key, w_val in w_left.implementation.iteritems():
- try:
- w_rightval = w_right.implementation.getitem(w_key)
- except KeyError:
+ w_rightval = w_right.implementation.get(w_key)
+ if w_rightval is None:
return space.w_False
if not space.eq_w(w_val, w_rightval):
return space.w_False
@@ -495,9 +455,8 @@
w_its_value = None
for w_key, w_val in aimpl.iteritems():
if w_smallest_diff_a_key is None or space.is_true(space.lt(w_key, w_smallest_diff_a_key)):
- try:
- w_bvalue = bimpl.getitem(w_key)
- except KeyError:
+ w_bvalue = bimpl.get(w_key)
+ if w_bvalue is None:
w_its_value = w_val
w_smallest_diff_a_key = w_key
else:
@@ -555,10 +514,10 @@
return W_DictMultiIter_Values(space, w_self.implementation)
def dict_clear__DictMulti(space, w_self):
- w_self.implementation = w_self.implementation.clear()
+ w_self.implementation = EmptyDictImplementation(space)
def dict_get__DictMulti_ANY_ANY(space, w_dict, w_lookup, w_default):
- return w_dict.implementation.get(w_lookup, w_default)
+ return w_dict.get(w_lookup, w_default)
app = gateway.applevel('''
def dictrepr(currently_in_repr, d):
More information about the Pypy-commit
mailing list